需要准备的东西如下:
应用私钥,支付宝公钥,应用公钥证书、支付宝公钥证书、支付宝根证书, 应用的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);
如有问题请下方留言哦......