Ver código fonte

feat : 微信支付回调调试修改

bilingfeng 2 anos atrás
pai
commit
f72f6b09d1

+ 1 - 1
game-module/game-manage/src/main/java/com/zanxiang/manage/ManageApplication.java

@@ -18,7 +18,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功1111 ( ´・・)ノ(._.`) \n" +
                 " ______  __     __     \n" +
                 "/_____/\\/__/\\ /__/\\    \n" +
                 "\\:::__\\/\\ \\::\\\\:.\\ \\   \n" +

+ 0 - 128
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/MiPayUtil.java

@@ -1,128 +0,0 @@
-package com.zanxiang.sdk.common.util;
-
-import com.zanxiang.common.exception.BaseException;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-
-/**
- * 生成签名类
- *
- * @author xufeng
- * @date 2022/7/14 17:39
- */
-
-public class MiPayUtil {
-
-    /**
-     * 生成签名
-     *
-     * @param method  HTTP请求方法 "get" / "post"
-     * @param urlPath CGI名字, eg: /v3/user/get_info
-     * @param params  URL请求参数
-     * @param secret  密钥
-     * @return 签名值
-     * @throws RuntimeException 不支持指定编码以及不支持指定的加密方法时抛出异常。
-     */
-    public static String miPaySin(String method, String urlPath, Map<String, String> params, String secret) {
-        String sig;
-        Object[] keys = params.keySet().toArray();
-        Arrays.sort(keys);
-        StringBuilder stringBuilder = new StringBuilder();
-        for (int i = 0; i < keys.length; i++) {
-            stringBuilder.append(keys[i]).append("=").append(params.get(keys[i]));
-            if (i != keys.length - 1) {
-                stringBuilder.append("&");
-            }
-        }
-        stringBuilder.append("&org_loc=").append(urlPath)
-                .append("&method=").append(method.toUpperCase())
-                .append("&secret=").append(secret);
-        //加密算法返回
-        try {
-            sig = WxPayUtil.HMACSHA256(stringBuilder.toString(), secret, Boolean.FALSE);
-        } catch (Exception e) {
-            throw new BaseException("米大师签名失败");
-        }
-        return sig;
-    }
-
-
-    /**
-     * 应用发货URL接口对腾讯回调传来的参数value值先进行一次编码方法,用于验签
-     * (编码规则为:除了 0~9 a~z A~Z !*() 之外其他字符按其ASCII码的十六进制加%进行表示,例如“-”编码为“%2D”)
-     * 参考 <回调发货URL的协议说明_V3>
-     *
-     * @param params 腾讯回调传参Map (key,value);
-     */
-    public static void codePayValue(Map<String, String> params) {
-        Set<String> keySet = params.keySet();
-        Iterator<String> itr = keySet.iterator();
-
-        while (itr.hasNext()) {
-            String key = itr.next();
-            String value = params.get(key);
-            value = encodeValue(value);
-            params.put(key, value);
-        }
-    }
-
-    /**
-     * 应用发货URL接口的编码规则
-     *
-     * @param s
-     * @return
-     */
-    public static String encodeValue(String s) {
-        String rexp = "[0-9a-zA-Z!*\\(\\)]";
-        StringBuffer sb = new StringBuffer(s);
-        StringBuffer sbRtn = new StringBuffer();
-        Pattern p = Pattern.compile(rexp);
-        char temp;
-        String tempStr;
-
-        for (int i = 0; i < sb.length(); i++) {
-            temp = sb.charAt(i);
-            tempStr = String.valueOf(temp);
-            Matcher m = p.matcher(tempStr);
-
-            boolean result = m.find();
-            if (!result) {
-                tempStr = hexString(tempStr);
-            }
-            sbRtn.append(tempStr);
-        }
-
-        return sbRtn.toString();
-    }
-
-    /**
-     * 应用发货URL 十六进制编码
-     *
-     * @param s
-     * @return
-     */
-    private static String hexString(String s) {
-        byte[] b = s.getBytes();
-        String retStr = "";
-        for (int i = 0; i < b.length; i++) {
-            String hex = Integer.toHexString(b[i] & 0xFF);
-            if (hex.length() == 1) {
-                hex = '0' + hex;
-            }
-            retStr = "%" + hex.toUpperCase();
-        }
-        return retStr;
-    }
-
-    // 编码方式
-    private static final String CONTENT_CHARSET = "UTF-8";
-
-    // HMAC算法
-    private static final String HMAC_ALGORITHM = "HmacSHA256";
-}

+ 0 - 42
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/QrCode.java

@@ -1,42 +0,0 @@
-package com.zanxiang.sdk.common.util;
-
-import com.google.zxing.BarcodeFormat;
-import com.google.zxing.EncodeHintType;
-import com.google.zxing.MultiFormatWriter;
-import com.google.zxing.client.j2se.MatrixToImageWriter;
-import com.google.zxing.common.BitMatrix;
-import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
-import com.zanxiang.common.constant.Constants;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author : lingfeng
- * @time : 2021-11-23
- * @description : 二维码
- */
-public class QrCode {
-
-    /**
-     * 生成二维码
-     *
-     * @param qrCode  : 链接
-     * @param imgPath : 图片路径
-     */
-    public static void createQrCodeImage(String qrCode, String imgPath) {
-        int height = 256;
-        String format = "png";
-        Map<EncodeHintType, Object> map = new HashMap<>(3);
-        map.put(EncodeHintType.CHARACTER_SET, Constants.UTF8);
-        map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
-        map.put(EncodeHintType.MARGIN, 2);
-        try {
-            BitMatrix bitMatrix = new MultiFormatWriter().encode(qrCode, BarcodeFormat.QR_CODE, height, height, map);
-            MatrixToImageWriter.writeToPath(bitMatrix, format, new File(imgPath).toPath());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-}

+ 37 - 4
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/WxPayUtil.java

@@ -31,6 +31,39 @@ public class WxPayUtil {
      */
     private static final String SIGN_HMACSHA256 = "HMACSHA256";
 
+    /**
+     * 米大师生成签名
+     *
+     * @param method  HTTP请求方法 "get" / "post"
+     * @param urlPath CGI名字, eg: /v3/user/get_info
+     * @param params  URL请求参数
+     * @param secret  密钥
+     * @return 签名值
+     * @throws RuntimeException 不支持指定编码以及不支持指定的加密方法时抛出异常。
+     */
+    public static String miPaySin(String method, String urlPath, Map<String, String> params, String secret) {
+        String sig;
+        Object[] keys = params.keySet().toArray();
+        Arrays.sort(keys);
+        StringBuilder stringBuilder = new StringBuilder();
+        for (int i = 0; i < keys.length; i++) {
+            stringBuilder.append(keys[i]).append("=").append(params.get(keys[i]));
+            if (i != keys.length - 1) {
+                stringBuilder.append("&");
+            }
+        }
+        stringBuilder.append("&org_loc=").append(urlPath)
+                .append("&method=").append(method.toUpperCase())
+                .append("&secret=").append(secret);
+        //加密算法返回
+        try {
+            sig = WxPayUtil.HMACSHA256(stringBuilder.toString(), secret, Boolean.FALSE);
+        } catch (Exception e) {
+            throw new BaseException("米大师签名失败");
+        }
+        return sig;
+    }
+
     /**
      * webUrl转换deepLink
      *
@@ -77,7 +110,7 @@ public class WxPayUtil {
     }
 
     /**
-     * 生成签名(MD5加密)
+     * 微信支付生成签名(MD5加密)
      *
      * @param data 待签名数据
      * @param key  API密钥
@@ -92,14 +125,14 @@ public class WxPayUtil {
     }
 
     /**
-     * 生成签名, 指定加密方式
+     * 微信支付生成签名, 指定加密方式
      *
      * @param data     待签名数据
      * @param key      API密钥
      * @param signType 签名加密方式
      * @return 签名
      */
-    private static String generateSignature(final Map<String, String> data, String key, String signType) throws Exception {
+    public static String generateSignature(final Map<String, String> data, String key, String signType) throws Exception {
         Set<String> keySet = data.keySet();
         String[] keyArray = keySet.toArray(new String[0]);
         Arrays.sort(keyArray);
@@ -164,7 +197,7 @@ public class WxPayUtil {
      * @return 加密结果
      * @throws Exception : 异常
      */
-    public static String HMACSHA256(String data, String key, boolean upperCase) throws Exception {
+    private static String HMACSHA256(String data, String key, boolean upperCase) throws Exception {
         Mac sha256HMAC = Mac.getInstance(SIGN_HMACSHA256);
         SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), SIGN_HMACSHA256);
         sha256HMAC.init(secretKey);

+ 14 - 16
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/PerformOrderServiceImpl.java

@@ -10,7 +10,6 @@ import com.zanxiang.common.enums.OrderStateEnum;
 import com.zanxiang.common.enums.ResEnum;
 import com.zanxiang.common.utils.DateUtils;
 import com.zanxiang.common.utils.MD5Util;
-import com.zanxiang.common.utils.ObjectUtil;
 import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.mybatis.entity.*;
 import com.zanxiang.sdk.common.util.HttpUtil;
@@ -40,6 +39,7 @@ import java.util.*;
 @Service
 @Transactional(rollbackFor = {RuntimeException.class, Exception.class})
 public class PerformOrderServiceImpl implements PerformOrderService {
+
     protected final Logger logger = LoggerFactory.getLogger(PlatformOrderServiceImpl.class);
 
     @Autowired
@@ -72,6 +72,7 @@ public class PerformOrderServiceImpl implements PerformOrderService {
     @Autowired
     private PayMerchantService payMerchantService;
 
+    @Override
     public Boolean pushCp(PlatformOrderDTO orderInfo) {
         logger.info("订单:{} 充值成功推送cp方回调 ----------start---------", orderInfo.getId());
         if (orderInfo.getCpStatus() == CpStatusEnum.SUCCESS.getCode()) {
@@ -89,10 +90,10 @@ public class PerformOrderServiceImpl implements PerformOrderService {
             logger.error("订单:{} 充值成功推送cp方回调失败,订单中GameId:{} 的游戏信息未找到", orderInfo.getId(), orderInfo.getGameId());
             return false;
         }
-        String app_key = gameInfo.getAppKey();
+        String appKey = gameInfo.getAppKey();
         String cpPaybackUrl = gameInfo.getCpPaybackUrl();
         if (StringUtils.isEmpty(gameInfo.getAppKey()) || StringUtils.isEmpty(gameInfo.getCpPaybackUrl())) {
-            logger.error("订单:{} 充值成功推送cp方回调失败,订单中GameId:{} 的游戏信息中,AppKey:{} 或 CpPaybackUrl:{} 为空", orderInfo.getId(), orderInfo.getGameId(), app_key, cpPaybackUrl);
+            logger.error("订单:{} 充值成功推送cp方回调失败,订单中GameId:{} 的游戏信息中,AppKey:{} 或 CpPaybackUrl:{} 为空", orderInfo.getId(), orderInfo.getGameId(), appKey, cpPaybackUrl);
             return false;
         }
         HashMap<String, String> map = new HashMap<>();
@@ -104,12 +105,12 @@ public class PerformOrderServiceImpl implements PerformOrderService {
         map.put("product_id", orderInfo.getProductId());
         map.put("product_price", String.valueOf(orderInfo.getAmount()));
         map.put("ext", orderInfo.getExt());
-        map.put("app_key", app_key);
+        map.put("app_key", appKey);
         TreeMap<String, String> keySort = new TreeMap<>(map);
         //拼接字符串
         String param = Signer.getSignCheckContent(keySort);
         //拼接app_key
-        param += "&app_key=" + app_key;
+        param += "&app_key=" + appKey;
         //生成sign
         String sign = MD5Util.MD5Encode(param, Constants.UTF8);
         map.remove("app_key");
@@ -119,17 +120,14 @@ public class PerformOrderServiceImpl implements PerformOrderService {
         try {
             Integer i = orderInfo.getCpNotifyCnt() + 1;
             String s = HttpUtil.postData(cpPaybackUrl, param);
-            Boolean pushSuccess = false;
-            if (s.trim().toLowerCase(Locale.ROOT).equals(ResEnum.SUCCESS.getMsg())) {
-                pushSuccess = true;
-                //更新订单状态
-                Order order = new Order();
-                order.setId(orderId);
-                order.setCpNotifyCnt(i);
-                order.setLastCpNotifyTime(LocalDateTime.now());
-                order.setCpStatus(pushSuccess ? CpStatusEnum.SUCCESS.getCode() : CpStatusEnum.FAILLE.getCode());
-                platformOrderService.updateById(order);
-            }
+            boolean pushSuccess = s.trim().toLowerCase(Locale.ROOT).equals(ResEnum.SUCCESS.getMsg());
+            //更新订单状态
+            Order order = new Order();
+            order.setId(orderId);
+            order.setCpNotifyCnt(i);
+            order.setLastCpNotifyTime(LocalDateTime.now());
+            order.setCpStatus(pushSuccess ? CpStatusEnum.SUCCESS.getCode() : CpStatusEnum.FAILLE.getCode());
+            platformOrderService.updateById(order);
             LogPayCp logPayCp = new LogPayCp();
             logPayCp.setOrderId(orderId);
             logPayCp.setCpOrderId(orderInfo.getCpOrderId());

+ 3 - 3
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/pay/MiPayServiceImpl.java

@@ -13,8 +13,8 @@ import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.common.utils.URIUtil;
 import com.zanxiang.mybatis.entity.GamePayWay;
 import com.zanxiang.sdk.common.constant.MiPayConstants;
-import com.zanxiang.sdk.common.util.MiPayUtil;
 import com.zanxiang.sdk.common.util.RedisUtil;
+import com.zanxiang.sdk.common.util.WxPayUtil;
 import com.zanxiang.sdk.domain.bo.ProductPayParamBO;
 import com.zanxiang.sdk.domain.dto.PlatformOrderDTO;
 import com.zanxiang.sdk.service.GamePayWayService;
@@ -132,7 +132,7 @@ public class MiPayServiceImpl extends PayService implements OrderPayService {
         paramMap.put("pf", "android");
         String urlPath = this.isSand == 1 ? "/cgi-bin/midas/sandbox/getbalance" : "/cgi-bin/midas/getbalance";
         String appKey = this.isSand == 1 ? miPayConfig.getAppKeyDev() : miPayConfig.getAppKey();
-        String sig = MiPayUtil.miPaySin("POST", urlPath, paramMap, appKey);
+        String sig = WxPayUtil.miPaySin("POST", urlPath, paramMap, appKey);
         paramMap.put("sig", sig);
         Map<String, String> result = this.miPayApi(MiPayConstants.BALANCE_URL, miPayConfig, paramMap);
         return Long.valueOf(result.get("balance"));
@@ -156,7 +156,7 @@ public class MiPayServiceImpl extends PayService implements OrderPayService {
         paramMap.put("bill_no", orderInfo.getId());
         String urlPath = this.isSand == 1 ? "/cgi-bin/midas/sandbox/getbalance" : "/cgi-bin/midas/getbalance";
         String appKey = this.isSand == 1 ? miPayConfig.getAppKeyDev() : miPayConfig.getAppKey();
-        String sig = MiPayUtil.miPaySin("POST", urlPath, paramMap, appKey);
+        String sig = WxPayUtil.miPaySin("POST", urlPath, paramMap, appKey);
         paramMap.put("sig", sig);
         Map<String, String> result = this.miPayApi(MiPayConstants.PAY_URL, miPayConfig, paramMap);
         return result.get("bill_no");

+ 0 - 69
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/MiPayService.java

@@ -1,69 +0,0 @@
-package com.zanxiang.sdk.service;
-
-import com.zanxiang.common.domain.MiPayConfig;
-import com.zanxiang.sdk.common.miPay.RequestParam;
-
-/**
- * 米大师支付服务
- *
- * @author xufeng
- * @date 2022-07-14
- */
-public interface MiPayService {
-
-    /**
-     * 虚拟币扣除
-     *
-     * @param orderId 订单号
-     * @param userId  玩家id
-     * @return
-     */
-    Boolean midasPay(Long userId, String orderId);
-
-
-    /**
-     * 扣除取消
-     *
-     * @param orderId 订单号
-     * @param userId  玩家id
-     * @return
-     */
-    Boolean midasCancelPay(Long userId, String orderId);
-
-    /**
-     * 钱包余额查询
-     *
-     * @param orderId 订单号
-     * @param userId  玩家id
-     * @return
-     */
-    Boolean midasGetBalance(Long userId, String orderId);
-
-    /**
-     * 米大师赠送
-     *
-     * @param userId
-     * @param orderId
-     * @param presentCounts
-     * @return
-     */
-    Boolean midasPresent(Long userId, String orderId, Integer presentCounts);
-
-    /**
-     * 米大师配置
-     *
-     * @param gameId 游戏id
-     * @return
-     */
-    MiPayConfig midasConfig(Long gameId);
-
-    /**
-     * 米大师通过参数生成
-     *
-     * @param gameId 游戏id
-     * @param userId 玩家id
-     * @return
-     */
-    RequestParam getCommonParam(Long gameId, String userId);
-
-}