官方接口地址:产品能力概览 | 微信支付商户平台文档中心
1、准备工作
1.1、需要AppID(公众号/小程序/开放平台应用)
1.2、申请微信支付获取到mchid
1.3、AppID和mchid绑定,这一步可以忽略
1.4、设置APIV3密钥(这个必须有,后面获取证书的时候需要用)
1.5、配置支付商户证书(重要,后面请求接口必传项)
2、可以开始开发对接支付接口了(这里以小程序支付举例子)
2.1 、JSAPI支付接口对接接口地址-->微信支付-开发者文档
2.2、开发准备工作
准备一个springboot项目导入微信支付sdk
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
</dependency>
3、构建支付请求客户端
- 加载证书,这里以字符串加载举例,也可以使用证书路径
-
String MINI_APP_PAY_KEY = "-----BEGIN PRIVATE KEY-----\n"+ "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCwCV5Vic0sYlDE\n"+ "......."; // 加载商户私钥(privateKey:私钥字符串) PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(MINI_APP_PAY_KEY.getBytes(StandardCharsets.UTF_8)));
3. 加载平台证书,这里用到了V3密钥
// 加载平台证书(mchId:支付商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
String MINI_PAY_MCHID = "123456";
String MINI_PAY_SERIAL_NO = "123";
String MINI_PAY_KEY = "v3密钥";
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(MINI_PAY_MCHID, new PrivateKeySigner(MINI_PAY_SERIAL_NO, merchantPrivateKey)), MINI_PAY_KEY.getBytes("utf-8"));
这里有个证书序列号获取方法-->证书相关常见问题-接口规则 | 微信支付商户平台文档中心
4.构建微信请求client
String MINI_PAY_MCHID = "支付商户号";
String MINI_PAY_SERIAL_NO = "证书序列号";
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(MINI_PAY_MCHID, MINI_PAY_SERIAL_NO, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier));
5.合并到一起
@SneakyThrows
public CloseableHttpClient getClient() {
// 加载商户私钥(privateKey:私钥字符串)
PrivateKey merchantPrivateKey = PemUtil.loadPrivateKey(new ByteArrayInputStream(MINI_APP_PAY_KEY.getBytes(StandardCharsets.UTF_8)));
// 加载平台证书(mchId:商户号,mchSerialNo:商户证书序列号,apiV3Key:V3密钥)
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(MINI_PAY_MCHID, new PrivateKeySigner(MINI_PAY_SERIAL_NO, merchantPrivateKey)), MINI_PAY_KEY.getBytes("utf-8"));
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(MINI_PAY_MCHID, MINI_PAY_SERIAL_NO, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier));
return builder.build();
}
6.构建完整的客户端
/**
* requestUrl 请求地址
* data 请求json字符串数据
**/
public String post(String requestUrl, String data) {
// 第五步生成的客户端
CloseableHttpClient httpClient = getClient();
try {
// 创建Http Post请求
HttpPost httpPost = new HttpPost(requestUrl);
httpPost.addHeader("Accept", "application/json");
httpPost.addHeader("Content-type", "application/json; charset=utf-8");
StringEntity entity = new StringEntity(data, ContentType.APPLICATION_JSON);
httpPost.setEntity(entity);
// 执行http请求
CloseableHttpResponse response = httpClient.execute(httpPost);
String bodyAsString = EntityUtils.toString(response.getEntity());
return bodyAsString;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}