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