本文主要讲解楼主在使用spingboot框架对接支付宝app时需要做到几个步骤,以及防坑指南。
app支付
1.app支付的文档及其配置,附上链接
https://docs.open.alipay.com/204/105465 app支付需要的参数,需要先去支付宝进行申请,主要为下面这几个
对于应用的公钥和私钥支付宝提供了工具可以生产
这里的app公钥我们用来给支付宝,然后上传应用公钥并获取支付宝公钥,这样就ok了。
2.yml中配置支付宝请求参数
notify-url 支付宝支付成功回调的地址,所以必须是外网可以访问的地址,内部本质也就是一个接口,用来处理回调的成功后的业务逻辑,其次一定要去除接口的系统权限,楼主死活回调不成功,因为url被权限拦截了
3.写好支付宝配置类,通过配置类加载支付的共用参数,这里需要引入支付宝的pom依赖
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>3.7.110.ALL</version>
</dependency>
配置类如下
public class AlipayConfig {
/**
* 支付宝gatewayUrl
*/
@Value("${alipay.gatewayUrl}")
private String gatewayUrl;
/**
* 商户应用id
*/
@Value("${alipay.appid}")
private String appid;
/**
* RSA私钥,用于对商户请求报文加签
*/
@Value("${alipay.private-key}")
private String appPrivateKey;
/**
* 支付宝RSA公钥,用于验签支付宝应答
*/
@Value("${alipay.public-key}")
private String alipayPublicKey;
/**
* 签名类型
*/
private String signType = "RSA2";
/**
* 格式
*/
private String formate = "json";
/**
* 编码
*/
private String charset = "UTF-8";
/**
* 同步地址
*/
private String returnUrl;
/**
* 异步地址
*/
@Value("${alipay.notify-url}")
private String notifyUrl;
/**
* 最大查询次数
*/
private static int maxQueryRetry = 5;
/**
* 查询间隔(毫秒)
*/
private static long queryDuration = 5000;
/**
* 最大撤销次数
*/
private static int maxCancelRetry = 3;
/**
* 撤销间隔(毫秒)
*/
private static long cancelDuration = 3000;
@Bean
public AlipayClient alipayClient(){
return new DefaultAlipayClient(this.getGatewayUrl(),
this.getAppid(),
this.getAppPrivateKey(),
this.getFormate(),
this.getCharset(),
this.getAlipayPublicKey(),
this.getSignType());
}
}
4.支付代码
这里注意几点
1.AlipayTradeAppPayModel这个对象是支付宝提供的,需引入步骤3中的pom依赖,和这个对象类似的还有退款对象等,都是不同的对象,用来封装业务特有参数。
2.支付宝支付单位为元,微信是分,所以业务中我们需要根据实际情况转换。
3.AlipayClient为支付宝封装的网络请求对象,支付直接返回body给前端即可,已经加密过。成功后的body签名参数如图:
很多时候我们好奇回调方法中的参数,这里也给到了实例,如下图:
详细参数见支付宝异步回调说明,链接如下
https://docs.open.alipay.com/204/105301/
app退款
1.退款接口文档位置及其参数
https://docs.open.alipay.com/api_1/alipay.trade.refund
2.请求参数注意事项
上图公共参数这里不做过多解释,支付已经封装进了alipayConfig中
注意以下几点
1.out_trade_no和trade_no必须选一个作为请求依据,要么是商户自己的定单号,要么就是支付宝的支付返回的单号
2.out_request_no这个字段如果退款是分批退款,必须传递,并且需要每次不一样,最好使用随机串退款代码部分如下
请求成功的对象如下
其中的body格式化后如下:
这里不在介绍查询下单,查询退款等接口,基本上和上述接口调用一致。