Parcourir la source

fix : 解决微信和支付宝支付逻辑中的高并发引起的全局变量bug

bilingfeng il y a 1 an
Parent
commit
643ff22b5b

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java

@@ -23,7 +23,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <手机号正则修改> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <解决微信和支付宝支付逻辑中的高并发引起的全局变量bug> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 5 - 0
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/pojo/dto/WxPayConfigDTO.java

@@ -43,4 +43,9 @@ public class WxPayConfigDTO {
      * 签名加密类型
      */
     private String signType;
+
+    /**
+     * 支付方式主键id
+     */
+    private Long gamePayWayId;
 }

+ 10 - 19
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/AliPayService.java

@@ -78,16 +78,6 @@ public class AliPayService extends PayBaseService {
     @Value("${payConfig.aliPay.notifyUrl}")
     private String notifyUrlConfig;
 
-    /**
-     * 同步回调地址
-     */
-    private String notifyUrl;
-
-    /**
-     * 商户信息
-     */
-    private PayMerchantDTO payMerchant;
-
     @Autowired
     private IPayMerchantService payMerchantService;
 
@@ -102,29 +92,31 @@ public class AliPayService extends PayBaseService {
         //初始化支付配置
         this.configInit(gamePayWayDTO);
         //回调地址中拼接游戏具体支付方式
-        this.notifyUrl = this.notifyUrlConfig + "?" + "gamePayWayId=" + this.attach.getGamePayWayId();
+        String notifyUrl = this.notifyUrlConfig + "?" + "gamePayWayId=" + gamePayWayDTO.getId();
         //支付方式
         int payDevice = product.getPayDevice().intValue();
         //不同的支付途径
         Map<String, Object> resultMap;
         switch (payDevice) {
             case 1:
-                resultMap = this.pcPay(product);
+                resultMap = this.pcPay(product, notifyUrl);
                 break;
             case 2:
-                resultMap = this.h5Pay(product);
+                resultMap = this.h5Pay(product, notifyUrl);
                 break;
             case 3:
-                resultMap = this.appPay(product);
+                resultMap = this.appPay(product, notifyUrl);
                 break;
             default:
                 throw new RuntimeException("未知支付方式");
         }
         //订单支付添加过期缓存
         this.orderExpire(product.getOutTradeNo());
+        //商户信息
+        PayMerchantDTO payMerchantDTO = payMerchantService.getByMerchantNo(gamePayWayDTO.getMerchantNo());
         //更新订单商户信息
         orderService.update(new LambdaUpdateWrapper<Order>()
-                .set(Order::getMerchantNo, payMerchant.getMerchantNo())
+                .set(Order::getMerchantNo, payMerchantDTO.getMerchantNo())
                 .eq(Order::getOrderId, product.getOutTradeNo()));
         log.error("返回支付参数 resultMap : {}", JsonUtil.toString(resultMap));
         //返回结果
@@ -203,7 +195,7 @@ public class AliPayService extends PayBaseService {
         }
     }
 
-    private Map<String, Object> h5Pay(ProductPayParamDTO product) {
+    private Map<String, Object> h5Pay(ProductPayParamDTO product, String notifyUrl) {
         AlipayTradeWapPayResponse response;
         try {
             response = Factory.Payment.Wap().asyncNotify(notifyUrl)
@@ -306,7 +298,7 @@ public class AliPayService extends PayBaseService {
         return JsonUtil.toMap(JsonUtil.toString(aliPayLinkDTO.getData().getBizData().getInvokeAlipayData()), Map.class, String.class);
     }
 
-    private Map<String, Object> pcPay(ProductPayParamDTO product) {
+    private Map<String, Object> pcPay(ProductPayParamDTO product, String notifyUrl) {
         AlipayTradePagePayResponse response;
         try {
             response = Factory.Payment.Page().asyncNotify(notifyUrl)
@@ -327,7 +319,7 @@ public class AliPayService extends PayBaseService {
         return payParamMap;
     }
 
-    private Map<String, Object> appPay(ProductPayParamDTO product) {
+    private Map<String, Object> appPay(ProductPayParamDTO product, String notifyUrl) {
         AlipayTradeAppPayResponse response;
         try {
             response = Factory.Payment.App().asyncNotify(notifyUrl)
@@ -351,7 +343,6 @@ public class AliPayService extends PayBaseService {
     private void configInit(GamePayWayDTO gamePayWayDTO) {
         //商户信息
         PayMerchantDTO payMerchantDTO = payMerchantService.getByMerchantNo(gamePayWayDTO.getMerchantNo());
-        this.payMerchant = payMerchantDTO;
         //查询支付应用信息
         PayApplicationDTO payApplicationDTO = payApplicationService.getPayApplicationByAppId(gamePayWayDTO.getAppId());
         //支付参数

+ 0 - 11
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/PayBaseService.java

@@ -8,7 +8,6 @@ import com.zanxiang.game.module.sdk.enums.OrderStateEnum;
 import com.zanxiang.game.module.sdk.listener.OrderPaySuccessEvent;
 import com.zanxiang.game.module.sdk.pojo.dto.GamePayWayDTO;
 import com.zanxiang.game.module.sdk.pojo.dto.PlatformOrderDTO;
-import com.zanxiang.game.module.sdk.pojo.dto.ProductPayAttachParamDTO;
 import com.zanxiang.game.module.sdk.pojo.dto.ProductPayParamDTO;
 import com.zanxiang.game.module.sdk.service.IGamePayWayService;
 import com.zanxiang.game.module.sdk.service.IOrderService;
@@ -52,10 +51,6 @@ public abstract class PayBaseService {
     @Autowired
     private RedisUtil<String> redisUtil;
 
-    /**
-     * 自定义参数
-     */
-    protected ProductPayAttachParamDTO attach;
 
     /**
      * 创建订单支付参数
@@ -77,12 +72,6 @@ public abstract class PayBaseService {
             product.setGameId(gameId);
             product.setTotalFee(String.valueOf(platformOrderDTO.getAmount()));
             product.setOutTradeNo(platformOrderDTO.getOrderId());
-            ProductPayAttachParamDTO attachBO = new ProductPayAttachParamDTO();
-            attachBO.setUserId(product.getUserId());
-            attachBO.setOrderId(product.getOutTradeNo());
-            attachBO.setPayWay(product.getPayWay());
-            attachBO.setGamePayWayId(gamePayWayDTO.getId());
-            this.attach = attachBO;
             return this.create(product, gamePayWayDTO);
         } catch (Exception e) {
             log.error("订单支付参数生成异常, ProductPayParamBO : {} , e: {}", JsonUtil.toString(product), e.getMessage());

+ 24 - 25
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/pay/WxPayService.java

@@ -76,11 +76,6 @@ public class WxPayService extends PayBaseService {
     @Value("${payConfig.wxPay.notifyUrl}")
     private String notifyUrl;
 
-    /**
-     * 微信支付配置
-     */
-    private WxPayConfigDTO config;
-
     @Autowired
     private IOrderPayParamService orderPayParamService;
 
@@ -102,7 +97,7 @@ public class WxPayService extends PayBaseService {
     @Override
     public Map<String, Object> create(ProductPayParamDTO product, GamePayWayDTO gamePayWayDTO) {
         //初始化配置
-        this.configInit(gamePayWayDTO);
+        WxPayConfigDTO config = this.configInit(gamePayWayDTO);
         //支付方式
         int payDevice = product.getPayDevice().intValue();
         //不同的支付途径
@@ -110,17 +105,17 @@ public class WxPayService extends PayBaseService {
         switch (payDevice) {
             case 1:
                 //PC
-                resultMap = this.pcPay(product);
+                resultMap = this.pcPay(product, config);
                 break;
             case 2:
                 //H5
-                resultMap = this.h5Pay(product);
+                resultMap = this.h5Pay(product, config);
                 break;
             case 4:
             case 6:
             case 7:
                 //小程序
-                resultMap = this.miniAppPay(product);
+                resultMap = this.miniAppPay(product, config);
                 break;
             default:
                 throw new RuntimeException("未知支付方式");
@@ -144,18 +139,16 @@ public class WxPayService extends PayBaseService {
         String requestStr = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
         // 解析xml成map
         Map<String, String> packageParams = XmlUtil.xmlToMap(requestStr);
-        log.error("微信支付回调参数, packageParams : {}, config : {}", JsonUtil.toString(packageParams), JsonUtil.toString(config));
+        log.error("微信支付回调参数, packageParams : {}", JsonUtil.toString(packageParams));
         //获取订单信息
         String attachStr = packageParams.get("attach");
         ProductPayAttachParamDTO attachBO = JsonUtil.toObj(attachStr, ProductPayAttachParamDTO.class);
-
         log.error("微信支付回调参数, attachBO : {}", JsonUtil.toString(attachBO));
-
         if (attachBO == null) {
             log.info("回调参数中attach值为空");
             return null;
         }
-        configInit(gamePayWayService.getById(attachBO.getGamePayWayId()));
+        WxPayConfigDTO config = this.configInit(gamePayWayService.getById(attachBO.getGamePayWayId()));
         // 账号信息
         String key = config.getApiKey();
         // 判断签名是否正确
@@ -171,7 +164,7 @@ public class WxPayService extends PayBaseService {
             String orderNo = packageParams.get("out_trade_no");
             String totalFee = String.valueOf(Float.parseFloat(packageParams.get("total_fee")) / 100);
             log.info("微信订单号回调成功, orderId : {}", orderNo);
-            if (paySuccess(attachBO.getOrderId(), totalFee, packageParams.get("transaction_id"))) {
+            if (paySuccess(orderNo, totalFee, packageParams.get("transaction_id"))) {
                 // 通知微信.异步确认成功.必写.不然会一直通知后台.八次之后就认为交易失败了
                 xmlMap.put("return_code", "SUCCESS");
                 xmlMap.put("return_msg", "OK");
@@ -190,9 +183,9 @@ public class WxPayService extends PayBaseService {
         return HttpStatusEnum.SUCCESS.getMsg();
     }
 
-    private Map<String, Object> pcPay(ProductPayParamDTO product) {
+    private Map<String, Object> pcPay(ProductPayParamDTO product, WxPayConfigDTO config) {
         //下单
-        Map<String, String> successMap = this.unifiedOrder(product, WX_PAY_NATIVE, null);
+        Map<String, String> successMap = this.unifiedOrder(product, WX_PAY_NATIVE, null, config);
         //获取二维码链接
         String urlCode = successMap.get("code_url");
         //判断是否获取到支付链接
@@ -207,9 +200,9 @@ public class WxPayService extends PayBaseService {
         return payParamMap;
     }
 
-    private Map<String, Object> h5Pay(ProductPayParamDTO product) {
+    private Map<String, Object> h5Pay(ProductPayParamDTO product, WxPayConfigDTO config) {
         //下单
-        Map<String, String> successMap = this.unifiedOrder(product, WX_PAY_MWEB, null);
+        Map<String, String> successMap = this.unifiedOrder(product, WX_PAY_MWEB, null, config);
         //获取h5支付链接
         String urlCode = successMap.get("mweb_url");
         if (Strings.isBlank(urlCode)) {
@@ -231,7 +224,7 @@ public class WxPayService extends PayBaseService {
         return payParamMap;
     }
 
-    private Map<String, Object> miniAppPay(ProductPayParamDTO product) {
+    private Map<String, Object> miniAppPay(ProductPayParamDTO product, WxPayConfigDTO config) {
         try {
             //用户openId
             String openId = product.getOpenId();
@@ -241,7 +234,7 @@ public class WxPayService extends PayBaseService {
                         config.getAppletType()).get("openid");
             }
             //下单
-            Map<String, String> successMap = this.unifiedOrder(product, WX_PAY_JSAPI, openId);
+            Map<String, String> successMap = this.unifiedOrder(product, WX_PAY_JSAPI, openId, config);
             // 支付参数
             String prepayId = successMap.get("prepay_id");
             // 随机字符串
@@ -289,7 +282,7 @@ public class WxPayService extends PayBaseService {
         GamePayWayDTO gamePayWayDTO = gamePayWayService.getGamePayWay(platformOrderDTO.getGameId(),
                 platformOrderDTO.getPayWayId(), platformOrderDTO.getPayDeviceId());
         //初始化配置
-        this.configInit(gamePayWayDTO);
+        WxPayConfigDTO config = this.configInit(gamePayWayDTO);
         try {
             Map<String, String> paramData = new HashMap<>(6);
             paramData.put("appid", config.getAppId());
@@ -315,7 +308,12 @@ public class WxPayService extends PayBaseService {
         }
     }
 
-    private Map<String, String> unifiedOrder(ProductPayParamDTO product, String tradeType, String openId) {
+    private Map<String, String> unifiedOrder(ProductPayParamDTO product, String tradeType, String openId, WxPayConfigDTO config) {
+        ProductPayAttachParamDTO attachBO = new ProductPayAttachParamDTO();
+        attachBO.setUserId(product.getUserId());
+        attachBO.setOrderId(product.getOutTradeNo());
+        attachBO.setPayWay(product.getPayWay());
+        attachBO.setGamePayWayId(config.getGamePayWayId());
         try {
             Map<String, String> paramData = new HashMap<>(13);
             paramData.put("appid", config.getAppId());
@@ -328,7 +326,7 @@ public class WxPayService extends PayBaseService {
             paramData.put("spbill_create_ip", product.getSpbillCreateIp());
             paramData.put("notify_url", notifyUrl);
             paramData.put("trade_type", tradeType);
-            paramData.put("attach", JsonUtil.toString(this.attach));
+            paramData.put("attach", JsonUtil.toString(attachBO));
             paramData.put("sign_type", config.getSignType());
             //小程序商城下单需要携带openId
             if (Strings.isNotBlank(openId)) {
@@ -357,7 +355,7 @@ public class WxPayService extends PayBaseService {
         }
     }
 
-    private void configInit(GamePayWayDTO gamePayWayDTO) {
+    private WxPayConfigDTO configInit(GamePayWayDTO gamePayWayDTO) {
         //商户信息
         PayMerchantDTO payMerchantDTO;
         //支付应用信息
@@ -376,7 +374,8 @@ public class WxPayService extends PayBaseService {
         payConfigBO.setAppSecret(payApplicationDTO.getAppSecret());
         payConfigBO.setAppletType(payApplicationDTO.getType());
         payConfigBO.setMachName(payMerchantDTO.getMerchantName());
+        payConfigBO.setGamePayWayId(gamePayWayDTO.getId());
         //赋值配置信息
-        this.config = payConfigBO;
+        return payConfigBO;
     }
 }