jin hai 5 meses
pai
achega
b70e68dde4

+ 1 - 1
pom.xml

@@ -39,7 +39,7 @@
         <hutool.version>5.8.16</hutool.version>
         <thumbnailator.vaersion>0.4.20</thumbnailator.vaersion>
         <weixin-java-pay.version>4.6.0</weixin-java-pay.version>
-        <weixin-java-miniapp.version>3.3.0</weixin-java-miniapp.version>
+        <weixin-java-miniapp.version>3.8.0</weixin-java-miniapp.version>
     </properties>
 
     <!-- 依赖声明 -->

+ 25 - 0
ruoyi-admin/src/main/resources/apiclient_cert.pem

@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIENDCCAxygAwIBAgIUWeRATUXs8szfWb+R/bwjWlMasJAwDQYJKoZIhvcNAQEL
+BQAwXjELMAkGA1UEBhMCQ04xEzARBgNVBAoTClRlbnBheS5jb20xHTAbBgNVBAsT
+FFRlbnBheS5jb20gQ0EgQ2VudGVyMRswGQYDVQQDExJUZW5wYXkuY29tIFJvb3Qg
+Q0EwHhcNMjQxMjA4MDQxNjMyWhcNMjkxMjA3MDQxNjMyWjCBjTETMBEGA1UEAwwK
+MTY5NzY3ODg5ODEbMBkGA1UECgwS5b6u5L+h5ZWG5oi357O757ufMTkwNwYDVQQL
+DDDljJfkuqzljJfmnoHlnIjnp5HmioDkuK3lv4PvvIjkuKrkvZPlt6XllYbmiLfv
+vIkxCzAJBgNVBAYTAkNOMREwDwYDVQQHDAhTaGVuWmhlbjCCASIwDQYJKoZIhvcN
+AQEBBQADggEPADCCAQoCggEBAKazQ64rsEiNurWeIzDb9SK5ELUbGHxZ16P682qY
+eX2O3QD1AcMXg3SzB0F8CFB2AdyHCPmOMSh4jePnDGOaukR5jev8SDl7Q04GI01S
+JSQB3+vJPU64PHSbBRfU94sCeC8+kejUHO+W1unL6k8akeHMRfy7q3dSgGOGMj1G
+OVZH2eIXwhWR+l57bv/xZzjCoqmRNBz7winqtkw0NtguSCcv4FqLlZzKPYphyc68
+a4+78TiUOmth7xScXseb4M4nnr2DGW6lmJb5MoVmfMDzdO6LeUcrZ06RiSVVrEx6
+SBiuBglvayV1tVTSUmcHGt58XMmn1DVm7ygAKwFJvBhzpmcCAwEAAaOBuTCBtjAJ
+BgNVHRMEAjAAMAsGA1UdDwQEAwID+DCBmwYDVR0fBIGTMIGQMIGNoIGKoIGHhoGE
+aHR0cDovL2V2Y2EuaXRydXMuY29tLmNuL3B1YmxpYy9pdHJ1c2NybD9DQT0xQkQ0
+MjIwRTUwREJDMDRCMDZBRDM5NzU0OTg0NkMwMUMzRThFQkQyJnNnPUhBQ0M0NzFC
+NjU0MjJFMTJCMjdBOUQzM0E4N0FEMUNERjU5MjZFMTQwMzcxMA0GCSqGSIb3DQEB
+CwUAA4IBAQBWXuDnTxm+ks7K/RpvOoXQqa+S9wMg9PQzecT73nCE4Y5UKcgTNAyM
+13A8OLqO5Kf4TfYvqVv9T0+96OymNUVCa8gZ6iqhjaL2kEY37qDkjDQZZPE3X+Dg
+vkWlpufrHy1jblU9zt2YBioaPYY/Dh1saEJoqQhs9PNDg/es3xzbUkfGKJSwoWXF
+b34kRYXbjSuQESDZXp5n0K6sWI3IcKEaCw3VVgNy+JBpjD3ix+cEbXM4iuEutBG2
+6lsSDeNOhkdlVNuFN/nTQ1b7Felc28JLzrBs+PeDJuhe3Iv+Mx5fU9SvGaJGpGar
+2Wp2d1Q51YIxYVosYqFyveuQtEtEXhDM
+-----END CERTIFICATE-----

+ 28 - 0
ruoyi-admin/src/main/resources/apiclient_key.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCms0OuK7BIjbq1
+niMw2/UiuRC1Gxh8Wdej+vNqmHl9jt0A9QHDF4N0swdBfAhQdgHchwj5jjEoeI3j
+5wxjmrpEeY3r/Eg5e0NOBiNNUiUkAd/ryT1OuDx0mwUX1PeLAngvPpHo1Bzvltbp
+y+pPGpHhzEX8u6t3UoBjhjI9RjlWR9niF8IVkfpee27/8Wc4wqKpkTQc+8Ip6rZM
+NDbYLkgnL+Bai5Wcyj2KYcnOvGuPu/E4lDprYe8UnF7Hm+DOJ569gxlupZiW+TKF
+ZnzA83Tui3lHK2dOkYklVaxMekgYrgYJb2sldbVU0lJnBxrefFzJp9Q1Zu8oACsB
+SbwYc6ZnAgMBAAECggEBAJQYAfKDoZJzRwH+QSkw37A/VRZvwesHLcniMcnrN1NS
+TgiBoVUeWIyeV73XYNOKYtD1rgV2Szm3D+b95kW+uegHTQvvDoLyfLKeRVJ1vcUl
+XTbtiueaSSsWZQntCxWV1guyvJFpj2NSUA9YNwqbgipk/XAvkX7p7mF8YLmK33lD
+4KAx0ZYrGx8niqZaX2Zk5s3XLD3vluseLnOXnHieAAZp0w52boEFa4AkdId2vqJM
+E8fKcMB7MdITtS8pWk6phVisiCCXMMkuXPzKTmiiSzPVdPTyfqnqfC7HwGMF2zeL
+nzvQBZ4tIOEYeufso+O5kiaRZ5GAQ+nyxWqwa9ltw7ECgYEA1DsDdaohySZsMnyS
+WSBN/emqHdhz2elv3CFeUzmiOPBSsM67kPBjQeaGxfAW0uqhyZbS7ECwb4pXD/t6
+75nQxUa/w3QDjg+xRynPpcFUozDcs8Y4h7eMi5ULECNgWRxavGz3IiYcmvyFNXyG
+CP4yV60U1ziKXdW7Ajbl190VQoUCgYEAyRRryA21pBoIvRAxWGadXys3Dv/BG6P1
+85UwYNyGTi1QgLi79H66GdKfL+R4vO7RiwM52+B5DHULVStNkJ7lYaMTf229W5kX
+phU7a/RnsN5iaQ0nF+wIvHunAu6IXdpyi+k+fnRx2CktaSzY+Yhub6iBTZSBOku0
+9ZX/J5yUFvsCgYBZ4GwEpnoMX3Mupkar69xbjVr3rLTTMeKnTJJPmHa0ukGqksIo
+DUVboS6uIJDp3WeKoY7Nck/FzMY2BH/5fCBHi0CmmzjuLoMa6f//6DHZslWk5GsI
+PpkMe5/lw7WHx1Q9u7+k/JLcp9gZ4JQ6trvHGYtb4ZvnRR4fP/RySDQ6qQKBgQCB
+N3lH1t+KNBy3emdreo3Y8YlxPxNWctgEDzRGmpBIPsCD57MJHEL1gy8+9KBOMV5A
+6fLNhIPlaHW+5pPywtl/E+/crKXJ7iiPVweXiTj1JQOypHwh2FGI5iFeNfE19sIz
+fNDnLGdYVKXU97f7Kxxk7rEhLLSaxLnmM90DFJDp7wKBgHBJtdfg57b1sGhxXHri
+qbFH3rSnTk6m16+X7T9l40WVyRxrlPQsONcX1GubwZ7xXTkOXN13v4NfHE5QdEdm
+N1KJ3E4tDM/h5A5vqz2Ic5FRqI5FuKcTUl6bcGtY9PMNUwAjv3KMoBHnBzfUTqda
+sh+3YXD4JUI5T70khDNIr6U9
+-----END PRIVATE KEY-----

+ 3 - 2
ruoyi-admin/src/main/resources/application.yml

@@ -146,8 +146,9 @@ wx:
   appid: wx5e6011e2a62d0ffb
   secret: 98a513002257f43102a1d0ccf5a5eb8e
   mch-serial-no: 59E4404D45ECF2CCDF59BF91FDBC235A531AB090
-  private-key-path: classpath:/pay-key/apiclient_key.pem
+  private-key-path: classpath:apiclient_key.pem
+  private-cert-path: classpath:apiclient_cert.pem
   mch-id: 1697678898
   api-key: A7tG5wZ3vM9sY2LxQ8kW4bJ6rD1F0Pz1
   domain: https://api.mch.weixin.qq.com
-  notify-domain: https://49.235.117.140:8080/
+  notify-domain: http://49.235.117.140:8080/wx/pay/notify

+ 4 - 0
ruoyi-framework/pom.xml

@@ -68,6 +68,10 @@
             <groupId>com.github.binarywang</groupId>
             <artifactId>weixin-java-pay</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 0 - 1
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java

@@ -112,7 +112,6 @@ public class SecurityConfig {
                             // 静态资源,可匿名访问
                             .requestMatchers(HttpMethod.GET, "/", "/*.html", "/**.html", "/**.css", "/**.js", "/profile/**").permitAll()
                             .requestMatchers("/swagger-ui.html", "/v3/api-docs/**", "/swagger-ui/**", "/druid/**").permitAll()
-                            .requestMatchers("/wx/**").anonymous()
                             // 除上面外的所有请求全部需要鉴权认证
                             .anyRequest().authenticated();
                 })

+ 57 - 0
ruoyi-framework/src/main/java/com/ruoyi/framework/config/WieXinPayProperties.java

@@ -0,0 +1,57 @@
+package com.ruoyi.framework.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Data
+@Configuration
+public class WieXinPayProperties {
+    /**
+     * 商户号
+     */
+    @Value("${wx.mch-id}")
+    private String mchId;
+
+    /**
+     * 商户API证书序列号
+     */
+    @Value("${wx.mch-serial-no}")
+    private String mchSerialNo;
+
+    /**
+     * 商户私钥文件
+     */
+    @Value("${wx.private-key-path}")
+    private String privateKeyPath;
+
+    /**
+     * APIv3密钥
+     */
+    @Value("${wx.api-key}")
+    private String key;
+
+    /**
+     * APPID
+     */
+    @Value("${wx.appid}")
+    private String appid;
+
+    /**
+     * 微信服务器地址
+     */
+    @Value("${wx.domain}")
+    private String domain;
+
+    /**
+     * 接收结果通知地址
+     */
+    @Value("${wx.notify-domain}")
+    private String notifyUrl;
+
+    /**
+     * 证书文件的绝对路径
+     */
+    @Value("${wx.private-cert-path}")
+    private String privateCertPath;
+}

+ 7 - 6
ruoyi-framework/src/main/java/com/ruoyi/framework/config/WxPayConfiguration.java

@@ -8,16 +8,15 @@ import lombok.AllArgsConstructor;
 import org.springframework.beans.factory.annotation.Autowired;
 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;
 
 @Configuration
 @ConditionalOnClass(WxPayService.class)
-@EnableConfigurationProperties(WxPayProperties.class)
 @AllArgsConstructor
 public class WxPayConfiguration {
-    private WxPayProperties properties;
+    @Autowired
+    private WieXinPayProperties properties;
 
     @Bean
     @ConditionalOnMissingBean
@@ -25,9 +24,11 @@ public class WxPayConfiguration {
         WxPayConfig payConfig = new WxPayConfig();
         payConfig.setAppId(StringUtils.trimToNull(this.properties.getAppid()));
         payConfig.setMchId(StringUtils.trimToNull(this.properties.getMchId()));
-        payConfig.setMchKey(StringUtils.trimToNull(this.properties.getKey()));
-        payConfig.setKeyPath(StringUtils.trimToNull(this.properties.getPrivateKeyPath()));
-
+        payConfig.setCertSerialNo(StringUtils.trimToNull(this.properties.getMchSerialNo()));
+        payConfig.setApiV3Key(StringUtils.trimToNull(this.properties.getKey()));
+        payConfig.setPrivateKeyPath(StringUtils.trimToNull(this.properties.getPrivateKeyPath()));
+        payConfig.setPrivateCertPath(StringUtils.trimToNull(this.properties.getPrivateCertPath()));
+        payConfig.setNotifyUrl(StringUtils.trimToNull(this.properties.getNotifyUrl()));
         // 可以指定是否使用沙箱环境
         payConfig.setUseSandboxEnv(false);
         WxPayService wxPayService = new WxPayServiceImpl();

+ 0 - 107
ruoyi-framework/src/main/java/com/ruoyi/framework/config/WxPayProperties.java

@@ -1,107 +0,0 @@
-package com.ruoyi.framework.config;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-@ConfigurationProperties("wx")
-public class WxPayProperties {
-    /**
-     * 商户号
-     */
-    @Value("${wx.mch-id}")
-    private String mchId;
-
-    /**
-     * 商户API证书序列号
-     */
-    @Value("${wx.mch-serial-no}")
-    private String mchSerialNo;
-
-    /**
-     * 商户私钥文件
-     */
-    @Value("${wx.private-key-path}")
-    private String privateKeyPath;
-
-    /**
-     * APIv3密钥
-     */
-    @Value("${wx.api-key}")
-    private String key;
-
-    /**
-     * APPID
-     */
-    @Value("${wx.appid}")
-    private String appid;
-
-    /**
-     * 微信服务器地址
-     */
-    @Value("${wx.domain}")
-    private String domain;
-
-    /**
-     * 接收结果通知地址
-     */
-    @Value("${wx.notify-domain}")
-    private String notifyDomain;
-
-    public String getMchId() {
-        return mchId;
-    }
-
-    public void setMchId(String mchId) {
-        this.mchId = mchId;
-    }
-
-    public String getMchSerialNo() {
-        return mchSerialNo;
-    }
-
-    public void setMchSerialNo(String mchSerialNo) {
-        this.mchSerialNo = mchSerialNo;
-    }
-
-    public String getPrivateKeyPath() {
-        return privateKeyPath;
-    }
-
-    public void setPrivateKeyPath(String privateKeyPath) {
-        this.privateKeyPath = privateKeyPath;
-    }
-
-    public String getKey() {
-        return key;
-    }
-
-    public void setKey(String key) {
-        this.key = key;
-    }
-
-    public String getAppid() {
-        return appid;
-    }
-
-    public void setAppid(String appid) {
-        this.appid = appid;
-    }
-
-    public String getDomain() {
-        return domain;
-    }
-
-    public void setDomain(String domain) {
-        this.domain = domain;
-    }
-
-    public String getNotifyDomain() {
-        return notifyDomain;
-    }
-
-    public void setNotifyDomain(String notifyDomain) {
-        this.notifyDomain = notifyDomain;
-    }
-
-
-}

+ 83 - 5
ruoyi-wx/src/main/java/com/ruoyi/wx/web/controller/WxPayController.java

@@ -1,19 +1,35 @@
 package com.ruoyi.wx.web.controller;
 
 
+import com.github.binarywang.wxpay.bean.notify.OriginNotifyResponse;
+import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
+import com.github.binarywang.wxpay.bean.notify.WxPayNotifyV3Result;
 import com.github.binarywang.wxpay.bean.request.WxPayOrderCloseRequest;
 import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest;
 import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
+import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderV3Request;
 import com.github.binarywang.wxpay.bean.result.WxPayOrderCloseResult;
 import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
 import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
+import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderV3Result;
+import com.github.binarywang.wxpay.bean.result.enums.TradeTypeEnum;
 import com.github.binarywang.wxpay.exception.WxPayException;
 import com.github.binarywang.wxpay.service.WxPayService;
+import com.google.gson.GsonBuilder;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.wx.web.domain.dto.WxPayDto;
+import com.ruoyi.wx.web.unit.WeixinNotifyUtils;
 import io.swagger.annotations.ApiOperation;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.math.BigDecimal;
+import java.util.concurrent.locks.ReentrantLock;
+
 /**
  *
  * 支付接口
@@ -25,7 +41,7 @@ public class WxPayController {
     @Autowired
     private WxPayService wxPayService;
 
-
+    private final ReentrantLock orderLock = new ReentrantLock();
     /**
      * <pre>
      * 查询订单(详见https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_2)
@@ -86,14 +102,36 @@ public class WxPayController {
     /**
      * 调用统一下单接口,并组装生成支付所需参数对象.
      *
-     * @param request 统一下单请求参数
-     * @param <T>     请使用{@link com.github.binarywang.wxpay.bean.order}包下的类
+     * @param dto 统一下单请求参数
      * @return 返回 {@link com.github.binarywang.wxpay.bean.order}包下的类对象
      */
     @ApiOperation(value = "统一下单,并组装所需支付参数")
     @PostMapping("/createOrder")
-    public <T> T createOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException {
-        return this.wxPayService.createOrder(request);
+    public AjaxResult createOrder(@RequestBody WxPayDto dto) throws WxPayException {
+        WxPayUnifiedOrderV3Request request = new WxPayUnifiedOrderV3Request();
+        request.setDescription("购买会员");
+        // 商品订单号
+        String orderNo = "ORDER_" + System.currentTimeMillis();
+        request.setOutTradeNo(orderNo);
+        // 订单金额
+        WxPayUnifiedOrderV3Request.Amount amount = new WxPayUnifiedOrderV3Request.Amount();
+        amount.setCurrency("CNY");
+        BigDecimal total = new BigDecimal("0");
+        if (StringUtils.isNotEmpty(dto.getMoney())) {
+            total = total.subtract(new BigDecimal(dto.getMoney()));
+        } else if (StringUtils.isNotEmpty(dto.getDiscount())) {
+            total = total.multiply(new BigDecimal(dto.getDiscount()).divide(new BigDecimal(10)));
+        }
+        amount.setTotal(total.intValue() * 100);
+        WxPayUnifiedOrderV3Result.JsapiResult orderV3 = this.wxPayService.createOrderV3(TradeTypeEnum.JSAPI, request);
+        AjaxResult result = new AjaxResult();
+        result.put("appId", orderV3.getAppId());
+        result.put("timeStamp", orderV3.getTimeStamp());
+        result.put("nonceStr", orderV3.getNonceStr());
+        result.put("packageValue", orderV3.getPackageValue());
+        result.put("signType", orderV3.getSignType());
+        result.put("outTradeNo", orderNo);
+        return result;
     }
 
     /**
@@ -108,4 +146,44 @@ public class WxPayController {
     public WxPayUnifiedOrderResult unifiedOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException {
         return this.wxPayService.unifiedOrder(request);
     }
+
+    /**
+     * 回调接口
+     */
+    @ApiOperation(value = "回调接口")
+    @PostMapping("/notify")
+    public AjaxResult notify(HttpServletRequest request, HttpServletResponse response, @RequestBody String notifyData) throws WxPayException {
+        log.debug("======= 接收到通知 =========");
+        // 获取请求头信息
+        SignatureHeader signatureHeader = WeixinNotifyUtils.getSignatureHeader(request);
+        // 将请求体json字符串转换为实体
+        OriginNotifyResponse notifyResponse = new GsonBuilder().create().fromJson(notifyData, OriginNotifyResponse.class);
+        // 支付成功通知
+        if ("TRANSACTION.SUCCESS".equals(notifyResponse.getEventType())) {
+            // 获取锁
+            if (orderLock.tryLock()) {
+                try {
+                    // 解析支付结果通知
+                    WxPayNotifyV3Result result = wxPayService.parseOrderNotifyV3Result(notifyData, signatureHeader);
+                    // TODO 此处根据返回结果处理订单信息
+                    log.debug("支付成功 ---> orderNo:" + result.getResult().getOutTradeNo());
+                    // 返回成功(无需数据,系统状态码为200即可)
+                    return AjaxResult.success();
+                } catch (Exception e) {
+                    // 支付结果解析异常/订单处理异常
+                    log.error("支付通知处理异常:", e);
+                    response.setStatus(500);// 支付成功通知处理失败时需要将状态码修改为5xx/4xx,微信才会重新发送回调
+                    return AjaxResult.error();
+                } finally {
+                    // 释放锁
+                    orderLock.unlock();
+                }
+            } else {
+                // 锁获取失败,返回异常,等待下次消息
+                response.setStatus(503);// 支付成功通知处理失败时需要将状态码修改为5xx/4xx,微信才会重新发送回调
+                return AjaxResult.error();
+            }
+        }
+        return AjaxResult.success();
+    }
 }

+ 64 - 0
ruoyi-wx/src/main/java/com/ruoyi/wx/web/domain/dto/WxPayDto.java

@@ -4,4 +4,68 @@ package com.ruoyi.wx.web.domain.dto;
  * 微信支付请求对象
  */
 public class WxPayDto {
+    /**
+     * 积分数
+     */
+    private Long points;
+
+    /**
+     * 会员折扣
+     */
+    private String discount;
+
+    /**
+     * 会员立减
+     */
+    private String money;
+
+    /**
+     * 当前用户
+     */
+    private String openId;
+
+    /**
+     * 总金额
+     */
+    private String tBal;
+
+    public Long getPoints() {
+        return points;
+    }
+
+    public void setPoints(Long points) {
+        this.points = points;
+    }
+
+    public String getDiscount() {
+        return discount;
+    }
+
+    public void setDiscount(String discount) {
+        this.discount = discount;
+    }
+
+    public String getMoney() {
+        return money;
+    }
+
+    public void setMoney(String money) {
+        this.money = money;
+    }
+
+    public String getOpenId() {
+        return openId;
+    }
+
+    public void setOpenId(String openId) {
+        this.openId = openId;
+    }
+
+    public String gettBal() {
+        return tBal;
+    }
+
+    public void settBal(String tBal) {
+        this.tBal = tBal;
+    }
 }

+ 18 - 0
ruoyi-wx/src/main/java/com/ruoyi/wx/web/unit/WeixinNotifyUtils.java

@@ -0,0 +1,18 @@
+package com.ruoyi.wx.web.unit;
+
+import com.github.binarywang.wxpay.bean.notify.SignatureHeader;
+import jakarta.servlet.http.HttpServletRequest;
+
+public class WeixinNotifyUtils {
+    /**
+     * 获取请求头签名
+     */
+    public static SignatureHeader getSignatureHeader(HttpServletRequest request) {
+        SignatureHeader signatureHeader = new SignatureHeader();
+        signatureHeader.setSignature(request.getHeader("Wechatpay-Signature"));
+        signatureHeader.setNonce(request.getHeader("Wechatpay-Nonce"));
+        signatureHeader.setSerial(request.getHeader("Wechatpay-Serial"));
+        signatureHeader.setTimeStamp(request.getHeader("Wechatpay-TimeStamp"));
+        return signatureHeader;
+    }
+}