Browse Source

feat : CP联调修改

bilingfeng 2 years ago
parent
commit
64568354c3

+ 0 - 39
game-module/game-sdk/src/main/java/com/zanxiang/sdk/constant/MiPayConstants.java

@@ -1,39 +0,0 @@
-package com.zanxiang.sdk.constant;
-
-/**
- * @author xufeng
- * @date 2022/7/14 17:26
- */
-public class MiPayConstants {
-
-    /**
-     * 米大师域名
-     */
-    public final static String MI_PAY_HOST = "https://api.weixin.qq.com";
-
-    /**
-     * 支付
-     */
-    public final static String PAY_URL = "/cgi-bin/midas/pay";
-
-    /**
-     * 赠送
-     */
-    public final static String PRESENT_URL = "/cgi-bin/midas/present";
-
-    /**
-     * 取消支付
-     */
-    public final static String CANCEL_URL = "/cgi-bin/midas/cancelpay";
-
-    /**
-     * 获取钱包
-     */
-    public final static String BALANCE_URL = "/cgi-bin/midas/getbalance";
-
-    /**
-     * token获取
-     */
-    public final static String TOKEN_URL = "/cgi-bin/token";
-
-}

+ 16 - 5
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/PayController.java

@@ -9,9 +9,11 @@ import com.zanxiang.sdk.domain.params.ProductPayParam;
 import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.domain.vo.PayParamVO;
 import com.zanxiang.sdk.service.IOrderPayService;
+import com.zanxiang.sdk.service.pay.MiPayService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
@@ -36,6 +38,9 @@ public class PayController {
     @Resource
     private IOrderPayService orderPayService;
 
+    @Autowired
+    private MiPayService miPayService;
+
     @UnSignCheck
     @ApiOperation(value = "获取客服支付参数")
     @GetMapping(value = "/param/applet")
@@ -63,6 +68,13 @@ public class PayController {
         return orderPayService.notify(request, response, PayWayEnum.ALI_PAY.getPayWayId());
     }
 
+    @UnSignCheck
+    @ApiOperation(value = "支付宝支付同步回调(二维码、H5、网站)")
+    @RequestMapping(value = "/alipaySynNotify", method = RequestMethod.GET)
+    public ResultVO synNotify(HttpServletRequest request) {
+        return orderPayService.synNotify(request, PayWayEnum.ALI_PAY.getPayWayId());
+    }
+
     @UnSignCheck
     @ApiOperation(value = "微信支付异步回调")
     @RequestMapping(value = "/wxPayNotify", method = RequestMethod.POST)
@@ -70,11 +82,10 @@ public class PayController {
         return orderPayService.notify(request, response, PayWayEnum.WX_PAY.getPayWayId());
     }
 
-    @UnSignCheck
-    @ApiOperation(value = "支付宝支付同步回调(二维码、H5、网站)")
-    @RequestMapping(value = "/alipaySynNotify", method = RequestMethod.GET)
-    public ResultVO synNotify(HttpServletRequest request) {
-        return orderPayService.synNotify(request, PayWayEnum.ALI_PAY.getPayWayId());
+    @ApiOperation(value = "微信米大师支付同步回调")
+    @RequestMapping(value = "/miPayNotify", method = RequestMethod.POST)
+    public ResultVO<Map> miPayNotify(String orderId, @ValidLogin UserData userData) throws IOException {
+        return ResultVO.ok(miPayService.paySynNotify(orderId));
     }
 
     @ApiOperation(value = "获取订单支付结果")

+ 0 - 6
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/ProductPayParam.java

@@ -89,12 +89,6 @@ public class ProductPayParam {
     @ApiModelProperty(notes = "CP订单id")
     private String orderId;
 
-    /**
-     * 趣程订单id
-     */
-    @ApiModelProperty(notes = "趣程订单id")
-    private String qcOrderId;
-
     /**
      * 扩展字段,充值回调时,原样返回
      */

+ 2 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/enums/PayTypeEnum.java

@@ -1,7 +1,7 @@
 package com.zanxiang.sdk.enums;
 
 import com.zanxiang.sdk.service.pay.AliPayService;
-import com.zanxiang.sdk.service.pay.MiPay2Service;
+import com.zanxiang.sdk.service.pay.MiPayService;
 import com.zanxiang.sdk.service.pay.PayBaseService;
 import com.zanxiang.sdk.service.pay.WxPayService;
 import lombok.AllArgsConstructor;
@@ -31,7 +31,7 @@ public enum PayTypeEnum {
     /**
      * 米大师支付
      */
-    MI_PAY(3, "MI_PAY", MiPay2Service.class);
+    MI_PAY(3, "MI_PAY", MiPayService.class);
 
     /**
      * 支付方式

+ 0 - 19
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/IQqApiService.java

@@ -1,19 +0,0 @@
-package com.zanxiang.sdk.service;
-
-import java.util.Map;
-
-/**
- * @author : lingfeng
- * @time : 2022-06-21
- * @description :
- */
-public interface IQqApiService {
-
-    /**
-     * QQ授权获取用户信息
-     *
-     * @param code : 前端授权code
-     * @return {@link Map}<{@link String}, {@link String}>
-     */
-    Map<String, String> qqAuthUserInfo(String code);
-}

+ 4 - 38
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/IRegisterLoginService.java

@@ -2,12 +2,12 @@ package com.zanxiang.sdk.service;
 
 
 import com.zanxiang.module.util.pojo.ResultVO;
-import com.zanxiang.sdk.domain.params.*;
+import com.zanxiang.sdk.domain.params.LoginMobileParam;
+import com.zanxiang.sdk.domain.params.LoginPasswordParam;
+import com.zanxiang.sdk.domain.params.LoginVxCodeParam;
+import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.domain.vo.UserLoginVO;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 /**
  * @author : lingfeng
  * @time : 2022-06-22
@@ -58,38 +58,4 @@ public interface IRegisterLoginService {
      * @return {@link Boolean}
      */
     Boolean writeOff(UserData userData);
-
-    /**
-     * QQ授权登录
-     *
-     * @param response : 返回体
-     */
-    void qqLoginAuth(HttpServletResponse response);
-
-    /**
-     * QQ授权注册登录回调
-     *
-     * @param qqLoginCallbackParam : 回调参数
-     * @param request              : request
-     * @param userData             : userData
-     * @return {@link ResultVO}<{@link UserLoginVO}>
-     */
-    ResultVO<UserLoginVO> qqLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request, UserData userData);
-
-    /**
-     * 微信授权登录
-     *
-     * @param response 响应
-     */
-    void vxLoginAuth(HttpServletResponse response);
-
-    /**
-     * 微信授权注册登录回调
-     *
-     * @param qqLoginCallbackParam : 回调参数
-     * @param request              : request
-     * @param userData             : userData
-     * @return {@link ResultVO}<{@link UserLoginVO}>
-     */
-    ResultVO<UserLoginVO> vxLoginCallback(QqLoginCallbackParam qqLoginCallbackParam, HttpServletRequest request, UserData userData);
 }

+ 0 - 146
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/auth/QqApiServiceImpl.java

@@ -1,146 +0,0 @@
-package com.zanxiang.sdk.service.auth;
-
-import cn.hutool.http.HttpUtil;
-import com.zanxiang.common.exception.BaseException;
-import com.zanxiang.common.utils.URIUtil;
-import com.zanxiang.module.util.JsonUtil;
-import com.zanxiang.sdk.constant.ApiUrlConstant;
-import com.zanxiang.sdk.service.IQqApiService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.logging.log4j.util.Strings;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * @author : lingfeng
- * @time : 2022-06-20
- * @description : QQ Api接口
- */
-@Slf4j
-@Service
-public class QqApiServiceImpl implements IQqApiService {
-
-    /**
-     * QQ开发者应用id
-     */
-    @Value("${auth.qq-appId}")
-    private String qqAppId;
-
-    /**
-     * QQ开发者应用key
-     */
-    @Value("${auth.qq-appKey}")
-    private String qqAppKey;
-
-    /**
-     * QQ授权获取用户信息
-     *
-     * @param code : 前端授权code
-     * @return : 返回用户信息
-     */
-    @Override
-    public Map<String, String> qqAuthUserInfo(String code) {
-        // 向QQ认证服务器申请令牌
-        String accessToken = this.getAccessTokenApi(code);
-        if (Strings.isBlank(accessToken)) {
-            throw new BaseException("获取token失败");
-        }
-        // 通过accessToken获取用户openId
-        String openId = this.getUserOpenIdApi(accessToken);
-        if (Strings.isBlank(openId)) {
-            throw new BaseException("获取openId失败");
-        }
-        // 获取用户信息
-        Map<String, String> userInfo = this.getUserInfoApi(accessToken, openId);
-        if (userInfo.isEmpty()) {
-            throw new BaseException("获取用户信息失败");
-        }
-        //构造返回信息
-        Map<String, String> map = new HashMap<>(3);
-        map.put("openId", openId);
-        map.put("accessToken", accessToken);
-        map.put("nickname", userInfo.get("nickname"));
-        map.put("avatar", userInfo.get("figureurl_qq_1"));
-        map.put("six", userInfo.get("gender"));
-        return map;
-    }
-
-    /**
-     * 获取用户授权token
-     *
-     * @param code : 用户授权code
-     * @return : 返回token
-     */
-    private String getAccessTokenApi(String code) {
-        Map<String, String> paramMap = new HashMap<>(5);
-        paramMap.put("grant_type", "authorization_code");
-        paramMap.put("code", code);
-        paramMap.put("redirect_uri", ApiUrlConstant.QQ_REDIRECT_URL);
-        paramMap.put("client_id", qqAppId);
-        paramMap.put("client_secret", qqAppKey);
-        //拼接url请求参数
-        Map<String, String> resultMap = new HashMap<>();
-        try {
-            String uri = URIUtil.fillUrlParams(ApiUrlConstant.QQ_WEB_TOKEN_URL, paramMap, Boolean.TRUE);
-            String result = HttpUtil.get(uri);
-            if (Strings.isNotBlank(result)) {
-                resultMap = JsonUtil.toMap(result, Map.class, String.class);
-            }
-        } catch (Exception e) {
-            log.error("QQ获取用户授权token异常");
-            throw new BaseException("QQ获取用户授权token异常");
-        }
-        return resultMap.get("access_token");
-    }
-
-    /**
-     * 获取用户openId
-     *
-     * @param accessToken : 用户token密钥
-     * @return : 返回用户openId
-     */
-    private String getUserOpenIdApi(String accessToken) {
-        //拼接url请求参数
-        Map<String, String> paramMap = new HashMap<>(1);
-        paramMap.put("access_token", accessToken);
-        Map<String, String> resultMap = new HashMap<>();
-        try {
-            String uri = URIUtil.fillUrlParams(ApiUrlConstant.QQ_USER_OPENID_URL, paramMap, Boolean.TRUE);
-            String result = HttpUtil.get(uri);
-            if (Strings.isNotBlank(result)) {
-                resultMap = JsonUtil.toMap(result, Map.class, String.class);
-            }
-        } catch (Exception e) {
-            log.error("");
-        }
-        return resultMap.get("openid");
-    }
-
-    /**
-     * 获取用户openId
-     *
-     * @param accessToken : 用户token密钥
-     * @return : 返回用户openId
-     */
-    private Map<String, String> getUserInfoApi(String accessToken, String openId) {
-        //拼接url请求参数
-        Map<String, String> paramMap = new HashMap<>(3);
-        paramMap.put("access_token", accessToken);
-        paramMap.put("oauth_consumer_key", qqAppId);
-        paramMap.put("openid", openId);
-        Map<String, String> resultMap = new HashMap<>();
-        try {
-            String uri = URIUtil.fillUrlParams(ApiUrlConstant.QQ_USER_INFO_URL, paramMap, Boolean.TRUE);
-            String result = HttpUtil.get(uri);
-            if (Strings.isNotBlank(result)) {
-                resultMap = JsonUtil.toMap(result, Map.class, String.class);
-            }
-        } catch (Exception e) {
-            log.error("");
-        }
-        return resultMap;
-    }
-}

+ 4 - 144
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/impl/LoginServiceImpl.java

@@ -5,26 +5,22 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.zanxiang.common.enums.BanStatusEnum;
 import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.enums.SmsTypeEnum;
-import com.zanxiang.common.exception.BaseException;
-import com.zanxiang.common.text.UUID;
-import com.zanxiang.common.utils.URIUtil;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
 import com.zanxiang.mybatis.entity.GameExt;
 import com.zanxiang.mybatis.entity.User;
 import com.zanxiang.mybatis.entity.UserCard;
 import com.zanxiang.mybatis.entity.UserShare;
-import com.zanxiang.sdk.constant.ApiUrlConstant;
-import com.zanxiang.sdk.constant.RedisKeyConstant;
 import com.zanxiang.sdk.domain.dto.GameAppletDTO;
 import com.zanxiang.sdk.domain.dto.UserDTO;
-import com.zanxiang.sdk.domain.dto.UserOauthDTO;
-import com.zanxiang.sdk.domain.params.*;
+import com.zanxiang.sdk.domain.params.LoginMobileParam;
+import com.zanxiang.sdk.domain.params.LoginPasswordParam;
+import com.zanxiang.sdk.domain.params.LoginVxCodeParam;
+import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.domain.vo.UserLoginVO;
 import com.zanxiang.sdk.enums.LoginTypeEnum;
 import com.zanxiang.sdk.service.*;
 import com.zanxiang.sdk.service.api.WxApiService;
-import com.zanxiang.sdk.util.RedisUtil;
 import com.zanxiang.sdk.util.RegexUtil;
 import com.zanxiang.sdk.util.RegisterUtil;
 import lombok.extern.slf4j.Slf4j;
@@ -34,11 +30,7 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.time.LocalDateTime;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 
@@ -51,18 +43,6 @@ import java.util.Objects;
 @Service
 public class LoginServiceImpl implements IRegisterLoginService {
 
-    @Autowired
-    private RedisUtil<String> redisUtil;
-
-    @Resource
-    private IQqApiService qqApiService;
-
-    @Resource
-    private IVxApiService vxApiService;
-
-    @Autowired
-    private IUserOauthService userOauthService;
-
     @Autowired
     private IUserTokenService userTokenService;
 
@@ -372,124 +352,4 @@ public class LoginServiceImpl implements IRegisterLoginService {
         //密码验证
         return RegisterUtil.checkPassword(password);
     }
-
-    //-------------------------------- 微信和QQ授权登录(暂时没有用到) --------------------------------
-
-    @Override
-    public void qqLoginAuth(HttpServletResponse response) {
-        //获取state
-        String state = this.getState();
-        //传递参数
-        Map<String, String> paramMap = new HashMap<>(4);
-        paramMap.put("response_type", "code");
-        paramMap.put("client_id", qqAppId);
-        paramMap.put("state", state);
-        paramMap.put("redirect_uri", ApiUrlConstant.QQ_REDIRECT_URL);
-        //重定向到QQ授权页面
-        try {
-            response.sendRedirect(URIUtil.fillUrlParams(ApiUrlConstant.QQ_AUTH_URL, paramMap, Boolean.TRUE));
-        } catch (Exception e) {
-            log.error("QQ授权登录重定向跳转异常");
-            throw new BaseException("QQ授权登录重定向跳转异常");
-        }
-    }
-
-    @Override
-    public ResultVO<UserLoginVO> qqLoginCallback(QqLoginCallbackParam param, HttpServletRequest request, UserData userData) {
-        String code = param.getCode();
-        String state = param.getState();
-        Integer deviceType = userData.getDeviceType();
-        //验证state,如果不一致,可能被CSRF攻击
-        this.checkState(state);
-        //获取用户信息
-        Map<String, String> userInfoMap = qqApiService.qqAuthUserInfo(code);
-        //查询用户授权信息是否存在
-        UserOauthDTO userOauthDTO = userOauthService.getUserOauthByOpenId(userInfoMap.get("openId"));
-        //获取用户信息
-        User user = this.getUserByUserOauth(deviceType, userInfoMap, userOauthDTO);
-        //用户登录成功
-        String userToken = userTokenService.getUserToken(userOauthDTO.getId(), deviceType);
-        //插入用户登录记录
-        userLoginLogService.createUserLoginLog(user, LoginTypeEnum.LOGIN_IN.getLoginType());
-        //移出state
-        redisUtil.removeOfSet(RedisKeyConstant.AUTH_STATE_KEY, state);
-        //构造返回
-        return ResultVO.ok(new UserLoginVO());
-    }
-
-    @Override
-    public void vxLoginAuth(HttpServletResponse response) {
-        //获取state
-        String state = this.getState();
-        //传递参数
-        Map<String, String> paramMap = new HashMap<>(6);
-        paramMap.put("appid", qqAppId);
-        paramMap.put("redirect_uri", URIUtil.encodeURIComponent(ApiUrlConstant.VX_REDIRECT_URL));
-        paramMap.put("response_type", "code");
-        paramMap.put("scope", "snsapi_login");
-        paramMap.put("state", state);
-        paramMap.put("lang", "cn");
-        //重定向到QQ授权页面
-        try {
-            response.sendRedirect(URIUtil.fillUrlParams(ApiUrlConstant.VX_AUTH_URL, paramMap, Boolean.TRUE));
-        } catch (Exception e) {
-            log.error("微信授权登录重定向跳转异常");
-            throw new BaseException("微信授权登录重定向跳转异常");
-        }
-    }
-
-    @Override
-    public ResultVO<UserLoginVO> vxLoginCallback(QqLoginCallbackParam param, HttpServletRequest request, UserData userData) {
-        Integer deviceType = userData.getDeviceType();
-        String code = param.getCode();
-        String state = param.getState();
-        //验证state,如果不一致,可能被CSRF攻击
-        this.checkState(state);
-        //获取用户信息
-        Map<String, String> userInfoMap = vxApiService.vxAuthUserInfo(code);
-        //查询用户授权信息是否存在
-        UserOauthDTO userOauthDTO = userOauthService.getUserOauthByOpenId(userInfoMap.get("openId"));
-        //获取用户信息
-        User user = this.getUserByUserOauth(deviceType, userInfoMap, userOauthDTO);
-        //插入用户登录记录
-        userLoginLogService.createUserLoginLog(user, LoginTypeEnum.LOGIN_IN.getLoginType());
-        //用户登录成功
-        String userToken = userTokenService.getUserToken(userOauthDTO.getId(), deviceType);
-        //移出state
-        redisUtil.removeOfSet(RedisKeyConstant.AUTH_STATE_KEY, state);
-        //构造返回
-        return ResultVO.ok(new UserLoginVO());
-    }
-
-    private User getUserByUserOauth(Integer deviceType, Map<String, String> userInfoMap, UserOauthDTO userOauthDTO) {
-        if (userOauthDTO != null) {
-            return userService.getById(userOauthDTO.getUserId());
-        }
-        //创建用户信息
-        User user = User.builder()
-                .nickname(userInfoMap.get("nickname"))
-                .avatar(userInfoMap.get("avatar"))
-                .deviceType(deviceType)
-                .createTime(LocalDateTime.now())
-                .updateTime(LocalDateTime.now())
-                .build();
-        userService.save(user);
-        //创建用户授权信息
-        userOauthDTO = userOauthService.createUserOauth(user, userInfoMap);
-        log.info("用户授权信息, userOauthDTO : {}", JsonUtil.toString(userOauthDTO));
-        //返回用户信息
-        return user;
-    }
-
-    private void checkState(String state) {
-        if (!redisUtil.isMemberInSet(RedisKeyConstant.AUTH_STATE_KEY, state)) {
-            throw new BaseException("State验证失败");
-        }
-    }
-
-    private String getState() {
-        String state = UUID.randomUUID().toString();
-        redisUtil.addToSet(RedisKeyConstant.AUTH_STATE_KEY, state);
-        return state;
-    }
 }

+ 0 - 6
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/impl/OrderServiceImpl.java

@@ -18,7 +18,6 @@ import com.zanxiang.sdk.service.*;
 import com.zanxiang.sdk.util.RedisUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -60,11 +59,6 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
     @Override
     @Transactional(rollbackFor = {Exception.class, RuntimeException.class})
     public Boolean createOrder(ProductPayParam payParam, UserData userData) {
-        if (Strings.isNotBlank(payParam.getQcOrderId())) {
-            //设置订单号
-            payParam.setOrderId(payParam.getQcOrderId());
-            return Boolean.TRUE;
-        }
         //用户id
         Long userId = userData.getUserId();
         //游戏id

+ 1 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/impl/UserTokenServiceImpl.java

@@ -113,8 +113,7 @@ public class UserTokenServiceImpl extends ServiceImpl<UserTokenMapper, UserToken
         //判断token是否过期
         long endTime = DateUtils.localDateTimeToSecond(LocalDateTime.now().plusDays(1));
         //判断有效期时间是否大于1天
-//        return expireTime > endTime;
-        return Boolean.FALSE;
+        return expireTime > endTime;
     }
 
     @Override

+ 0 - 268
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/pay/MiPay2Service.java

@@ -1,268 +0,0 @@
-package com.zanxiang.sdk.service.pay;
-
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.zanxiang.common.enums.HttpStatusEnum;
-import com.zanxiang.common.enums.OrderStateEnum;
-import com.zanxiang.common.exception.BaseException;
-import com.zanxiang.common.exception.CustomException;
-import com.zanxiang.common.utils.StringUtils;
-import com.zanxiang.common.utils.URIUtil;
-import com.zanxiang.module.util.JsonUtil;
-import com.zanxiang.module.util.pojo.ResultVO;
-import com.zanxiang.mybatis.entity.Order;
-import com.zanxiang.sdk.domain.bo.ProductPayParamBO;
-import com.zanxiang.sdk.domain.dto.*;
-import com.zanxiang.sdk.service.IGameAppletService;
-import com.zanxiang.sdk.service.IOrderService;
-import com.zanxiang.sdk.service.IUserService;
-import com.zanxiang.sdk.service.api.WxApiService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-import org.springframework.web.client.RestTemplate;
-
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- * @author : lingfeng
- * @time : 2023-05-26
- * @description : 米大师支付2.0
- */
-@Slf4j
-@Service
-public class MiPay2Service extends PayBaseService {
-
-    private static final String SIGN_HMACSHA256 = "HMACSHA256";
-
-    private static final String MI_PAY_HOST = "https://api.weixin.qq.com";
-
-    private static final String BALANCE_URL = "/wxa/game/getbalance";
-
-    private static final String PAY_URL = "/wxa/game/pay";
-
-    @Value("${payConfig.miPay.isSand}")
-    private Integer isSand;
-
-    @Autowired
-    private IOrderService orderService;
-
-    @Autowired
-    private IGameAppletService gameAppletService;
-
-    @Autowired
-    private RestTemplate restTemplate;
-
-    @Autowired
-    private WxApiService wxApiService;
-
-    @Autowired
-    private IUserService userService;
-
-    /**
-     * 支付配置
-     */
-    private MiPayConfigDTO config;
-
-    @Override
-    public Map<String, Object> create(ProductPayParamBO product, GamePayWayDTO gamePayWayDTO) {
-        //查询订单
-        PlatformOrderDTO orderInfo = orderService.getByOrderId(product.getOutTradeNo());
-        if (Objects.isNull(orderInfo)) {
-            throw new CustomException(HttpStatusEnum.ORDER_NO_FIND);
-        }
-        if (orderInfo.getGameId() == null || orderInfo.getGameId() == 0) {
-            throw new CustomException(HttpStatusEnum.ORDER_GAME_ID_IS_NULL);
-        }
-        this.configInit(product.getGameId());
-        //获取用户openId
-        UserDTO userDTO = userService.getUserByUserId(product.getUserId());
-        String openId = userDTO.getOpenId();
-        String sessionKey = userDTO.getSessionKey();
-        //获取米大师钱包余额
-        Long balance = this.midasGetBalance(openId, sessionKey);
-        //返回参数
-        Map<String, Object> payParamMap = new HashMap<>(9);
-        //余额充足, 直接扣除
-        if (balance >= orderInfo.getAmount().longValue()) {
-            String billNo = this.midasPay(openId, sessionKey, orderInfo);
-            payParamMap.put("status", "0");
-            payParamMap.put("billNo", billNo);
-            //支付成功
-            this.paySuccess(product.getOutTradeNo(), orderInfo.getAmount().toString(), config.getAppId());
-        } else {
-            //余额不足, 返回订单id, 前端调充值接口, 充值完后再继续支付
-            payParamMap.put("currencyType", "CNY");
-            payParamMap.put("mode", "game");
-            payParamMap.put("zoneId", "1");
-            payParamMap.put("offerId", config.getAppId());
-            payParamMap.put("env", String.valueOf(this.isSand));
-            payParamMap.put("buyQuantity", orderInfo.getAmount().toString());
-            payParamMap.put("status", "1");
-            payParamMap.put("balance", String.valueOf(balance));
-            payParamMap.put("orderId", product.getOutTradeNo());
-            //更新订单商户信息
-            orderService.update(new LambdaUpdateWrapper<Order>()
-                    .set(Order::getMerchantNo, config.getAppId())
-                    .set(Order::getStatus, OrderStateEnum.WAIT_PAY.getCode())
-                    .eq(Order::getOrderId, product.getOutTradeNo()));
-        }
-        return payParamMap;
-    }
-
-    private Long midasGetBalance(String openId, String sessionKey) {
-        //接口参数
-        Map<String, Object> postBodyMap = new HashMap<>(5);
-        postBodyMap.put("offer_id", config.getOfferId());
-        postBodyMap.put("openid", openId);
-        postBodyMap.put("ts", System.currentTimeMillis() / 1000);
-        postBodyMap.put("zone_id", "1");
-        postBodyMap.put("env", this.isSand);
-        String postBody = JsonUtil.toString(postBodyMap);
-        //接口token
-        String accessToken = wxApiService.getAccessToken(config.getAppId(), config.getSecret());
-
-        //登录签名
-        String signature = calcSignature(postBody, sessionKey);
-        log.error("余额 : 登录签名计算参数, postBody : {}, sessionKey : {}, signature : {}", postBody, sessionKey, signature);
-
-
-        //支付签名
-        String paySig = calcPaySig(MiPay2Service.BALANCE_URL, postBody, config.getAppKeyByIsSand(this.isSand));
-
-        log.error("余额 : 支付签名计算参数, url : {}, postBody : {}, appKey : {}, paySig : {}", MiPay2Service.BALANCE_URL, postBody, config.getAppKeyByIsSand(this.isSand), paySig);
-
-
-        //请求头参数
-        Map<String, String> headParamMap = new HashMap<>(3);
-        headParamMap.put("access_token", accessToken);
-        headParamMap.put("signature", signature);
-        headParamMap.put("pay_sig", paySig);
-        //调接口返回
-        String url = URIUtil.fillUrlParams(MiPay2Service.MI_PAY_HOST + MiPay2Service.BALANCE_URL, headParamMap, Boolean.FALSE);
-        Map<String, String> resultMap = this.miPayApi(url, postBody);
-        return Long.valueOf(resultMap.get("balance"));
-    }
-
-    private String midasPay(String openId, String sessionKey, PlatformOrderDTO orderInfo) {
-        //接口参数
-        Map<String, Object> postBodyMap = new HashMap<>(7);
-        postBodyMap.put("openid", openId);
-        postBodyMap.put("offer_id", config.getOfferId());
-        postBodyMap.put("ts", System.currentTimeMillis() / 1000);
-        postBodyMap.put("zone_id", "1");
-        postBodyMap.put("env", this.isSand);
-        postBodyMap.put("amount", orderInfo.getAmount());
-        postBodyMap.put("bill_no", orderInfo.getOrderId());
-        String postBody = JsonUtil.toString(postBodyMap);
-        //接口token
-        String accessToken = wxApiService.getAccessToken(config.getAppId(), config.getSecret());
-        //登录签名
-        String signature = this.calcSignature(postBody, sessionKey);
-
-        log.error("支付 : 登录签名计算参数, postBody : {}, sessionKey : {}, signature : {}", postBody, sessionKey, signature);
-
-        //支付签名
-        String paySig = this.calcPaySig(MiPay2Service.PAY_URL, postBody, config.getAppKeyByIsSand(this.isSand));
-
-        log.error("支付 : 支付签名计算参数, url : {}, postBody : {}, appKey : {}, paySig : {}", MiPay2Service.BALANCE_URL, postBody, config.getAppKeyByIsSand(this.isSand), paySig);
-
-        //请求头参数
-        Map<String, String> headParamMap = new HashMap<>(3);
-        headParamMap.put("access_token", accessToken);
-        headParamMap.put("signature", signature);
-        headParamMap.put("pay_sig", paySig);
-        //调接口返回
-        String url = URIUtil.fillUrlParams(MiPay2Service.MI_PAY_HOST + MiPay2Service.PAY_URL, headParamMap, Boolean.FALSE);
-        Map<String, String> resultMap = this.miPayApi(url, postBody);
-        return resultMap.get("bill_no");
-    }
-
-    private Map<String, String> miPayApi(String url, String postBody) {
-        String result;
-        try {
-            result = restTemplate.postForObject(url, postBody, String.class);
-        } catch (Exception e) {
-            log.error("米大师接口调用异常, url : {}, postBody : {}, e : {}", url, postBody, e.getMessage());
-            throw new BaseException("米大师接口调用异常");
-        }
-        if (StringUtils.isEmpty(result)) {
-            log.error("米大师接口调用失败, 返回结果为空, url : {}, postBody : {}", url, postBody);
-            throw new BaseException("米大师接口调用失败, 返回结果为空");
-        }
-        Map<String, String> resultMap = JsonUtil.toMap(result, Map.class, String.class, String.class);
-        //返回结果成功
-        if (Objects.equals("0", resultMap.get("errcode"))) {
-            return resultMap;
-        }
-        //返回结果失败
-        log.error("米大师接口调用返回结果失败, url : {}, postBody : {}, errcode : {}, errmsg : {}", url, postBody,
-                resultMap.get("errcode"), resultMap.get("errmsg"));
-        throw new BaseException("米大师接口调用返回结果失败");
-    }
-
-    private void configInit(Long gameId) {
-        //查询游戏小程序信息
-        GameAppletDTO gameAppletDTO = gameAppletService.getByGameId(gameId);
-        //支付配置赋值
-        this.config = MiPayConfigDTO.builder()
-                .appId(gameAppletDTO.getAppId())
-                .secret(gameAppletDTO.getAppSecret())
-                .offerId(gameAppletDTO.getMiPayAppId())
-                .appKey(gameAppletDTO.getMiPayAppKey())
-                .appKeyDev(gameAppletDTO.getMiPayAppKeyDev())
-                .build();
-    }
-
-    private String calcPaySig(String uri, String postBody, String appKey) {
-        String needSignMsg = uri + "&" + postBody;
-        return this.calcSignature(needSignMsg, appKey);
-    }
-
-    private String calcSignature(String postBody, String sessionKey) {
-        try {
-            Mac hmacSha256 = Mac.getInstance(MiPay2Service.SIGN_HMACSHA256);
-            SecretKeySpec secretKey = new SecretKeySpec(sessionKey.getBytes(StandardCharsets.UTF_8), MiPay2Service.SIGN_HMACSHA256);
-            hmacSha256.init(secretKey);
-            byte[] signatureBytes = hmacSha256.doFinal(postBody.getBytes(StandardCharsets.UTF_8));
-            return bytesToHex(signatureBytes);
-        } catch (Exception e) {
-            log.error("米大师签名计算异常, postBody : {}, sessionKey : {}", postBody, sessionKey);
-            throw new BaseException("米大师签名计算异常");
-        }
-    }
-
-    private String bytesToHex(byte[] bytes) {
-        StringBuilder hexString = new StringBuilder();
-        for (byte b : bytes) {
-            String hex = Integer.toHexString(0xff & b);
-            if (hex.length() == 1) {
-                hexString.append('0');
-            }
-            hexString.append(hex);
-        }
-        return hexString.toString();
-    }
-
-    @Override
-    public String notify(HttpServletRequest request, HttpServletResponse response) {
-        throw new BaseException("米大师支付不存在异步回调");
-    }
-
-    @Override
-    public ResultVO synNotify(HttpServletRequest request) {
-        throw new BaseException("米大师支付不存在同步回调");
-    }
-
-    @Override
-    public void closeOrder(PlatformOrderDTO platformOrderDTO) {
-        log.error("米大师支付不存在取消订单");
-    }
-}

+ 145 - 103
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/pay/MiPayService.java

@@ -6,43 +6,52 @@ import com.zanxiang.common.enums.OrderStateEnum;
 import com.zanxiang.common.exception.BaseException;
 import com.zanxiang.common.exception.CustomException;
 import com.zanxiang.common.utils.StringUtils;
+import com.zanxiang.common.utils.URIUtil;
 import com.zanxiang.module.util.JsonUtil;
 import com.zanxiang.module.util.pojo.ResultVO;
 import com.zanxiang.mybatis.entity.Order;
-import com.zanxiang.sdk.constant.MiPayConstants;
-import com.zanxiang.sdk.constant.RedisKeyConstant;
 import com.zanxiang.sdk.domain.bo.ProductPayParamBO;
 import com.zanxiang.sdk.domain.dto.*;
 import com.zanxiang.sdk.service.IGameAppletService;
 import com.zanxiang.sdk.service.IOrderService;
 import com.zanxiang.sdk.service.IUserService;
-import com.zanxiang.sdk.util.RedisUtil;
-import com.zanxiang.sdk.util.WxPayUtil;
+import com.zanxiang.sdk.service.api.WxApiService;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.logging.log4j.util.Strings;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.web.client.RestTemplate;
-import org.springframework.web.util.UriComponentsBuilder;
 
+import javax.crypto.Mac;
+import javax.crypto.spec.SecretKeySpec;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.net.URI;
+import java.math.BigDecimal;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 
 /**
- * 米大师服务实现
- *
- * @author xufeng
- * @date 2022/7/14 16:33
+ * @author : lingfeng
+ * @time : 2023-05-26
+ * @description : 米大师支付2.0
  */
 @Slf4j
 @Service
 public class MiPayService extends PayBaseService {
 
+    private static final String SIGN_HMACSHA256 = "HMACSHA256";
+
+    private static final String MI_PAY_HOST = "https://api.weixin.qq.com";
+
+    private static final String BALANCE_URL = "/wxa/game/getbalance";
+
+    private static final String PAY_URL = "/wxa/game/pay";
+
+    @Value("${payConfig.miPay.isSand}")
+    private Integer isSand;
+
     @Autowired
     private IOrderService orderService;
 
@@ -53,16 +62,46 @@ public class MiPayService extends PayBaseService {
     private RestTemplate restTemplate;
 
     @Autowired
-    private IUserService userService;
+    private WxApiService wxApiService;
 
     @Autowired
-    private RedisUtil<String> redisUtil;
-
-    @Value("${payConfig.miPay.isSand}")
-    private Integer isSand;
+    private IUserService userService;
 
+    /**
+     * 支付配置
+     */
     private MiPayConfigDTO config;
 
+    public Map<String, Object> paySynNotify(String orderId) {
+        //查询订单
+        PlatformOrderDTO platformOrderDTO = orderService.getByOrderId(orderId);
+        if (platformOrderDTO == null) {
+            log.error("参数错误, 订单信息不存在! orderId : {}", orderId);
+            throw new BaseException("参数错误, 订单信息不存在");
+        }
+        this.configInit(platformOrderDTO.getGameId());
+        //获取用户openId
+        UserDTO userDTO = userService.getUserByUserId(platformOrderDTO.getUserId());
+        String openId = userDTO.getOpenId();
+        String sessionKey = userDTO.getSessionKey();
+        //获取米大师钱包余额
+        Long balance = this.midasGetBalance(openId, sessionKey);
+        //余额不足, 无法扣除
+        if (balance < platformOrderDTO.getAmount().longValue()) {
+            log.error("米大师游戏币不足, 无法扣除! balance : {}, orderId : {}", balance, orderId);
+            throw new BaseException("米大师游戏币不足, 无法扣除!");
+        }
+        //余额充足, 直接扣除
+        String billNo = this.midasPay(openId, sessionKey, platformOrderDTO.getAmount(), platformOrderDTO.getOrderId());
+        //支付成功
+        this.paySuccess(platformOrderDTO.getOrderId(), platformOrderDTO.getAmount().toString(), config.getAppId());
+        //返回参数
+        Map<String, Object> payParamMap = new HashMap<>(2);
+        payParamMap.put("status", "0");
+        payParamMap.put("billNo", billNo);
+        return payParamMap;
+    }
+
     @Override
     public Map<String, Object> create(ProductPayParamBO product, GamePayWayDTO gamePayWayDTO) {
         //查询订单
@@ -77,13 +116,14 @@ public class MiPayService extends PayBaseService {
         //获取用户openId
         UserDTO userDTO = userService.getUserByUserId(product.getUserId());
         String openId = userDTO.getOpenId();
+        String sessionKey = userDTO.getSessionKey();
         //获取米大师钱包余额
-        Long balance = this.midasGetBalance(openId);
+        Long balance = this.midasGetBalance(openId, sessionKey);
         //返回参数
         Map<String, Object> payParamMap = new HashMap<>(9);
         //余额充足, 直接扣除
         if (balance >= orderInfo.getAmount().longValue()) {
-            String billNo = this.midasPay(openId, orderInfo);
+            String billNo = this.midasPay(openId, sessionKey, orderInfo.getAmount(), orderInfo.getOrderId());
             payParamMap.put("status", "0");
             payParamMap.put("billNo", billNo);
             //支付成功
@@ -108,98 +148,80 @@ public class MiPayService extends PayBaseService {
         return payParamMap;
     }
 
-    private Long midasGetBalance(String openId) {
-        Map<String, String> paramMap = new HashMap<>();
-        paramMap.put("openid", openId);
-        paramMap.put("appid", config.getAppId());
-        paramMap.put("offer_id", config.getOfferId());
-        paramMap.put("ts", String.valueOf(System.currentTimeMillis() / 1000));
-        paramMap.put("zone_id", "1");
-        paramMap.put("pf", "android");
-        paramMap.put("sig", this.sign(MiPayConstants.BALANCE_URL, paramMap));
-        Map<String, String> result = this.miPayApi(MiPayConstants.BALANCE_URL, paramMap);
-        return Long.valueOf(result.get("balance"));
-    }
-
-    private String midasPay(String openId, PlatformOrderDTO orderInfo) {
-        Map<String, String> paramMap = new HashMap<>();
-        paramMap.put("appid", config.getAppId());
-        paramMap.put("openid", openId);
-        paramMap.put("offer_id", config.getOfferId());
-        paramMap.put("ts", String.valueOf(System.currentTimeMillis() / 1000));
-        paramMap.put("pf", "android");
-        paramMap.put("zone_id", "1");
-        paramMap.put("amt", orderInfo.getAmount().toString());
-        paramMap.put("bill_no", orderInfo.getOrderId());
-        paramMap.put("sig", this.sign(MiPayConstants.PAY_URL, paramMap));
-        Map<String, String> result = this.miPayApi(MiPayConstants.PAY_URL, paramMap);
-        return result.get("bill_no");
+    private Long midasGetBalance(String openId, String sessionKey) {
+        //接口参数
+        Map<String, Object> postBodyMap = new HashMap<>(5);
+        postBodyMap.put("offer_id", config.getOfferId());
+        postBodyMap.put("openid", openId);
+        postBodyMap.put("ts", System.currentTimeMillis() / 1000);
+        postBodyMap.put("zone_id", "1");
+        postBodyMap.put("env", this.isSand);
+        String postBody = JsonUtil.toString(postBodyMap);
+        //接口token
+        String accessToken = wxApiService.getAccessToken(config.getAppId(), config.getSecret());
+        //登录签名
+        String signature = calcSignature(postBody, sessionKey);
+        //支付签名
+        String paySig = calcPaySig(MiPayService.BALANCE_URL, postBody, config.getAppKeyByIsSand(this.isSand));
+        //请求头参数
+        Map<String, String> headParamMap = new HashMap<>(3);
+        headParamMap.put("access_token", accessToken);
+        headParamMap.put("signature", signature);
+        headParamMap.put("pay_sig", paySig);
+        //调接口返回
+        String url = URIUtil.fillUrlParams(MiPayService.MI_PAY_HOST + MiPayService.BALANCE_URL, headParamMap, Boolean.FALSE);
+        Map<String, String> resultMap = this.miPayApi(url, postBody);
+        return Long.valueOf(resultMap.get("balance"));
     }
 
-    private String getAccessToken(String appId, String appKey) {
-        String redisKey = RedisKeyConstant.MI_PAY_TOKEN + appId;
-        String cache = redisUtil.getCache(redisKey);
-        if (StringUtils.isNotEmpty(cache)) {
-            return cache;
-        }
-        //请求url
-        URI uri = UriComponentsBuilder.fromHttpUrl(MiPayConstants.MI_PAY_HOST + MiPayConstants.TOKEN_URL)
-                .queryParam("appid", appId)
-                .queryParam("secret", appKey)
-                .queryParam("grant_type", "client_credential")
-                .build().toUri();
-        String result;
-        try {
-            result = restTemplate.getForObject(uri, String.class);
-        } catch (Exception e) {
-            log.error("获取米大师token异常, appId : {}, appKey : {}, e : {}", appId, appKey, e.getMessage());
-            throw new BaseException("获取米大师token异常");
-        }
-        if (Strings.isEmpty(result)) {
-            log.error("获取米大师token失败, 返回结果为空, appId : {}, appKey : {}", appId, appKey);
-            throw new BaseException("获取米大师token失败, 返回结果为空");
-        }
-        Map<String, String> data = JsonUtil.toMap(result, Map.class, String.class, String.class);
-        String accessToken = data.get("access_token");
-        String expiresIn = data.get("expires_in");
-        if (Strings.isBlank(accessToken) || Strings.isBlank(expiresIn)) {
-            log.error("获取米大师token失败, 返回结果参数不全, appId : {}, appKey : {}, data {}", appId, appKey, data);
-            throw new BaseException("获取米大师token失败, 返回结果参数不全");
-        }
-        redisUtil.setCache(redisKey, accessToken, Long.valueOf(data.get("expires_in")));
-        return accessToken;
+    private String midasPay(String openId, String sessionKey, BigDecimal amount, String orderId) {
+        //接口参数
+        Map<String, Object> postBodyMap = new HashMap<>(7);
+        postBodyMap.put("openid", openId);
+        postBodyMap.put("offer_id", config.getOfferId());
+        postBodyMap.put("ts", System.currentTimeMillis() / 1000);
+        postBodyMap.put("zone_id", "1");
+        postBodyMap.put("env", this.isSand);
+        postBodyMap.put("amount", amount);
+        postBodyMap.put("bill_no", orderId);
+        String postBody = JsonUtil.toString(postBodyMap);
+        //接口token
+        String accessToken = wxApiService.getAccessToken(config.getAppId(), config.getSecret());
+        //登录签名
+        String signature = this.calcSignature(postBody, sessionKey);
+        //支付签名
+        String paySig = this.calcPaySig(MiPayService.PAY_URL, postBody, config.getAppKeyByIsSand(this.isSand));
+        //请求头参数
+        Map<String, String> headParamMap = new HashMap<>(3);
+        headParamMap.put("access_token", accessToken);
+        headParamMap.put("signature", signature);
+        headParamMap.put("pay_sig", paySig);
+        //调接口返回
+        String url = URIUtil.fillUrlParams(MiPayService.MI_PAY_HOST + MiPayService.PAY_URL, headParamMap, Boolean.FALSE);
+        Map<String, String> resultMap = this.miPayApi(url, postBody);
+        return resultMap.get("bill_no");
     }
 
-    private Map<String, String> miPayApi(String url, Map<String, String> paramMap) {
-        //使用沙箱时,沙箱地址替换
-        if (this.isSand == 1) {
-            url = url.replace("/cgi-bin/midas/", "/cgi-bin/midas/sandbox/");
-        }
-        String appKey = this.isSand == 1 ? config.getAppKeyDev() : config.getAppKey();
-        //接口凭证
-        String accessToken = getAccessToken(config.getAppId(), appKey);
-        //接口url
-        URI uri = UriComponentsBuilder.fromHttpUrl(MiPayConstants.MI_PAY_HOST + url)
-                .queryParam("access_token", accessToken).build().toUri();
+    private Map<String, String> miPayApi(String url, String postBody) {
         String result;
         try {
-            result = restTemplate.postForObject(uri, paramMap, String.class);
+            result = restTemplate.postForObject(url, postBody, String.class);
         } catch (Exception e) {
-            log.error("米大师接口调用失败, url : {}, paramMap : {}, e : {}", url, JsonUtil.toString(paramMap), e.getMessage());
-            throw new BaseException("米大师接口调用失败");
+            log.error("米大师接口调用异常, url : {}, postBody : {}, e : {}", url, postBody, e.getMessage());
+            throw new BaseException("米大师接口调用异常");
         }
         if (StringUtils.isEmpty(result)) {
-            log.error("米大师接口调用失败, 返回结果为空, url : {}, paramMap : {}", url, JsonUtil.toString(paramMap));
+            log.error("米大师接口调用失败, 返回结果为空, url : {}, postBody : {}", url, postBody);
             throw new BaseException("米大师接口调用失败, 返回结果为空");
         }
-        Map<String, String> data = JsonUtil.toMap(result, Map.class, String.class, String.class);
+        Map<String, String> resultMap = JsonUtil.toMap(result, Map.class, String.class, String.class);
         //返回结果成功
-        if (Objects.equals("0", data.get("errcode"))) {
-            return data;
+        if (Objects.equals("0", resultMap.get("errcode"))) {
+            return resultMap;
         }
         //返回结果失败
-        log.error("米大师接口调用返回结果失败, url : {}, paramMap : {}, errcode : {}, errmsg : {}", url, paramMap,
-                data.get("errcode"), data.get("errmsg"));
+        log.error("米大师接口调用返回结果失败, url : {}, postBody : {}, errcode : {}, errmsg : {}", url, postBody,
+                resultMap.get("errcode"), resultMap.get("errmsg"));
         throw new BaseException("米大师接口调用返回结果失败");
     }
 
@@ -216,14 +238,34 @@ public class MiPayService extends PayBaseService {
                 .build();
     }
 
-    private String sign(String url, Map<String, String> paramMap) {
-        //沙箱环境地址替换
-        if (this.isSand == 1) {
-            url = url.replace("/cgi-bin/midas/", "/cgi-bin/midas/sandbox/");
+    private String calcPaySig(String uri, String postBody, String appKey) {
+        String needSignMsg = uri + "&" + postBody;
+        return this.calcSignature(needSignMsg, appKey);
+    }
+
+    private String calcSignature(String postBody, String sessionKey) {
+        try {
+            Mac hmacSha256 = Mac.getInstance(MiPayService.SIGN_HMACSHA256);
+            SecretKeySpec secretKey = new SecretKeySpec(sessionKey.getBytes(StandardCharsets.UTF_8), MiPayService.SIGN_HMACSHA256);
+            hmacSha256.init(secretKey);
+            byte[] signatureBytes = hmacSha256.doFinal(postBody.getBytes(StandardCharsets.UTF_8));
+            return bytesToHex(signatureBytes);
+        } catch (Exception e) {
+            log.error("米大师签名计算异常, postBody : {}, sessionKey : {}", postBody, sessionKey);
+            throw new BaseException("米大师签名计算异常");
+        }
+    }
+
+    private String bytesToHex(byte[] bytes) {
+        StringBuilder hexString = new StringBuilder();
+        for (byte b : bytes) {
+            String hex = Integer.toHexString(0xff & b);
+            if (hex.length() == 1) {
+                hexString.append('0');
+            }
+            hexString.append(hex);
         }
-        String appKey = this.isSand == 1 ? config.getAppKeyDev() : config.getAppKey();
-        //签名
-        return WxPayUtil.miPaySin("POST", url, paramMap, appKey);
+        return hexString.toString();
     }
 
     @Override

+ 3 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/pay/PayBaseService.java

@@ -119,8 +119,9 @@ public abstract class PayBaseService {
     /**
      * 支付调起
      *
-     * @param product : 调起支付的参数
-     * @return : 返回支付参数
+     * @param product       : 调起支付的参数
+     * @param gamePayWayDTO 游戏dto支付方式
+     * @return {@link Map}<{@link String}, {@link Object}>
      */
     public abstract Map<String, Object> create(ProductPayParamBO product, GamePayWayDTO gamePayWayDTO);
 

+ 0 - 44
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/pay/TestService.java

@@ -1,44 +0,0 @@
-package com.zanxiang.sdk.service.pay;
-
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
-import java.nio.charset.StandardCharsets;
-import java.security.InvalidKeyException;
-import java.security.NoSuchAlgorithmException;
-
-/**
- * @author : lingfeng
- * @time : 2023-05-26
- * @description :
- */
-public class TestService {
-
-    public static String calcPaySig(String uri, String postBody, String appKey) throws NoSuchAlgorithmException, InvalidKeyException {
-        String needSignMsg = uri + "&" + postBody;
-        Mac hmacSha256 = Mac.getInstance("HmacSHA256");
-        SecretKeySpec secretKey = new SecretKeySpec(appKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
-        hmacSha256.init(secretKey);
-        byte[] signatureBytes = hmacSha256.doFinal(needSignMsg.getBytes(StandardCharsets.UTF_8));
-        return bytesToHex(signatureBytes);
-    }
-
-    public static String calcSignature(String postBody, String sessionKey) throws NoSuchAlgorithmException, InvalidKeyException {
-        Mac hmacSha256 = Mac.getInstance("HmacSHA256");
-        SecretKeySpec secretKey = new SecretKeySpec(sessionKey.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
-        hmacSha256.init(secretKey);
-        byte[] signatureBytes = hmacSha256.doFinal(postBody.getBytes(StandardCharsets.UTF_8));
-        return bytesToHex(signatureBytes);
-    }
-
-    private static String bytesToHex(byte[] bytes) {
-        StringBuilder hexString = new StringBuilder();
-        for (byte b : bytes) {
-            String hex = Integer.toHexString(0xff & b);
-            if (hex.length() == 1) {
-                hexString.append('0');
-            }
-            hexString.append(hex);
-        }
-        return hexString.toString();
-    }
-}