支付宝app支付服务端接入(证书方式)

  • Post author:
  • Post category:其他

支付宝支付接入的文档真的非常多,由于密钥配置错误一直返回4000错误码,折腾了小半个下午,特此记录一下。

整体开发流程图如下:

1 首先创建应用,并签约APP支付能力

官方文档:接入前准备

这个过程需要填写、认证一些公司信息。支付宝签约费率为6%。

2 首先按照官方文档生成并配置公钥证书

参考:如何生成及配置公钥证书 

       首先下载支付宝开放平台开发助手获取CSR文件,选择应用信息内的“接口加签方式”-“公钥证书“-”上传CSR文件”,选择目录支付宝开放平台开发助手/CSR的.csr文件,上传成功后下载“应用公钥证书”(appCertPublicKey_appid数据.crt)、“支付宝公钥证书”(alipayCertPublicKey_RSA2.crt)、“支付宝根证书”(alipayRootCert.crt);

3 服务器端开发

参考:官方文档《JAVA服务端 SDK 生成 APP支付订单信息示例(证书)》

1)在pom.xml中添加最新的alipay sdk依赖

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

2)JAVA服务端 SDK 生成 APP支付订单信息示例(证书)

//构造client
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
//设置网关地址
certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");
//设置应用Id
certAlipayRequest.setAppId(app_id);
//设置应用私钥
certAlipayRequest.setPrivateKey(privateKey);
//设置请求格式,固定值json
certAlipayRequest.setFormat("json");
//设置字符集
certAlipayRequest.setCharset(charset);
//设置签名类型
certAlipayRequest.setSignType(sign_type);
//设置应用公钥证书路径
certAlipayRequest.setCertPath(app_cert_path);
//设置支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath(alipay_cert_path);
//设置支付宝根证书路径
certAlipayRequest.setRootCertPath(alipay_root_cert_path);
//构造client
AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest);

//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.pay
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数。以下方法为sdk的model入参方式(model和biz_content同时存在的情况下取biz_content)。
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
model.setBody("我是测试数据");
model.setSubject("App支付测试Java");
model.setOutTradeNo(outtradeno);
model.setTimeoutExpress("30m");
model.setTotalAmount("0.01");
model.setProductCode("QUICK_MSECURITY_PAY");
request.setBizModel(model);
request.setNotifyUrl("商户外网可以访问的异步地址");
try {
        //这里和普通的接口调用不同,使用的是sdkExecute
        AlipayTradeAppPayResponse response = alipayClient.sdkExecute(request);
        System.out.println(response.getBody());//就是orderString 可以直接给客户端请求,无需再做处理。
    } catch (AlipayApiException e) {
        e.printStackTrace();
}

注意的坑:

1)证书和公钥的请求类型不同,证书是CertAlipayRequest

2)证书和公钥的请求方法不同,证书是sdkExecute方法;

3)app支付时productCode参数的值为 “QUICK_MSECURITY_PAY“;

4)应用私钥指上一步CSR文件夹中的“域名_私钥.txt”文件中的内容,其他三个证书路径则是上一步下载的三个.crt证书的绝对路径

服务端请求接口成功的话,会返回一个用&拼接的参数字符串,其中有一个签名sign值

4 错误排查

最常见的是ALIN10146错误排查,客户端会返回“系统繁忙,请稍后再试”。

其中最常见的原因是公私钥配对错误,使用证书的话可以参考官方文档《如何检验密钥证书是否匹配》来检验。


版权声明:本文为zlx312原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。