From c4828a792d0722eab9468256a06d06be67d167d7 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期三, 03 九月 2025 10:44:09 +0800
Subject: [PATCH] 前端
---
server/admin/src/main/java/com/doumee/api/business/PaymentCallback.java | 147 +++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 142 insertions(+), 5 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..a1b873b 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,24 @@
package com.doumee.api.business;
+import com.alibaba.fastjson.JSON;
+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 +29,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,12 +49,15 @@
@Autowired
private OrdersService ordersService;
+ @Autowired
+ private WithdrawalOrdersService withdrawalOrdersService;
+
/**
* 銆愬井淇℃敮浠樸�戝紓姝ラ�氱煡
*
* @return
*/
- @PostMapping("/api/wxPayNotify")
+ @PostMapping("/web/wxPayNotify")
public ApiResponse wxPay_notify(HttpServletRequest request) {
try {
ServletInputStream inputStream = request.getInputStream();
@@ -67,15 +83,19 @@
.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);
//鑷畾涔夎鍗曞彿
String outTradeNo = result.getOutTradeNo();
@@ -105,7 +125,7 @@
return ApiResponse.failed("");
}
}
- @PostMapping("/api/wxRefundNotify")
+ @PostMapping("/web/wxRefundNotify")
public ApiResponse wxRefundNotify(HttpServletRequest request) {
log.error("寰俊閫�娆惧洖璋冪粨鏋滃紑濮�===========" );
try {
@@ -134,13 +154,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 +183,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