本文主要讲解楼主在使用spingboot框架对接支付宝app时需要做到几个步骤,以及防坑指南。

app支付

1.app支付的文档及其配置,附上链接
https://docs.open.alipay.com/204/105465 app支付需要的参数,需要先去支付宝进行申请,主要为下面这几个
Android 支付宝lot对接 支付宝对接pinetwork_支付宝支付
对于应用的公钥和私钥支付宝提供了工具可以生产
Android 支付宝lot对接 支付宝对接pinetwork_Android 支付宝lot对接_02这里的app公钥我们用来给支付宝,然后上传应用公钥并获取支付宝公钥,这样就ok了。

2.yml中配置支付宝请求参数

Android 支付宝lot对接 支付宝对接pinetwork_Android 支付宝lot对接_03

notify-url 支付宝支付成功回调的地址,所以必须是外网可以访问的地址,内部本质也就是一个接口,用来处理回调的成功后的业务逻辑,其次一定要去除接口的系统权限,楼主死活回调不成功,因为url被权限拦截了

Android 支付宝lot对接 支付宝对接pinetwork_Android 支付宝lot对接_04


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.支付代码

Android 支付宝lot对接 支付宝对接pinetwork_Android 支付宝lot对接_05


这里注意几点

1.AlipayTradeAppPayModel这个对象是支付宝提供的,需引入步骤3中的pom依赖,和这个对象类似的还有退款对象等,都是不同的对象,用来封装业务特有参数。

2.支付宝支付单位为元,微信是分,所以业务中我们需要根据实际情况转换。

3.AlipayClient为支付宝封装的网络请求对象,支付直接返回body给前端即可,已经加密过。成功后的body签名参数如图:

Android 支付宝lot对接 支付宝对接pinetwork_Android 支付宝lot对接_06

很多时候我们好奇回调方法中的参数,这里也给到了实例,如下图:
详细参数见支付宝异步回调说明,链接如下
https://docs.open.alipay.com/204/105301/Android 支付宝lot对接 支付宝对接pinetwork_封装_07

app退款

1.退款接口文档位置及其参数
https://docs.open.alipay.com/api_1/alipay.trade.refund

2.请求参数注意事项

Android 支付宝lot对接 支付宝对接pinetwork_封装_08

上图公共参数这里不做过多解释,支付已经封装进了alipayConfig中

Android 支付宝lot对接 支付宝对接pinetwork_封装_09


注意以下几点

1.out_trade_no和trade_no必须选一个作为请求依据,要么是商户自己的定单号,要么就是支付宝的支付返回的单号

2.out_request_no这个字段如果退款是分批退款,必须传递,并且需要每次不一样,最好使用随机串退款代码部分如下

Android 支付宝lot对接 支付宝对接pinetwork_Android 支付宝lot对接_10


请求成功的对象如下

Android 支付宝lot对接 支付宝对接pinetwork_封装_11


其中的body格式化后如下:

Android 支付宝lot对接 支付宝对接pinetwork_支付宝支付_12

这里不在介绍查询下单,查询退款等接口,基本上和上述接口调用一致。