将微信配置信息存到数据库并进行调用

打印 上一主题 下一主题

主题 799|帖子 799|积分 2397

  1. package com.dataxai.web.core.config;
  2. import com.alibaba.fastjson2.JSON;
  3. import com.dataxai.web.domain.Wxpay;
  4. import com.dataxai.web.mapper.WxpayMapper;
  5. import com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder;
  6. import com.wechat.pay.contrib.apache.httpclient.auth.*;
  7. import com.wechat.pay.contrib.apache.httpclient.util.PemUtil;
  8. import lombok.Data;
  9. import lombok.extern.slf4j.Slf4j;
  10. import org.apache.http.impl.client.CloseableHttpClient;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.boot.context.properties.ConfigurationProperties;
  13. import org.springframework.context.annotation.Bean;
  14. import org.springframework.context.annotation.Configuration;
  15. import org.springframework.context.annotation.PropertySource;
  16. import org.springframework.core.io.ClassPathResource;
  17. import javax.annotation.PostConstruct;
  18. import java.io.*;
  19. import java.nio.charset.StandardCharsets;
  20. import java.security.PrivateKey;
  21. @Configuration
  22. @Data //使用set方法将wxpay节点中的值填充到当前类的属性中
  23. @Slf4j
  24. public class WxPayConfig {
  25.     // 商户号
  26.     private String mchId;
  27.     // 商户API证书序列号
  28.     private String mchSerialNo;
  29.     // 商户私钥文件
  30.     private String privateKeyPath;
  31.     // APIv3密钥
  32.     private String apiV3Key;
  33.     // APPID
  34.     private String appid;
  35.     // 微信服务器地址
  36.     private String domain;
  37.     // 接收结果通知地址
  38.     private String notifyDomain;
  39.     // 接收结果通知地址
  40.     private String notifyDomainProd;
  41.     // APIv2密钥
  42.     private String partnerKey;
  43.     @Autowired
  44.     private WxpayMapper configMapper;
  45.     @PostConstruct
  46.     public void init() {
  47.         log.info("初始化微信支付配置...");
  48.         //从数据库获得配置信息
  49.         Wxpay dbConfig = configMapper.getOne(1l);
  50.         if (dbConfig != null) {
  51.             this.mchId = dbConfig.getMchId();
  52.             this.mchSerialNo = dbConfig.getMchSerialNo();
  53.             this.privateKeyPath = dbConfig.getPrivateKeyPath(); // 设置私钥路径
  54.             this.apiV3Key = dbConfig.getApiV3Key();
  55.             this.appid = dbConfig.getAppId();
  56.             this.domain = dbConfig.getDomain();
  57.             this.notifyDomain = dbConfig.getNotifyDomain();
  58.             this.notifyDomainProd = dbConfig.getNotifyDomainProd();
  59.             this.partnerKey = dbConfig.getPartnerKey();
  60.             log.info("微信支付配置已成功初始化: {}", JSON.toJSONString(dbConfig));
  61.         } else {
  62.             throw new IllegalStateException("未找到微信支付配置");
  63.         }
  64.     }
  65.     /**
  66.      * 获取商户的私钥文件
  67.      * @param filename
  68.      * @return
  69.      */
  70.     private PrivateKey getPrivateKey(String filename) {
  71.         System.out.println("filename = "+filename);
  72.         filename = "/config/"+filename;
  73.         ClassPathResource resource = new ClassPathResource(filename);
  74.         InputStream inputStream = null;
  75.         try {
  76.             inputStream = resource.getInputStream();
  77.             return PemUtil.loadPrivateKey(inputStream);
  78.         } catch (IOException e) {
  79.             throw new RuntimeException("私钥文件不存在",e);
  80.         }
  81.     }
  82.     /**
  83.      * 获取签名验证器
  84.      * @return
  85.      */
  86.     @Bean
  87.     public ScheduledUpdateCertificatesVerifier getVerifier(){
  88.         log.info("获取签名验证器");
  89.         //获取商户私钥
  90.         PrivateKey privateKey = getPrivateKey(privateKeyPath);
  91.         //私钥签名对象
  92.         PrivateKeySigner privateKeySigner = new PrivateKeySigner(mchSerialNo, privateKey);
  93.         //身份认证对象
  94.         WechatPay2Credentials wechatPay2Credentials = new WechatPay2Credentials(mchId, privateKeySigner);
  95.         // 使用定时更新的签名验证器,不需要传入证书
  96.         ScheduledUpdateCertificatesVerifier verifier = new ScheduledUpdateCertificatesVerifier(
  97.                 wechatPay2Credentials,
  98.                 apiV3Key.getBytes(StandardCharsets.UTF_8));
  99.         return verifier;
  100.     }
  101.     /**
  102.      * 获取http请求对象
  103.      * @param verifier
  104.      * @return
  105.      */
  106.     @Bean(name = "wxPayClient")
  107.     public CloseableHttpClient getWxPayClient(ScheduledUpdateCertificatesVerifier verifier){
  108.         log.info("获取httpClient");
  109.         //获取商户私钥
  110.         PrivateKey privateKey = getPrivateKey(privateKeyPath);
  111.         WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
  112.                 .withMerchant(mchId, mchSerialNo, privateKey)
  113.                 .withValidator(new WechatPay2Validator(verifier));
  114.         // ... 接下来,你仍然可以通过builder设置各种参数,来配置你的HttpClient
  115.         // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
  116.         CloseableHttpClient httpClient = builder.build();
  117.         return httpClient;
  118.     }
  119.     /**
  120.      * 获取HttpClient,无需进行应答签名验证,跳过验签的流程
  121.      */
  122.     @Bean(name = "wxPayNoSignClient")
  123.     public CloseableHttpClient getWxPayNoSignClient(){
  124.         //获取商户私钥
  125.         PrivateKey privateKey = getPrivateKey(privateKeyPath);
  126.         //用于构造HttpClient
  127.         WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
  128.                 //设置商户信息
  129.                 .withMerchant(mchId, mchSerialNo, privateKey)
  130.                 //无需进行签名验证、通过withValidator((response) -> true)实现
  131.                 .withValidator((response) -> true);
  132.         // 通过WechatPayHttpClientBuilder构造的HttpClient,会自动的处理签名和验签,并进行证书自动更新
  133.         CloseableHttpClient httpClient = builder.build();
  134.         log.info("== getWxPayNoSignClient END ==");
  135.         return httpClient;
  136.     }
  137. }
复制代码
mapper层和controller层省略

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表