V3微信支付平台证书获取、更新配置

写这个版本 我尝试了三个不同的版本 决定把这一个最新版 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同级别目录中 

 业务逻辑 我想需要你自己去微信的文档去看,人家提供的也很全面了

运行一下我的程序

 以上 是我自己所遇到的问题和解决方式 希望对你有帮助

对了,想要了解这个配置底层的可以看这个包的方法

 

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值