需要准备的东西如下:

应用私钥,支付宝公钥,应用公钥证书、支付宝公钥证书、支付宝根证书, 应用的appId,每个应用的appId都有对应的秘钥证书的

通过支付宝开放平台开发助手app获取秘钥(公钥、私钥),然后拿公钥去支付宝开放平台获取支付宝公钥

如果还需要加签成证书,那么就得到应用公钥证书和支付宝公钥证书 应用证书是可以解析应用公钥的,

注意: 应用私钥请妥善保管,忘记了只能重新提取,是解析不出来的 ,支付宝公钥证书可以解析支付宝公钥的

支付宝开放平台地址: https://open.alipay.com

开发官方文档: https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer

支付宝sdk: https://opendocs.alipay.com/open/54/103419     这里有各环境下的示例

测试过程中如遇到问题请前往这里: https://opendocs.alipay.com/support/01ravi

生成以及配置证书: https://opendocs.alipay.com/support/01rauw


依赖如下:


        <dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
</dependency>



支付宝转账到支付宝

以下都是使用证书的方式进行调用的

方式一:

新接口:  alipay.fund.trans.uni.transfer


  public Map<String, Object> aliPayTransfer(AliPayTransferParam aliPayTransfer) {
try {
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl(aliPayConfig.getSERVER_URL());
certAlipayRequest.setAppId(aliPayConfig.getAPPID());
certAlipayRequest.setPrivateKey(aliPayConfig.getPAY_PRIVATE_KEY());
certAlipayRequest.setFormat(aliPayConfig.getFORMAT());
certAlipayRequest.setCharset(aliPayConfig.getCHARSET());
certAlipayRequest.setSignType(aliPayConfig.getSIGN_TYPE());
try {
//获取各证书路径
AliPayConfig certPath = getCertPath();
//设置应用公钥证书路径
certAlipayRequest.setCertPath(certPath.getAPPLICATION_PUBLIC_KEY());
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath(certPath.getAliPay_PUBLIC_CERT());
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath(certPath.getROOT_CERT_PATH());
} catch (Exception e) {
e.printStackTrace();
}
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
AliPay alipay = new AliPay();
//收款方信息
PayeeInfo payerInfo = new PayeeInfo();
payerInfo.setIdentity(aliPayTransfer.getIdentity());
if (aliPayTransfer.getName() != null) {
payerInfo.setIdentity_type("ALIPAY_LOGON_ID");
payerInfo.setName(aliPayTransfer.getName());
}else {
payerInfo.setIdentity_type("ALIPAY_USER_ID");
}
alipay.setPayee_info(payerInfo);

alipay.setOut_biz_no(aliPayTransfer.getOutBizNo());
alipay.setTrans_amount(aliPayTransfer.getTransAmount());
alipay.setProduct_code("TRANS_ACCOUNT_NO_PWD");
alipay.setBiz_scene("DIRECT_TRANSFER");
if (aliPayTransfer.getOrderTitle() != null) {
alipay.setOrder_title(aliPayTransfer.getOrderTitle());
}
if (aliPayTransfer.getRemark() != null) {
alipay.setRemark(aliPayTransfer.getRemark());
}
//转成json格式放入
String json = new Gson().toJson(alipay);
request.setBizContent(json);
Map<String, Object> map = new HashMap<String, Object>();
try {
AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
map.put("code", response.getCode());
map.put("status", response.getStatus());
map.put("msg", response.getMsg());
map.put("outBizNo", response.getOutBizNo());
map.put("orderId", response.getOrderId());
map.put("payFundOrderId", response.getPayFundOrderId());
map.put("payTime", response.getTransDate());
if (response.isSuccess()) {
map.put("des", "转账成功");
map.put("success", "true");
} else {
log.error("转账失败-->{}", response.getSubCode());
map.put("code", response.getCode());
map.put("des", "转账失败");
map.put("success", "false");
map.put("sub_code", response.getSubCode());
map.put("sub_msg", response.getSubMsg());
}
return map;
} catch (AlipayApiException e) {
log.error("转账出错-->{}", e.getMessage());
e.printStackTrace();
map.put("success", "false");
map.put("des", "转账异常!");
}
} catch (Exception e) {
e.printStackTrace();
}
throw new CustomException("系统繁忙,请稍后重试");
}


注意:  identity_type为​ALIPAY_LOGON_ID​时一定要传收款名称(name),  identity_type为ALIPAY_USER_ID时,identity传的是pId,也就是支付宝的合作伙伴id,以2088开头的。


方式二

新接口:  alipay.fund.trans.uni.transfer


    public Map<String, Object> aliPaySingleTransfer(AliPayTransferParam aliPayTransfer) {
try {
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl(aliPayConfig.getSERVER_URL());
certAlipayRequest.setAppId(aliPayConfig.getAPPID());
certAlipayRequest.setPrivateKey(aliPayConfig.getPAY_PRIVATE_KEY());
certAlipayRequest.setFormat(aliPayConfig.getFORMAT());
certAlipayRequest.setCharset(aliPayConfig.getCHARSET());
certAlipayRequest.setSignType(aliPayConfig.getSIGN_TYPE());
//获取各证书路径
AliPayConfig certPath = getCertPath();
//设置应用公钥证书路径
certAlipayRequest.setCertPath(certPath.getAPPLICATION_PUBLIC_KEY());
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath(certPath.getAliPay_PUBLIC_CERT());
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath(certPath.getROOT_CERT_PATH());
//支付宝客户端
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest();
request.setBizContent("{" +
"\"out_biz_no\":\"" + aliPayTransfer.getOutBizNo() + "\"," +
"\"trans_amount\":" + aliPayTransfer.getTransAmount() + "," +
"\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," +
"\"biz_scene\":\"DIRECT_TRANSFER\"," +
"\"order_title\":\"" + aliPayTransfer.getOrderTitle() + "\"," +
"\"payee_info\":{" +
"\"identity\":\"" + aliPayTransfer.getIdentity() + "\"," +
"\"identity_type\":\"ALIPAY_LOGON_ID\"," +
"\"name\":\"" + aliPayTransfer.getName() + "\"" +
" }," +
"\"remark\":\"" + aliPayTransfer.getRemark() + "\"" +
" }");
AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request);
//请求结束的返回参数
Map<String, Object> map = new HashMap<>();
map.put("code", response.getCode());
map.put("status", response.getStatus());
map.put("msg", response.getMsg());
map.put("outBizNo", response.getOutBizNo());
map.put("orderId", response.getOrderId());
map.put("payFundOrderId", response.getPayFundOrderId());
map.put("payTime", response.getTransDate());
if (response.isSuccess()) {
map.put("des", "转账成功");
} else {
map.put("des", "转账失败");
map.put("subCode", response.getSubCode());
map.put("subMsg", response.getSubMsg());
log.info("提现失败-->{}", response.getSubMsg());
}
return map;
} catch (Exception e) {
log.error("转账异常-->{}", e.getMessage());
e.printStackTrace();
}
throw new CustomException("系统繁忙,请稍后重试");
}



方式三

这是旧接口,支付宝官方已不再维护

alipay.fund.trans.toaccount.transfer


public Map<String, Object> aliPayTransfer(AliPayTransferParam aliPayTransfer) {
try {
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl(aliPayConfig.getSERVER_URL());
certAlipayRequest.setAppId(aliPayConfig.getAPPID());
certAlipayRequest.setPrivateKey(aliPayConfig.getPAY_PRIVATE_KEY());
certAlipayRequest.setFormat(aliPayConfig.getFORMAT());
certAlipayRequest.setCharset(aliPayConfig.getCHARSET());
certAlipayRequest.setSignType(aliPayConfig.getSIGN_TYPE());
try {
//获取各证书路径
AliPayConfig certPath = getCertPath();
//设置应用公钥证书路径
certAlipayRequest.setCertPath(certPath.getAPPLICATION_PUBLIC_KEY());
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath(certPath.getAliPay_PUBLIC_CERT());
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath(certPath.getROOT_CERT_PATH());
} catch (Exception e) {
e.printStackTrace();
}
//构造Client
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
//实例化接口
AlipayFundTransToaccountTransferRequest request = new AlipayFundTransToaccountTransferRequest ();
AliPay alipay = new AliPay();
PayeeInfo payerInfo = new PayeeInfo();
payerInfo.setIdentity(aliPayTransfer.getIdentity());
payerInfo.setIdentity_type("ALIPAY_LOGON_ID");
payerInfo.setName(aliPayTransfer.getName());
alipay.setPayee_info(payerInfo);
alipay.setPayee_type("ALIPAY_LOGONID");
alipay.setOut_biz_no(aliPayTransfer.getOutBizNo());
alipay.setAmount(aliPayTransfer.getTransAmount());
alipay.setProduct_code("TRANS_ACCOUNT_NO_PWD");
alipay.setBiz_scene("DIRECT_TRANSFER");
alipay.setOrder_title("提现成功");
alipay.setRemark("谢谢您的理解");
//转成json格式放入
String json = new Gson().toJson(alipay);
request.setBizContent(json);
AlipayFundTransToaccountTransferResponse response = null;
Map<String, Object> map = new HashMap<String, Object>();
try {
response = alipayClient.certificateExecute(request);
if ("10000".equals(response.getCode())) {
map.put("code", response.getCode());
map.put("success", "true");
return map;
} else {
map.put("code", response.getCode());
map.put("des", "转账成功");
map.put("sub_code", response.getSubCode());
map.put("success", "false");
map.put("sub_msg", response.getSubMsg());
return map;
}

} catch (AlipayApiException e) {
e.printStackTrace();
map.put("success", "false");
map.put("des", "转账失败!");
}

} catch (Exception e) {
e.printStackTrace();
}
return null;
}



查询支付宝转账订单


    public Map<String, Object> queryAliPayTransfer(AliPayTransferParam aliPayTransfer) {
try {
//构造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//设置网关地址
certAlipayRequest.setServerUrl(aliPayConfig.getSERVER_URL());
//设置应用Id
certAlipayRequest.setAppId(aliPayConfig.getAPPID());
//设置应用私钥
certAlipayRequest.setPrivateKey(aliPayConfig.getPAY_PRIVATE_KEY());
//设置请求格式,固定值json
certAlipayRequest.setFormat(aliPayConfig.getFORMAT());
//设置字符集
certAlipayRequest.setCharset(aliPayConfig.getCHARSET());
//设置签名类型
certAlipayRequest.setSignType(aliPayConfig.getSIGN_TYPE());
//获取各证书路径
AliPayConfig certPath = getCertPath();
//设置应用公钥证书路径
certAlipayRequest.setCertPath(certPath.getAPPLICATION_PUBLIC_KEY());
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath(certPath.getAliPay_PUBLIC_CERT());
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath(certPath.getROOT_CERT_PATH());
//构造client
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);
AlipayFundTransOrderQueryRequest request = new AlipayFundTransOrderQueryRequest();
request.setBizContent("{" +
"\"out_biz_no\":\"" + aliPayTransfer.getOutBizNo() + "\"," +
"\"order_id\":\"" + aliPayTransfer.getOrderId() + "\"" +
"}");
AlipayFundTransOrderQueryResponse response = alipayClient.certificateExecute(request);
Map<String, Object> map = new HashMap<>();
if (response.isSuccess()) {
map.put("code", response.getCode());
map.put("status", response.getStatus());
map.put("msg", response.getMsg());
map.put("outBizNo", response.getOutBizNo());
map.put("orderId", response.getOrderId());
map.put("payTime", response.getPayDate());
} else {
System.out.println("调用失败");
map.put("subCode", response.getSubCode());
map.put("subMsg", response.getSubMsg());
log.error(response.getMsg());
}
return map;
} catch (Exception e) {
e.printStackTrace();
}

throw new CustomException("系统繁忙,请稍后重试");
}



附加类

转账参数类:AliPay


/**
* 商户单号 必选
*/
private String out_biz_no;

/**
* 转账金额 必选
*/
private String trans_amount;

/**
* 业务产品码,单笔无密转账到支付宝账户固定为: TRANS_ACCOUNT_NO_PWD;
* 收发现金红包固定为: STD_RED_PACKET
* 必选
*/
private String product_code;

/**
* 业务备注 可选
*/
private String remark;

/**
* 转账标题 可选
*/
private String order_title;

/**
* 描述特定的业务场景,可传的参数如下:
* DIRECT_TRANSFER:单笔无密转账到支付宝,B2C现金红包;
* PERSONAL_COLLECTION:C2C现金红包-领红包
* 可选
*/
private String biz_scene;

/**
* 收款信息 必选
*/
private PayeeInfo payee_info;


这里需要注意的是:为了预防出错,这里的参数命名跟按照官方文档的命名一致

官方文档地址:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer


收款人信息类: PayeeInfo


    /**
* 手机号码 或者邮箱 或者PID 参与方的唯一标识
* pid是合作伙伴身份,是支付宝账号对应的唯一用户号ID
*/
private String identity;

/**
* ALIPAY_USER_ID:支付宝的会员ID, PID 例如:2088123412341234
* ALIPAY_LOGON_ID: 支付宝登录号, 支持邮箱和手机号格式
*/
private String identity_type;

/**
* 参与方真实姓名,如果非空,将校验收款支付宝账号姓名一致性。当identity_type=ALIPAY_LOGON_ID时,本字段必填。
*/
private String name;



支付宝转账配置类:AliPayConfig


package com.cainaer.transaction.config;

import lombok.Data;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

/**
* 支付宝转账配置类
* 通过支付宝开放平台开发助手app获取秘钥(公钥、私钥),然后拿公钥去支付宝开放平台获取支付宝公钥
* 如果还需要加签成证书,那么就得到应用公钥证书和支付宝公钥证书
* 应用证书是可以解析应用公钥的,注意: 应用私钥请妥善保管,忘记了只能重新提取,是解析不出来的
* 支付宝公钥证书可以解析支付宝公钥的
*
* @author serene
* @since 2020-09-11
*/
@Data
@Component
public class AliPayConfig {

/**
* 支付宝登录号,支持邮箱和手机号格式。
*/
private String PAYEE_TYPE = "ALIPAY_LOGONID";

/**
* 服务器网址
*/
@Value("${AliPayApi.SERVER_URL}")
private String SERVER_URL;

/**
* 商户appId
*/
@Value("${AliPayApi.APPID}")
private String APPID;

/**
* 应用私钥 应用公钥可以通过应用公钥证书解析
*/
@Value("${AliPayApi.PRIVATE_KEY}")
private String PAY_PRIVATE_KEY;

/**
* 格式 仅支持JSON
*/
@Value("${AliPayApi.FORMAT}")
private String FORMAT;

/**
* 编码 UTF-8、GBK
*/
@Value("${AliPayApi.CHAR_SET}")
private String CHARSET;

/**
* 加密方式 RSA2
*/
@Value("${AliPayApi.SIGN_TYPE}")
private String SIGN_TYPE;

/**
* 应用公钥证书
*/
@Value("${AliPayApi.APPLICATION_PUBLIC_KEY_CERT}")
private String APPLICATION_PUBLIC_KEY;

/**
* 支付宝公钥证书
*/
@Value("${AliPayApi.AliPay_PUBLIC_CERT}")
private String AliPay_PUBLIC_CERT;

/**
* 支付宝根证书
*/
@Value("${AliPayApi.ROOT_CERT_PATH}")
private String ROOT_CERT_PATH;

}



获取证书路径


    /**
* 获取证书路径
*
* @return 各证书数据
* @throws FileNotFoundException
*/
private AliPayConfig getCertPath() throws FileNotFoundException {
AliPayConfig aliPay = new AliPayConfig();
//设置应用公钥证书路径
String certPath = String.valueOf(ResourceUtils.getFile(aliPayConfig.getAPPLICATION_PUBLIC_KEY()));
aliPay.setAPPLICATION_PUBLIC_KEY(certPath);
//设置支付宝公钥证书路径
String aliPayPublicCertPath = String.valueOf(ResourceUtils.getFile(aliPayConfig.getAliPay_PUBLIC_CERT()));
aliPay.setAliPay_PUBLIC_CERT(aliPayPublicCertPath);
//设置支付宝根证书路径
String rootCertPath = String.valueOf(ResourceUtils.getFile(aliPayConfig.getROOT_CERT_PATH()));
aliPay.setROOT_CERT_PATH(rootCertPath);
return aliPay;
}



使用应用证书解析应用公钥


String publicKey = AlipaySignature.getAlipayPublicKey("应用公钥证书绝对路径");
//输出应用公钥的值
System.out.println("publicKey:"+publicKey);



使用支付宝证书解析支付宝公钥


String alipaypublicKey = AlipaySignature.getAlipayPublicKey("支付宝公钥证书绝对路径");
//输出支付宝公钥的值
System.out.println("alipaypublicKey:"+alipaypublicKey);



如有问题请下方留言哦......