From bd6229ebd9cb543a22944ecb1142fad92b675dce Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 13 十月 2025 14:26:25 +0800
Subject: [PATCH] bug 修复

---
 server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java |  153 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 147 insertions(+), 6 deletions(-)

diff --git a/server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java b/server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java
index b7a6a64..1c2656f 100644
--- a/server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java
+++ b/server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java
@@ -1,15 +1,25 @@
 package com.doumee.api.business;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.config.wx.TransferDetailEntityNew;
 import com.doumee.config.wx.WxMiniConfig;
+import com.doumee.core.constants.Constants;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.ApiResponse;
 import com.doumee.service.business.OrdersService;
+import com.doumee.service.business.WithdrawalOrdersService;
+import com.wechat.pay.java.core.Config;
 import com.wechat.pay.java.core.RSAAutoCertificateConfig;
+import com.wechat.pay.java.core.RSAPublicKeyConfig;
 import com.wechat.pay.java.core.notification.NotificationConfig;
 import com.wechat.pay.java.core.notification.NotificationParser;
 import com.wechat.pay.java.core.notification.RequestParam;
 import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction;
 import com.wechat.pay.java.service.refund.model.RefundNotification;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.mgt.DefaultSecurityManager;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -20,7 +30,11 @@
 import javax.servlet.ServletInputStream;
 import javax.servlet.http.HttpServletRequest;
 import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Created by IntelliJ IDEA.
@@ -36,13 +50,17 @@
     @Autowired
     private OrdersService ordersService;
 
+    @Autowired
+    private WithdrawalOrdersService withdrawalOrdersService;
+
     /**
      * 銆愬井淇℃敮浠樸�戝紓姝ラ�氱煡
      *
      * @return
      */
-    @PostMapping("/api/wxPayNotify")
+    @PostMapping("/web/wxPayNotify")
     public ApiResponse wxPay_notify(HttpServletRequest request) {
+        log.error("寰俊鏀粯鍥炶皟缁撴灉寮�濮�===========" );
         try {
             ServletInputStream inputStream = request.getInputStream();
             StringBuffer stringBuffer = new StringBuffer();
@@ -67,16 +85,21 @@
                     .body(body)
                     .build();
 
-            NotificationConfig config = new RSAAutoCertificateConfig.Builder()
+            NotificationConfig config = new RSAPublicKeyConfig.Builder()
                     .merchantId(WxMiniConfig.wxProperties.getMchId())
                     .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath())
+                    .publicKeyFromPath(WxMiniConfig.wxProperties.getPubKeyPath())
+                    .publicKeyId(WxMiniConfig.wxProperties.getPayPublicKeyId())
                     .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer())
                     .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key())
                     .build();
 
 
             NotificationParser parser = new NotificationParser(config);
+
+
             Transaction result = parser.parse(requestParam, Transaction.class);
+            log.error("鏀粯鍥炶皟淇℃伅锛歿}"+ JSONObject.toJSONString(result));
             //鑷畾涔夎鍗曞彿
             String outTradeNo = result.getOutTradeNo();
             //寰俊璁㈠崟鍙�
@@ -93,11 +116,12 @@
             } else {
                 // 鏀粯澶辫触
                 switch (result.getAttach()) {
-                    case "createGoodsOrder": {
+                    case "createOrder": {
                         break;
                     }
                 }
             }
+            log.error("寰俊鏀粯鍥炶皟缁撴灉缁撴潫===========" );
             return ApiResponse.success("澶勭悊鎴愬姛!");
         } catch (Exception e) {
             e.printStackTrace();
@@ -105,7 +129,7 @@
             return ApiResponse.failed("");
         }
     }
-    @PostMapping("/api/wxRefundNotify")
+    @PostMapping("/web/wxRefundNotify")
     public ApiResponse wxRefundNotify(HttpServletRequest request) {
         log.error("寰俊閫�娆惧洖璋冪粨鏋滃紑濮�===========" );
         try {
@@ -134,13 +158,20 @@
                     .body(body)
                     .build();
 
-            NotificationConfig config = new RSAAutoCertificateConfig.Builder()
+            NotificationConfig config = /*new RSAAutoCertificateConfig.Builder()
                     .merchantId(WxMiniConfig.wxProperties.getMchId())
                     .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath())
                     .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer())
                     .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key())
+                    .build();*/
+            new RSAPublicKeyConfig.Builder()
+                    .merchantId(WxMiniConfig.wxProperties.getMchId())
+                    .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath())
+                    .publicKeyFromPath(WxMiniConfig.wxProperties.getPubKeyPath())
+                    .publicKeyId(WxMiniConfig.wxProperties.getPayPublicKeyId())
+                    .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer())
+                    .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key())
                     .build();
-
 
             NotificationParser parser = new NotificationParser(config);
             RefundNotification result = parser.parse(requestParam, RefundNotification.class);
@@ -156,4 +187,114 @@
         }
     }
 
+
+
+
+    /**
+     * 寰俊鍟嗘埛闆剁嚎杞处 - 鍥炶皟閫氱煡
+     * @Context娉ㄨВ  鎶奌TTP璇锋眰涓婁笅鏂囧璞℃敞鍏ヨ繘鏉ワ紝HttpServletRequest銆丠ttpServletResponse銆乁riInfo 绛�
+     * @return
+     */
+    @PostMapping(value = "/web/wechat/transferNotify")
+    public ApiResponse transferNotify( HttpServletRequest request) {
+        Map<String,String> errMap = new HashMap<>();
+        try {
+            log.error("寰俊鍟嗘埛闆剁嚎杞处 - 鍥炶皟閫氱煡 /wxpay/callback");
+
+            Config config = new RSAPublicKeyConfig.Builder()
+                .merchantId(WxMiniConfig.wxProperties.getSubMchId()) //寰俊鏀粯鐨勫晢鎴峰彿
+                .privateKeyFromPath(WxMiniConfig.wxProperties.getWechatPrivateKeyPath()) // 鍟嗘埛API璇佷功绉侀挜鐨勫瓨鏀捐矾寰�
+                .publicKeyFromPath(WxMiniConfig.wxProperties.getWechatPubKeyPath()) //寰俊鏀粯鍏挜鐨勫瓨鏀捐矾寰�
+                .publicKeyId(WxMiniConfig.wxProperties.getWechatPayPublicKeyId()) //寰俊鏀粯鍏挜ID
+                .merchantSerialNumber(WxMiniConfig.wxProperties.getWechatSerialNumer()) //鍟嗘埛API璇佷功搴忓垪鍙�
+                .apiV3Key(WxMiniConfig.wxProperties.getWechatApiV3Key()) //APIv3瀵嗛挜
+                .build();
+
+            TransferDetailEntityNew entity = wxSuccessCallback(request,config);
+            log.error("transfer ok.{}",entity);
+            //鍥炶皟鎴愬姛鍚庡鐞嗚嚜宸辩殑涓氬姟
+            if(entity != null){
+                if((entity.getState().equals(Constants.SUCCESS)
+                        || entity.getState().equals(Constants.CANCELLED)
+                        || entity.getState().equals(Constants.FAIL))
+                        && StringUtils.isNotBlank(entity.getOutBillNo())){
+                    withdrawalOrdersService.transferSuccess(entity.getOutBillNo(),entity.getState().equals(Constants.SUCCESS)?true:false);
+                }
+            }
+            return ApiResponse.success("澶勭悊鎴愬姛");
+        } catch (Exception e) {
+            log.error("寰俊鍟嗘埛闆剁嚎杞处 - 鍥炶皟閫氱煡 /wxpay/callback锛氬紓甯革紒", e);
+            errMap.put("code", "FAIL");
+            errMap.put("message", "鏈嶅姟鍣ㄥ唴閮ㄩ敊璇�");
+            return ApiResponse.failed("澶勭悊澶辫触");
+        }
+    }
+
+    public TransferDetailEntityNew wxSuccessCallback(HttpServletRequest request,Config config) throws IOException {
+        String requestBody = getBodyString(request, "UTF-8");
+        //璇佷功搴忓垪鍙凤紙寰俊骞冲彴锛�   楠岀鐨勨�滃井淇℃敮浠樺钩鍙拌瘉涔︹�濇墍瀵瑰簲鐨勫钩鍙拌瘉涔﹀簭鍒楀彿
+        String wechatPaySerial = request.getHeader("Wechatpay-Serial");
+        //寰俊浼犻�掕繃鏉ョ殑绛惧悕   楠岀鐨勭鍚嶅��
+        String wechatSignature = request.getHeader("Wechatpay-Signature");
+        //楠岀鐨勬椂闂存埑
+        String wechatTimestamp = request.getHeader("Wechatpay-Timestamp");
+        //楠岀鐨勯殢鏈哄瓧绗︿覆
+        String wechatpayNonce = request.getHeader("Wechatpay-Nonce");
+        // 1. 鏋勯�� RequestParam
+        RequestParam requestParam = new RequestParam.Builder()
+                .serialNumber(wechatPaySerial)
+                .nonce(wechatpayNonce)
+                .signature(wechatSignature)
+                .timestamp(wechatTimestamp)
+                .body(requestBody)
+                .build();
+        // 2. 鏋勫缓Config RSAPublicKeyConfig
+//        Config config = new RSAPublicKeyConfig.Builder()
+//                        .merchantId(WxMiniConfig.wxProperties.getMchId()) //寰俊鏀粯鐨勫晢鎴峰彿
+//                        .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath()) // 鍟嗘埛API璇佷功绉侀挜鐨勫瓨鏀捐矾寰�
+//                        .publicKeyFromPath(WxMiniConfig.wxProperties.getWechatPubKeyPath()) //寰俊鏀粯鍏挜鐨勫瓨鏀捐矾寰�
+//                        .publicKeyId(WxMiniConfig.wxProperties.getWechatPayPublicKeyId()) //寰俊鏀粯鍏挜ID
+//                        .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer()) //鍟嗘埛API璇佷功搴忓垪鍙�
+//                        .apiV3Key("") //APIv3瀵嗛挜
+//                        .build();
+        log.info("WxPayService.wxPaySuccessCallback request : wechatPaySerial is [{}]  , wechatSignature is [{}] , wechatTimestamp is [{}] , wechatpayNonce  is [{}] , requestBody is [{}]",wechatPaySerial,wechatSignature,wechatTimestamp,wechatpayNonce,requestBody);
+        // 3. 鍒濆鍖� NotificationParser
+        NotificationParser parser = new NotificationParser((NotificationConfig) config);
+        try {
+            TransferDetailEntityNew entity = parser.parse(requestParam, TransferDetailEntityNew.class);
+            log.info("WxPayService.wxPaySuccessCallback responseBody: {}", entity != null ? JSON.toJSONString(entity) : null);
+            return entity;
+        } catch (Exception e) {
+            log.error("Exception occurred while processing", e);
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"绯荤粺鍐呴儴閿欒");
+        }
+    }
+
+    /**
+     * 鑾峰彇post璇锋眰涓殑Body
+     *
+     * @param request httpRequest
+     * @return body瀛楃涓�
+     */
+    public static String getBodyString(HttpServletRequest request, String charSet) throws IOException {
+        StringBuilder sb = new StringBuilder();
+        InputStream inputStream = null;
+        BufferedReader reader = null;
+        try {
+            inputStream = request.getInputStream();
+            //璇诲彇娴佸苟灏嗘祦鍐欏嚭鍘�,閬垮厤鏁版嵁娴佷腑鏂�;
+            reader = new BufferedReader(new InputStreamReader(inputStream, charSet));
+            String line;
+            while ((line = reader.readLine()) != null) {
+                sb.append(line);
+            }
+        } catch (IOException e) {
+            log.error("鑾峰彇requestBody寮傚父", e);
+        } finally {
+            inputStream.close();
+            reader.close();
+        }
+        return sb.toString();
+    }
+
 }

--
Gitblit v1.9.3