微信支付API v3的Apache HttpClient扩展,实现了请求签名的生成和应答签名的验证。
如果你是使用Apache HttpClient的商户开发者,可以使用它构造HttpClient
。得到的HttpClient
在执行请求时将自动携带身份认证信息,并检查应答的微信支付签名。
当前版本0.1.6
为测试版本。请商户的专业技术人员在使用时注意系统和软件的正确性和兼容性,以及带来的风险。
- Java 1.8
在你的build.gradle
文件中加入如下的信息
repositories {
...
maven { url 'https://jitpack.io' }
}
...
dependencies {
implementation 'com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.1.6'
...
}
加入JitPack仓库
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
加入以下依赖
<dependency>
<groupId>com.github.wechatpay-apiv3</groupId>
<artifactId>wechatpay-apache-httpclient</artifactId>
<version>0.1.6</version>
</dependency>
如果你使用的是HttpClientBuilder
或者HttpClients#custom()
来构造HttpClient
,你可以直接替换为WechatPayHttpClientBuilder
。我们提供相应的方法,可以方便的传入商户私钥和微信支付平台证书等信息。
import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
//...
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
.withWechatpay(wechatpayCertificates);
// ... 接下来,你仍然可以通过builder设置各种参数,来配置你的HttpClient
// 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签
HttpClient httpClient = builder.build();
// 后面跟使用Apache HttpClient一样
HttpResponse response = httpClient.execute(...);
当默认的本地签名和验签方式不适合你的系统时,你可以通过实现Signer
或者Verifier
来定制签名和验签。比如,你的系统把商户私钥集中存储,业务系统需通过远程调用进行签名,你可以这样做。
import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
import com.wechat.pay.contrib.apache.httpclient.Credentials;
// ...
Credentials credentials = new WechatPay2Credentials(merchantId, new Signer() {
@Override
public Signer.SignatureResult sign(byte[] message) {
// ... call your sign-RPC, then return sign & serial number
}
});
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withCredentials(credentials)
.withWechatpay(wechatpayCertificates);
新版本>=0.1.5
可使用 AutoUpdateCertificatesVerifier 类,该类于原 CertificatesVerifier 上增加证书的超时自动更新(默认与上次更新时间超过一小时后自动更新),并会在首次创建时,进行证书更新。
示例代码:
//不需要传入微信支付证书,将会自动更新
AutoUpdateCertificatesVerifier verifier = new AutoUpdateCertificatesVerifier(
new WechatPay2Credentials(merchantId, new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey)),
apiV3Key.getBytes("utf-8"));
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier))
// ... 接下来,你仍然可以通过builder设置各种参数,来配置你的HttpClient
// 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
HttpClient httpClient = builder.build();
// 后面跟使用Apache HttpClient一样
HttpResponse response = httpClient.execute(...);
因为不需要传入微信支付平台证书,AutoUpdateCertificatesVerifier 在首次更新证书时不会验签,也就无法确认应答身份,可能导致下载错误的证书。
但下载时会通过 HTTPS、AES 对称加密来保证证书安全,所以可以认为,在使用官方 JDK、且 APIv3 密钥不泄露的情况下,AutoUpdateCertificatesVerifier 是安全的。
使用WechatPayHttpClientBuilder
需要调用withWechatpay
设置微信支付平台证书,而平台证书又只能通过调用获取平台证书接口下载。为了解开"死循环",你可以在第一次下载平台证书时,按照下述方法临时"跳过”应答签名的验证。
CloseableHttpClient httpClient = WechatPayHttpClientBuilder.create()
.withMerchant(mchId, mchSerialNo, merchantPrivateKey)
.withValidator(response -> true) // NOTE: 设置一个空的应答签名验证器,**不要**用在业务请求
.build();
注意:业务请求请使用标准的初始化流程,务必验证应答签名。
请参考AesUtil.Java。
如果你发现了BUG或者有任何疑问、建议,请通过issue进行反馈。
也欢迎访问我们的开发者社区。