目录
前言:
主要记录一些小笔记......
以下是调用银联支付平台的API -demo:
import com.unionpay.acp.sdk.AcpService;
import com.unionpay.acp.sdk.LogUtil;
import com.unionpay.acp.sdk.SDKConfig;
import java.util.HashMap;
import java.util.Map;
public class UnionPayService {
public UnionPayService() {
// 加载银联支付SDK配置文件
SDKConfig.getConfig().loadPropertiesFromSrc();
}
// 发起支付请求
public String pay(String orderId, String txnAmt) {
Map<String, String> requestData = new HashMap<String, String>();
requestData.put("version", "5.1.0");
requestData.put("encoding", "UTF-8");
requestData.put("signMethod", "01");
requestData.put("txnType", "01");
requestData.put("txnSubType", "01");
requestData.put("bizType", "000201");
requestData.put("channelType", "08");
requestData.put("accessType", "0");
requestData.put("merId", "your_mer_id");
requestData.put("orderId", orderId);
requestData.put("txnTime", "20220101120000");
requestData.put("txnAmt", txnAmt);
requestData.put("currencyCode", "156");
requestData.put("backUrl", "http://your_server_url");
requestData.put("frontUrl", "http://your_client_url");
requestData.put("payTimeout", "1200");
Map<String, String> submitFromData = AcpService.sign(requestData, "UTF-8");
String requestUrl = SDKConfig.getConfig().getSingleRequestUrl();
Map<String, String> response = AcpService.post(submitFromData, requestUrl, "UTF-8");
if (AcpService.validate(response, "UTF-8")) {
String tn = response.get("tn");
return tn;
} else {
LogUtil.writeErrorLog("验证签名失败");
return null;
}
}
// 查询订单状态
public boolean query(String orderId) {
Map<String, String> requestData = new HashMap<String, String>();
requestData.put("version", "5.1.0");
requestData.put("encoding", "UTF-8");
requestData.put("signMethod", "01");
requestData.put("txnType", "00");
requestData.put("txnSubType", "00");
requestData.put("bizType", "000000");
requestData.put("channelType", "08");
requestData.put("accessType", "0");
requestData.put("merId", "your_mer_id");
requestData.put("orderId", orderId);
requestData.put("txnTime", "20220101120000");
Map<String, String> submitFromData = AcpService.sign(requestData, "UTF-8");
String requestUrl = SDKConfig.getConfig().getSingleQueryUrl();
Map<String, String> response = AcpService.post(submitFromData, requestUrl, "UTF-8");
if (AcpService.validate(response, "UTF-8")) {
String respCode = response.get("respCode");
if (respCode.equals("00")) {
return true;
} else {
return false;
}
} else {
LogUtil.writeErrorLog("验证签名失败");
return false;
}
}
}
注意:
- 其中,your_mer_id是商户号,orderId是订单号,txnAmt是交易金额。需要注意的是,银联支付平台的API接口需要使用商户证书进行签名和加密,因此需要在SDKConfig中设置商户证书的路径和密码。
- SDKConfig.getConfig().getSingleRequestUrl()方法是用于获取银联支付平台的支付请求URL的。在调用银联支付平台的支付请求API接口时,需要将请求数据发送到银联支付平台的支付请求URL上,以便银联支付平台进行处理。getSingleRequestUrl()方法就是用于获取这个支付请求URL的。
- 在调用银联支付平台的支付请求API接口时,需要将请求数据使用商户证书进行签名和加密,然后将签名后的数据发送到银联支付平台的支付请求URL上。银联支付平台会使用银联公钥证书进行验签和解密,然后处理请求数据并返回响应数据。因此,在调用银联支付平台的支付请求API接口时,需要同时设置商户证书和银联公钥证书的路径和密码。
- SDKConfig.getConfig().loadPropertiesFromSrc()方法是通过调用银联支付SDK中的SDKConfig类的静态方法getConfig()获取SDKConfig实例,然后调用loadPropertiesFromSrc()方法加载配置文件的
- AcpService.post()方法是银联支付SDK中的一个工具类方法,用于向银联支付平台发送HTTP POST请求,并返回响应数据,并将响应数据进行验签和解密
依赖:
<dependency>
<groupId>com.unionpay</groupId>
<artifactId>acp-sdk</artifactId>
<version>5.1.0</version>
</dependency>
配置文件:
需要在项目的classpath下添加acp_sdk.properties文件
# 商户号
acpsdk.merId=your_mer_id
# 商户证书路径
acpsdk.signCert.path=/path/to/your/signCert.pfx
# 商户证书密码
acpsdk.signCert.pwd=your_signCert_password
# 银联公钥证书路径
acpsdk.validateCert.dir=/path/to/your/validateCertDir/
# 银联公钥证书文件名
acpsdk.validateCert.file=acp_test_verify_sign.cer
# 银联公钥证书密码
acpsdk.validateCert.pwd=your_validateCert_password
# SDK日志输出目录
acpsdk.log.dir=/path/to/your/logDir/