支付宝支付接入的文档真的非常多,由于密钥配置错误一直返回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支付订单信息示例(证书)
//构造clientCertAlipayRequest certAlipayRequest = new CertAlipayRequest();//设置网关地址certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do");//设置应用IdcertAlipayRequest.setAppId(app_id);//设置应用私钥certAlipayRequest.setPrivateKey(privateKey);//设置请求格式,固定值jsoncertAlipayRequest.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);//构造clientAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); //实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.trade.app.payAlipayTradeAppPayRequest 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错误排查,客户端会返回“系统繁忙,请稍后再试”。
其中最常见的原因是公私钥配对错误,使用证书的话可以参考官方文档《如何检验密钥证书是否匹配》来检验。