咱们常见的官网文档,跟多时候都是按分类整理,并不会将一个支付很连串的说清楚,这篇文章以实现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)
各种证书参数
如果正常生成证书后,应该有如下这些证书,我放到同一个文件夹中了
setEncryptKey()
上边就是支付宝支付的固定参数了,还是很容易上手的
二、实际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生成二维码
到此,用该例子讲清楚支付宝支付的逻辑,希望对大家有所帮助