支付宝支付API V3,适合第一次接通支付的同学

1,985 阅读3分钟

咱们常见的官网文档,跟多时候都是按分类整理,并不会将一个支付很连串的说清楚,这篇文章以实现PC网站生成二维码,让用户扫码支付的场景为例,一次性讲清楚阿里巴巴的支付宝支付,这里的例子是用证书验签的方式验签的(阿里的文档比微信的友好的多~更多可以关注支付宝的开放平台)

一、跟着demo代码解释参数

1.请求公共部分设置

//这下面一整块代码都是在构建支付的通用令牌,用于安全校验的
ApiClient defaultClient = Configuration.getDefaultApiClient();
defaultClient.setBasePath("https://openapi.alipay.com");//setBasePath里的链接不需要修改,就这样
// 设置alipayConfig参数(建议全局设置一次,频繁创建config会报异常)
AlipayConfig config = new AlipayConfig();
config.setAppId("20xxxxxxx");//支付宝商户平台创建的应用的APPID
String path="/Documents/xxxx/支付宝支付证书/应用2签约/应用私钥RSA2048.txt";
String privateKey = FileTools.readToString(path);
config.setPrivateKey(privateKey); //私钥,这里填写的是私钥的内容,而不是私钥文件的路径,具体那个私钥,看下文解释
// 密钥模式
//config.setAlipayPublicKey("如果是密钥模式,这里同理填写密钥的内容而不是路径");
// 证书模式,证书路径后有对应的模版文件名后缀,从下载好的整数中很好区分(比微信友好的多)
config.setAppCertPath("/Documents/xxxx/支付宝支付证书/应用2签约/appCertPublicKey_2021003143xxxx.crt");
config.setAlipayPublicCertPath("/Documents/xxxxx/支付宝支付证书/应用xxx约/alipayCertPublicKey_RSA2.crt");
config.setRootCertPath("/Documents/xxxxxxxx/支付宝支付证书/应用2签约/alipayRootCert.crt");
//接口内容加密方式(支付宝开放平台的应用开发设置中有)
config.setEncryptKey("xxxxxBxxxxxxtaxxx===");
defaultClient.setAlipayConfig(config);

上边是整个支付宝请求头的设置

2.解释上边demo中的参数的来源

setAppId(APPID)

image.png 各种证书参数

image.png

image.png 如果正常生成证书后,应该有如下这些证书,我放到同一个文件夹中了

image.png

setEncryptKey()

image.png

上边就是支付宝支付的固定参数了,还是很容易上手的

二、实际demo完成扫码支付

1.demo示例

<dependency>
    <groupId>com.alipay.sdk</groupId>
    <artifactId>alipay-sdk-java-v3</artifactId>
    <version>1.0.2.ALL</version>
    <scope>compile</scope>
</dependency>
package com.yucong.office.biz.util;

import com.alipay.v3.ApiClient;
import com.alipay.v3.ApiException;
import com.alipay.v3.Configuration;
import com.alipay.v3.api.AlipayTradeApi;
import com.alipay.v3.model.*;
import com.alipay.v3.util.model.AlipayConfig;
import com.yucong.office.common.utils.FileTools;
import com.yucong.office.common.utils.IdGeneratorUtils;
import com.yucong.office.common.utils.json.JsonTools;
import lombok.extern.slf4j.Slf4j;

import java.io.File;

@Slf4j
public class AliPayUtil {

    public static final String CALL_BACK_URL = "https://test.xxxxx.com/wx/alipay/callback";

    public static void main(String[] args) {
        try {
            ApiClient defaultClient = Configuration.getDefaultApiClient();
            defaultClient.setBasePath("https://openapi.alipay.com");//setBasePath里的链接不需要修改,就这样
            // 设置alipayConfig参数(建议全局设置一次,频繁创建config会报异常)
            AlipayConfig config = new AlipayConfig();
            config.setAppId("20xxxxxxx");//支付宝商户平台创建的应用的APPID
            String path = "/Documents/xxxx/支付宝支付证书/应用2签约/应用私钥RSA2048.txt";
            String privateKey = FileTools.readToString(path);
            config.setPrivateKey(privateKey); //私钥,这里填写的是私钥的内容,而不是私钥文件的路径,具体那个私钥,看下文解释
            // 密钥模式
            //config.setAlipayPublicKey("如果是密钥模式,这里同理填写密钥的内容而不是路径");
            // 证书模式,证书路径后有对应的模版文件名后缀,从下载好的整数中很好区分(比微信友好的多)
            config.setAppCertPath("/Documents/xxxx/支付宝支付证书/应用2签约/appCertPublicKey_2021003143xxxx.crt");
            config.setAlipayPublicCertPath("/Documents/xxxxx/支付宝支付证书/应用xxx约/alipayCertPublicKey_RSA2.crt");
            config.setRootCertPath("/Documents/xxxxxxxx/支付宝支付证书/应用2签约/alipayRootCert.crt");
            //接口内容加密方式(支付宝开放平台的应用开发设置中有)
            config.setEncryptKey("xxxxxBxxxxxxtaxxx===");
            defaultClient.setAlipayConfig(config);
            //实例化客户端
            AlipayTradeApi api = new AlipayTradeApi(defaultClient);
            String orderNo = IdGeneratorUtils.genTrackCode();
            //调用 alipay.trade.pay
            AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
            model.setOutTradeNo(orderNo);
            model.setSubject("测试下单" + System.currentTimeMillis());
            model.setTotalAmount("0.01");
            model.setTimeoutExpress("15m");
            model.setNotifyUrl(CALL_BACK_URL); // 异步回调通知地址
            AlipayTradePrecreateResponseModel responseModel = api.precreate(model);
            //responseModel中会返回二维码的链接内容,需要第三方的二维码工具将其转成二维码
            //生成二维码,可以后端不用生成二维码,让前端根据url直接生成二维码也行,二维码的链接其实就是二维码的内容
            QRCodeGenerator.generateQRCodeImage(responseModel.getQrCode(),二维码存放路径);
        } catch (ApiException e) {
            AlipayTradePayDefaultResponse errorObject = (AlipayTradePayDefaultResponse) e.getErrorObject();
            if (errorObject != null && errorObject.getActualInstance() instanceof CommonErrorType) {
                //获取公共错误码
                CommonErrorType actualInstance = errorObject.getCommonErrorType();
                System.out.println("CommonErrorType:" + actualInstance.toString());
            } else if (errorObject != null && errorObject.getActualInstance() instanceof AlipayTradePayErrorResponseModel) {
                //获取业务错误码
                AlipayTradePayErrorResponseModel actualInstance = errorObject.getAlipayTradePayErrorResponseModel();
                System.out.println("AlipayTradePayErrorResponseModel:" + actualInstance.toString());
            } else {
                //获取其他报错(如加验签失败、http请求失败等)
                System.err.println("Status code: " + e.getCode());
                System.err.println("Reason: " + e.getResponseBody());
                System.err.println("Response headers: " + e.getResponseHeaders());
                System.out.println(e);
            }
        }
    }
}

生成二维码的例子,可以参考我的另一篇文章:JAVA生成二维码

到此,用该例子讲清楚支付宝支付的逻辑,希望对大家有所帮助