- 若你使用了
ScheduledUpdateCertificatesVerifier
,请使用CertificatesManager
替换:
写这个版本 我尝试了三个不同的版本 决定把这一个最新版 0.4.2的版本分享出来
0.4.0已经替换掉0.3.0版本中的更新方式
我们需要在Config的文件配置中做一些更改
直接上配置
@Slf4j
@Configuration
@PropertySource("classpath:wxPay.properties") //读取配置文件
@ConfigurationProperties(prefix="wxpay") //读取wxpay节点
@Data
public class VxPayConfig {
// 商户号
private String mchId;
// 商户API证书序列号
private String mchSerialNo;
// 商户私钥文件
private String privateKeyPath;
// APIv3密钥
private String apiV3Key;
// APPID
private String appid;
// 微信服务器地址
private String domain;
// 接收结果通知地址
private String notifyDomain;
//
//获取商户私钥文件
public PrivateKey getPrivateKey(String filename){
try {
return PemUtil.loadPrivateKey(
new FileInputStream(filename)
);
} catch (FileNotFoundException e) {
throw new RuntimeException("私钥文件不存在",e);
}
}
@Bean
public Verifier getVerifier() throws IOException, NotFoundException {
log.info("加载证书管理器实例");
//获取商户私钥
PrivateKey getPrivateKey = getPrivateKey(privateKeyPath);
// 获取证书管理器单例实例
CertificatesManager certificatesManager = CertificatesManager.getInstance();
// 向证书管理器增加需要自动更新平台证书的商户信息
log.info("向证书管理器增加商户信息,并开启自动更新");
try {
// 该方法底层已实现同步线程更新证书
// 详见beginScheduleUpdate()方法
certificatesManager.putMerchant(mchId, new WechatPay2Credentials(mchId,
new PrivateKeySigner(mchSerialNo, getPrivateKey)), apiV3Key.getBytes(StandardCharsets.UTF_8));
} catch (GeneralSecurityException | HttpCodeException e) {
e.printStackTrace();
}
log.info("从证书管理器中获取验签器");
return certificatesManager.getVerifier(mchId);
}
@Bean
public PrivateKey getPrivateKey() throws IOException {
// 加载商户私钥(privateKey:私钥字符串)
log.info("开始加载私钥,读取内容...");
String content = new String(Files.readAllBytes(Paths.get(privateKeyPath)),StandardCharsets.UTF_8 );
System.out.println(content);
return PemUtil.loadPrivateKey(new ByteArrayInputStream(content.getBytes(StandardCharsets.UTF_8)));
}
//获取http请求
@Bean(name = "wxPayClient")
public CloseableHttpClient getWxPayClient(Verifier verifier,PrivateKey merchantPrivateKey) {
log.info("构造httpClient");
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(mchId, mchSerialNo, merchantPrivateKey)
.withValidator(new WechatPay2Validator(verifier));
// 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
CloseableHttpClient httpClient = builder.build();
System.out.println(httpClient);
log.info("构造httpClient成功");
return httpClient;
}
}
这里要注意一点 我直接将获取到的pem文件扔到了src同级别目录中
业务逻辑 我想需要你自己去微信的文档去看,人家提供的也很全面了
运行一下我的程序
以上 是我自己所遇到的问题和解决方式 希望对你有帮助
对了,想要了解这个配置底层的可以看这个包的方法
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/coldblacktea/article/details/123607982