From b2a8335cef9c9d85aeca808d500e85b92032585d Mon Sep 17 00:00:00 2001
From: Hentua <wangdoubleone@gmail.com>
Date: Fri, 07 Apr 2023 14:55:51 +0800
Subject: [PATCH] 添加微信支付

---
 src/main/java/cc/mrbird/febs/pay/service/IAliPayService.java                    |   16 ++
 src/main/java/cc/mrbird/febs/pay/service/impl/WxPayServiceImpl.java             |  100 ++++++++++++++++
 src/main/java/cc/mrbird/febs/FebsShiroApplication.java                          |    1 
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java |   27 +---
 src/main/java/cc/mrbird/febs/pay/properties/WxPayProperties.java                |   32 +++++
 src/main/resources/cert/apiclient_cert.p12                                      |    0 
 src/main/java/cc/mrbird/febs/pay/service/impl/AliPayServiceImpl.java            |    5 
 src/main/resources/application-prod.yml                                         |    6 +
 src/main/java/cc/mrbird/febs/pay/service/IPayService.java                       |    8 -
 src/main/resources/application-test.yml                                         |   10 +
 pom.xml                                                                         |    6 +
 src/main/java/cc/mrbird/febs/pay/configure/WxPayConfiguration.java              |   42 +++++++
 src/main/resources/application-dev.yml                                          |   28 ++--
 src/test/java/cc/mrbird/febs/PayTest.java                                       |   36 ++++++
 src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java          |   28 +++
 src/main/resources/application.yml                                              |    2 
 16 files changed, 298 insertions(+), 49 deletions(-)

diff --git a/pom.xml b/pom.xml
index 7c71dbb..d146f33 100644
--- a/pom.xml
+++ b/pom.xml
@@ -330,6 +330,12 @@
             <artifactId>poi-ooxml-schemas</artifactId>
             <version>3.8</version>
         </dependency>
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-pay</artifactId>
+            <version>4.4.0</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/cc/mrbird/febs/FebsShiroApplication.java b/src/main/java/cc/mrbird/febs/FebsShiroApplication.java
index 3f01173..e8de38a 100644
--- a/src/main/java/cc/mrbird/febs/FebsShiroApplication.java
+++ b/src/main/java/cc/mrbird/febs/FebsShiroApplication.java
@@ -4,6 +4,7 @@
 import org.springframework.boot.WebApplicationType;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
index aea0a76..c1fcfda 100644
--- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallOrderInfoServiceImpl.java
@@ -18,6 +18,7 @@
 import cc.mrbird.febs.pay.model.AgreementPayDto;
 import cc.mrbird.febs.pay.model.AgreementSignDto;
 import cc.mrbird.febs.pay.model.UnipayDto;
+import cc.mrbird.febs.pay.service.IAliPayService;
 import cc.mrbird.febs.pay.service.IPayService;
 import cc.mrbird.febs.pay.service.UnipayService;
 import cc.mrbird.febs.rabbit.producter.AgentProducer;
@@ -68,9 +69,10 @@
     private final RedisUtils redisUtils;
 
     private final AgentProducer agentProducer;
-    private final IPayService payService;
+    private final IAliPayService payService;
     private final IMallAchieveService mallAchieveService;
     private final UnipayService unipayService;
+    private final IPayService wechatPayService;
 
     private final MallMemberBankSignMapper mallMemberBankSignMapper;
     private final MallMemberBankMapper mallMemberBankMapper;
@@ -277,30 +279,15 @@
         String rcResult = "";
         switch (payOrderDto.getType()) {
             case "1":
-                UnipayDto unipayDtoWx = new UnipayDto();
-//                unipayDto.setAmount(new BigDecimal("0.01"));
-                unipayDtoWx.setAmount(orderInfo.getAmount());
-                unipayDtoWx.setFrpCode("WEIXIN_APP3");
-                unipayDtoWx.setTradeMerchantNo("777180800385820");
-                unipayDtoWx.setOrderNo(orderInfo.getOrderNo());
                 List<MallOrderItem> itemsWx = orderInfo.getItems();
                 if(CollUtil.isEmpty(itemsWx)){
-                    unipayDtoWx.setProductName("商品");
+                    orderInfo.setName("商品");
                 }else{
-                    unipayDtoWx.setProductName(itemsWx.get(0).getGoodsName());
+                    orderInfo.setName(itemsWx.get(0).getGoodsName());
                 }
-                String unipayStrWx = unipayService.unipay(unipayDtoWx);
-                if("fail" == unipayStrWx){
-                    throw new FebsException("支付失败");
-                }else{
-//                    JSONUtil.parseObj(unipayStr);
-                    JSONObject jsonObject = JSONUtil.parseObj(unipayStrWx);
-                    payResultStr = (String) jsonObject.get("r7_TrxNo");
-                    rcResult = (String) jsonObject.get("rc_Result");
-                }
+
+                payResultStr = wechatPayService.pay(orderInfo);
                 orderInfo.setPayOrderNo(payResultStr);
-//                orderInfo.setPayOrderNo(payOrderDto.getPayOrderNo());
-//                orderInfo.setPayImage(payOrderDto.getPayImage());
                 orderInfo.setPayMethod("微信支付");
                 break;
             case "2":
diff --git a/src/main/java/cc/mrbird/febs/pay/configure/WxPayConfiguration.java b/src/main/java/cc/mrbird/febs/pay/configure/WxPayConfiguration.java
new file mode 100644
index 0000000..30cd9ce
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/configure/WxPayConfiguration.java
@@ -0,0 +1,42 @@
+package cc.mrbird.febs.pay.configure;
+
+import cc.mrbird.febs.pay.properties.WxPayProperties;
+import cn.hutool.core.util.StrUtil;
+import com.github.binarywang.wxpay.config.WxPayConfig;
+import com.github.binarywang.wxpay.service.WxPayService;
+import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
+import lombok.AllArgsConstructor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author wzy
+ * @date 2023-04-07
+ **/
+@Configuration
+@ConditionalOnClass(WxPayService.class)
+@EnableConfigurationProperties(WxPayProperties.class)
+@AllArgsConstructor
+public class WxPayConfiguration {
+    private WxPayProperties properties;
+
+    @Bean
+    @ConditionalOnMissingBean
+    public WxPayService wxService() {
+        WxPayConfig payConfig = new WxPayConfig();
+        payConfig.setAppId(StrUtil.trim(this.properties.getAppId()));
+        payConfig.setMchId(StrUtil.trim(this.properties.getMchId()));
+        payConfig.setMchKey(StrUtil.trim(this.properties.getMchKey()));
+        payConfig.setKeyPath(StrUtil.trim(this.properties.getKeyPath()));
+
+        // 可以指定是否使用沙箱环境
+        payConfig.setUseSandboxEnv(false);
+
+        WxPayService wxPayService = new WxPayServiceImpl();
+        wxPayService.setConfig(payConfig);
+        return wxPayService;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java b/src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java
index 6616618..57abbe5 100644
--- a/src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java
+++ b/src/main/java/cc/mrbird/febs/pay/controller/PayCallBackController.java
@@ -2,17 +2,20 @@
 
 import cc.mrbird.febs.common.entity.FebsResponse;
 import cc.mrbird.febs.pay.properties.AliPayProperties;
+import cc.mrbird.febs.pay.service.IAliPayService;
 import cc.mrbird.febs.pay.service.IPayService;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.internal.util.AlipaySignature;
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
+import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
 import com.ijpay.alipay.AliPayApi;
 import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.service.WxService;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -28,10 +31,16 @@
 public class PayCallBackController {
 
     @Autowired
-    private IPayService payService;
+    private IAliPayService payService;
+
+    @Autowired
+    private IPayService wechatPayService;
 
     @Resource
     private AliPayProperties aliPayProperties;
+
+    @Autowired
+    private WxPayService wxPayService;
 
     @RequestMapping("/aliCallBack")
     public String aliPayCallBack(HttpServletRequest request){
@@ -59,4 +68,13 @@
             return "failure";
         }
     }
+
+    @PostMapping(value = "/wxPayCallBack")
+    public String wxPayCallBack(@RequestBody String xmlData) throws WxPayException {
+        log.info("=======微信回调:{}========", xmlData);
+        WxPayOrderNotifyResult notifyResult = this.wxPayService.parseOrderNotifyResult(xmlData);
+
+        wechatPayService.payCallback(notifyResult.toMap());
+        return WxPayNotifyResponse.success("成功");
+    }
 }
diff --git a/src/main/java/cc/mrbird/febs/pay/properties/WxPayProperties.java b/src/main/java/cc/mrbird/febs/pay/properties/WxPayProperties.java
new file mode 100644
index 0000000..cb12763
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/properties/WxPayProperties.java
@@ -0,0 +1,32 @@
+package cc.mrbird.febs.pay.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * @author wzy
+ * @date 2023-04-07
+ **/
+@Data
+@ConfigurationProperties(prefix = "pay.wx")
+public class WxPayProperties {
+
+    /**
+     * 设置微信公众号或者小程序等的appid
+     */
+    private String appId;
+
+    /**
+     * 微信支付商户号
+     */
+    private String mchId;
+
+    /**
+     * 微信支付商户密钥
+     */
+    private String mchKey;
+
+    private String keyPath;
+
+    private String noticeUrl;
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/service/IAliPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IAliPayService.java
new file mode 100644
index 0000000..c5035c4
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/service/IAliPayService.java
@@ -0,0 +1,16 @@
+package cc.mrbird.febs.pay.service;
+
+import cc.mrbird.febs.mall.entity.MallOrderInfo;
+
+import java.util.Map;
+
+/**
+ * @author wzy
+ * @date 2021-09-27
+ **/
+public interface IAliPayService {
+
+    String aliPay(MallOrderInfo orderInfo);
+
+    void aliCallback(Map<String, String> params);
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/service/IPayService.java b/src/main/java/cc/mrbird/febs/pay/service/IPayService.java
index 155cfb7..ce5f928 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/IPayService.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/IPayService.java
@@ -4,13 +4,9 @@
 
 import java.util.Map;
 
-/**
- * @author wzy
- * @date 2021-09-27
- **/
 public interface IPayService {
 
-    String aliPay(MallOrderInfo orderInfo);
+    String pay(MallOrderInfo orderInfo);
 
-    void aliCallback(Map<String, String> params);
+    void payCallback(Map<String, String> params);
 }
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/AliPayServiceImpl.java
similarity index 96%
rename from src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java
rename to src/main/java/cc/mrbird/febs/pay/service/impl/AliPayServiceImpl.java
index 7bf8804..fe9f294 100644
--- a/src/main/java/cc/mrbird/febs/pay/service/impl/PayServiceImpl.java
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/AliPayServiceImpl.java
@@ -12,7 +12,8 @@
 import cc.mrbird.febs.mall.service.IApiMallOrderInfoService;
 import cc.mrbird.febs.pay.model.AliPayPassbackModel;
 import cc.mrbird.febs.pay.properties.AliPayProperties;
-import cc.mrbird.febs.pay.service.IPayService;
+import cc.mrbird.febs.pay.service.IAliPayService;
+import cc.mrbird.febs.pay.service.IAliPayService;
 import cc.mrbird.febs.rabbit.producter.AgentProducer;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSONObject;
@@ -36,7 +37,7 @@
  **/
 @Slf4j
 @Service
-public class PayServiceImpl implements IPayService {
+public class AliPayServiceImpl implements IAliPayService {
 
     @Resource
     private AliPayProperties aliPayProperties;
diff --git a/src/main/java/cc/mrbird/febs/pay/service/impl/WxPayServiceImpl.java b/src/main/java/cc/mrbird/febs/pay/service/impl/WxPayServiceImpl.java
new file mode 100644
index 0000000..9af7d05
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/service/impl/WxPayServiceImpl.java
@@ -0,0 +1,100 @@
+package cc.mrbird.febs.pay.service.impl;
+
+import cc.mrbird.febs.common.enumerates.AgentLevelEnum;
+import cc.mrbird.febs.common.enumerates.OrderStatusEnum;
+import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.mall.entity.MallMember;
+import cc.mrbird.febs.mall.entity.MallOrderInfo;
+import cc.mrbird.febs.mall.mapper.MallOrderInfoMapper;
+import cc.mrbird.febs.mall.service.IApiMallMemberService;
+import cc.mrbird.febs.pay.properties.WxPayProperties;
+import cc.mrbird.febs.pay.service.IPayService;
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * @author wzy
+ * @date 2023-04-07
+ **/
+@Slf4j
+@Service("wechatPayService")
+@RequiredArgsConstructor
+public class WxPayServiceImpl implements IPayService {
+
+    @Autowired
+    private IApiMallMemberService memberService;
+    @Autowired
+    private MallOrderInfoMapper orderInfoMapper;
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    @Autowired
+    private WxPayProperties wxPayProperties;
+
+    @Value("${spring.profiles.active}")
+    private String active;
+
+    @Override
+    public String pay(MallOrderInfo orderInfo) {
+        WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
+        request.setAppid(wxPayProperties.getAppId());
+        request.setMchId(wxPayProperties.getMchId());
+        request.setNotifyUrl(wxPayProperties.getNoticeUrl());
+        request.setBody(orderInfo.getName());
+        request.setOutTradeNo(orderInfo.getOrderNo());
+        request.setTimeExpire(DateUtil.format(DateUtil.offset(new Date(), DateField.MINUTE, 15), DatePattern.PURE_DATETIME_PATTERN));
+        request.setSpbillCreateIp("127.0.0.1");
+        request.setTradeType("APP");
+
+        if ("dev".equals(active) || "test".equals(active)) {
+            request.setTotalFee(1);
+        } else {
+            request.setTotalFee(orderInfo.getAmount().multiply(new BigDecimal(100)).intValue());
+        }
+
+        try {
+            WxPayAppOrderResult result = wxPayService.createOrder(request);
+            return JSONObject.toJSONString(result);
+        } catch (WxPayException e) {
+            e.printStackTrace();
+            throw new FebsException("支付异常, 请检查");
+        }
+    }
+
+    @Override
+    public void payCallback(Map<String, String> params) {
+        String orderNo = params.get("outTradeNo");
+
+        LambdaQueryWrapper<MallOrderInfo> query = new LambdaQueryWrapper<>();
+        query.eq(MallOrderInfo::getOrderNo, orderNo);
+        MallOrderInfo orderInfo = this.orderInfoMapper.selectOne(query);
+        if ("1".equals(orderInfo.getPayResult())) {
+            return;
+        }
+
+        orderInfo.setStatus(OrderStatusEnum.WAIT_SHIPPING.getValue());
+        orderInfo.setPayResult("1");
+        orderInfo.setPayTime(new Date());
+        orderInfo.setPayTradeNo(params.get("transaction_id"));
+        orderInfoMapper.updateById(orderInfo);
+    }
+}
diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml
index 2d0cf1a..593e7df 100644
--- a/src/main/resources/application-dev.yml
+++ b/src/main/resources/application-dev.yml
@@ -15,24 +15,20 @@
       datasource:
         # 数据源-1,名称为 base
         base:
-          username: db_mall_hongloumeng
-          password: hongloumeng123!@#123
+          username: ct_test
+          password: 123456
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://47.111.90.145:3306/db_mall_hongloumeng?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8&rewriteBatchedStatements=true&allowMultiQueries=true
-#          username: db_mall
-#          password: mall!@#123
-#          driver-class-name: com.mysql.cj.jdbc.Driver
-#          url: jdbc:mysql://47.111.90.145:3306/db_mall?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://120.27.238.55:3406/db_hongloumeng?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
 
   redis:
     # Redis数据库索引(默认为 0)
-    database: 8
+    database: 3
     # Redis服务器地址
-    host: 121.37.162.173
+    host: 120.27.238.55
     # Redis服务器连接端口
     port: 6379
     # Redis 密码
-    password: d32ncxe@i3#!dV
+    password: xcong123
     lettuce:
       pool:
         # 连接池中的最小空闲连接
@@ -46,10 +42,10 @@
     # 连接超时时间(毫秒)
     timeout: 5000
   rabbitmq:
-    host: 47.111.90.145
+    host: 120.27.238.55
     port: 5672
-    username: zj_mall
-    password: zj_mall123
+    username: ct_rabbit
+    password: 123456
     publisher-confirm-type: correlated
 
 pay:
@@ -62,3 +58,9 @@
     # 回调地址
     noticeUrl: http://120.27.238.55:8801/api/pay/aliCallBack
     domain: https://openapi.alipaydev.com/gateway.do
+  wx:
+    appId: wx051693799db39540
+    mchId: 1641389321
+    mchKey: wqri51aCfiG31o4IcdX3dW12qnX3u4hp
+    keyPath: classpath:cert/apiclient_cert.p12
+    noticeUrl: http://120.27.238.55:8185/api/pay/wxPayCallBack
\ No newline at end of file
diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml
index 68099e2..bcfc251 100644
--- a/src/main/resources/application-prod.yml
+++ b/src/main/resources/application-prod.yml
@@ -58,3 +58,9 @@
     # 回调地址
     noticeUrl: http://120.27.238.55:8801/api/pay/aliCallBack
     domain: https://openapi.alipay.com/gateway.do
+  wx:
+    appId: wx051693799db39540
+    mchId: 1641389321
+    mchKey: wqri51aCfiG31o4IcdX3dW12qnX3u4hp
+    keyPath: classpath:cert/apiclient_cert.p12
+    noticeUrl: http://localhost
diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml
index 1177d0f..593e7df 100644
--- a/src/main/resources/application-test.yml
+++ b/src/main/resources/application-test.yml
@@ -18,7 +18,7 @@
           username: ct_test
           password: 123456
           driver-class-name: com.mysql.cj.jdbc.Driver
-          url: jdbc:mysql://120.27.238.55:3306/db_amz?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
+          url: jdbc:mysql://120.27.238.55:3406/db_hongloumeng?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=GMT%2b8
 
   redis:
     # Redis数据库索引(默认为 0)
@@ -57,4 +57,10 @@
     privateKey: MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDOhu+hD2kuMh5s7IQuKjexeC4DmXxrAr/bu10rNB304NaIRUNAkGPI9tep7ZRBZqa/Tjrfom8LeeBnbA1n+SgxROSREEXDA1E3/XJY+vYivehVTD2TuA2GEnEtLXUgxQJVfz/CNIOa3rCc1nj9n4/kv03Sx/yqiKnLd6h9dRvdaY9k7DwnWPu1FT5T3bpTiU+oKaUODkcfUPpMH8aQaolzKY07M0cqZFn75Z0KFAoM6p/TDoF7JKpwdzGO5xuJe8YT4xx2OcLY++d/dzSoQvvsKh8r1yE37Z5B9FxHSHe1GuR2wOQxhgXUyaj7gden/pAVspzbjZTDdQppjzNavnzdAgMBAAECggEAKAJL+c+aeLCM5F0NXkQfdenqQBhD2hc2Q8MQUYZPJ1lHNi700FUof44SSYEU73aLZxQoo5o8GOULa/2quzGxb5oBDXkxio3h9g7LUCGN/Tz8/Uk/xJYrSIXaFv5vamHACgAUwfKabC4n2LpTxg5bOd01nlfPwtmmyxvrMCK3uzSWzxDLag0jVh9DGA97D00UOkL9QpEJ26dpBuF7pf9Nt0BtfyJMFrCbJXY2F3j65VNN4f2rOG7/DTGm434Sektj9Bc31ept9MfPw9VyRbV7EMvG5be9iDqBvLbRGhQVtBjv3N/E7p3uUI5HyxM8GOjQhSwSOJQ0gQS8vNdNN90qoQKBgQDqxoTFOsPM3+LoQj1r7CjoXhooEfpikyHpK2l8mzM4+La9ajzUJzTWT8nc0k2Qha8AvBZzJ2+kSKAjtwc/VNTu0IeEn480V9zVyBFkcC294d3A1keN5ch9wP1it5fWsVh+62T9xGXlQQIpuYeQm1BXj7kltd7vE8t6fLrmnhVkpwKBgQDhMqgZoRQGmcgrVc8F//lBO7g6ku/+GfNJnve64sRi5ZifwSiNSULVqDWmdHJiVWyYXoTvt1o3bqQorawe0c+wEzknn8ZipNDnN9tybxhKqD6pzCbRv6yWmU+9X9ZhSxYJeumn3sqxyZB7rnqJQ7/vpsoNZRvp0LS85iJVJFXO2wKBgB7O3i1jgL4pwwTnbFf1LYkQkC4h7dFxrUmDwNvxIc+gE5rXjhPo8S4OWlb34eXNJSHbjLafvi64uQr2waS15RtRkfb9WTVtMjV7g4zCi74XHZpohAtC1ARshtOlc+9gZlSBX0dNtnFXDombJwb62pgi7BDexNpqppD0PTJ2HCiRAoGAREmZIdRvfyToxwNJOLeLPNXAIrrl3Xa/CGcVFe2nwZl/s4neIyHBC4rrYeNTwC/JM1cOFqbRy5dYXiFz3RCgWvMpVLOlc8oossSEXeoEQrdL8S8/4kCuNCifPnyuRGiBcTR9X/M2Ib1Oe8LH05HgxOodwPwU/8zS0akzZgATqRsCgYA5TDAX996ThMjHr+qjLh5gdIJ+85jxP0+tqVk5Vwl3niS3qJGoLIofIgHYee9U6c1wLJU+lUTaxYpuaJPwQFbdMGGGB8i3c2XczVBShCUEedelTghl7Izwh/DILmlAQCvYsC+wWMcFdU3LhYvFGXmTx9ToRBLdtd6v45+7MXcHQw==
     # 回调地址
     noticeUrl: http://120.27.238.55:8801/api/pay/aliCallBack
-    domain: https://openapi.alipaydev.com/gateway.do
\ No newline at end of file
+    domain: https://openapi.alipaydev.com/gateway.do
+  wx:
+    appId: wx051693799db39540
+    mchId: 1641389321
+    mchKey: wqri51aCfiG31o4IcdX3dW12qnX3u4hp
+    keyPath: classpath:cert/apiclient_cert.p12
+    noticeUrl: http://120.27.238.55:8185/api/pay/wxPayCallBack
\ No newline at end of file
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 7ec8387..035171c 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -39,4 +39,4 @@
         mybatisplus:
           core:
             metadata:
-              TableInfoHelper: error
+              TableInfoHelper: error
\ No newline at end of file
diff --git a/src/main/resources/cert/apiclient_cert.p12 b/src/main/resources/cert/apiclient_cert.p12
new file mode 100644
index 0000000..3bc1879
--- /dev/null
+++ b/src/main/resources/cert/apiclient_cert.p12
Binary files differ
diff --git a/src/test/java/cc/mrbird/febs/PayTest.java b/src/test/java/cc/mrbird/febs/PayTest.java
index ede5efa..cf9d61e 100644
--- a/src/test/java/cc/mrbird/febs/PayTest.java
+++ b/src/test/java/cc/mrbird/febs/PayTest.java
@@ -1,12 +1,22 @@
 package cc.mrbird.febs;
 
+import cc.mrbird.febs.pay.properties.WxPayProperties;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.UUID;
+import cn.hutool.core.util.RandomUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.domain.AlipayTradeAppPayModel;
 import com.alipay.api.response.AlipayTradeAppPayResponse;
+import com.github.binarywang.wxpay.bean.order.WxPayAppOrderResult;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
+import com.github.binarywang.wxpay.exception.WxPayException;
+import com.github.binarywang.wxpay.service.WxPayService;
 import com.ijpay.alipay.AliPayApi;
 import lombok.extern.slf4j.Slf4j;
 import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 
 /**
@@ -30,4 +40,30 @@
         AlipayTradeAppPayResponse resp = AliPayApi.appPayToResponse(model, "");
         log.info("=====>>>{}", JSONObject.toJSONString(resp));
     }
+
+    @Autowired
+    private WxPayService wxPayService;
+
+    @Autowired
+    private WxPayProperties wxPayProperties;
+
+    @Test
+    public void wxPayTest() {
+        WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
+        request.setAppid(wxPayProperties.getAppId());
+        request.setMchId(wxPayProperties.getMchId());
+        request.setNotifyUrl(wxPayProperties.getNoticeUrl());
+        request.setBody("这是body");
+        request.setOutTradeNo(RandomUtil.randomString(32));
+        request.setTimeExpire("20230407114500");
+        request.setSpbillCreateIp("127.0.0.1");
+        request.setTradeType("APP");
+        request.setTotalFee(1);
+        try {
+            WxPayAppOrderResult result = wxPayService.createOrder(request);
+            System.out.println(1111);
+        } catch (WxPayException e) {
+            e.printStackTrace();
+        }
+    }
 }

--
Gitblit v1.9.1