Преглед изворни кода

feat : 支付方式自动切换

bilingfeng пре 1 година
родитељ
комит
c83c1c1690

+ 0 - 113
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/UserOauth.java

@@ -1,113 +0,0 @@
-package com.zanxiang.mybatis.entity;
-
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
-import lombok.*;
-
-import java.time.LocalDateTime;
-
-/**
- * @author : lingfeng
- * @time : 2022-06-06
- * @description : 第三方用户授权登录表
- */
-@Data
-@NoArgsConstructor
-@AllArgsConstructor
-@ToString
-@Builder
-@TableName("t_user_oauth")
-public class UserOauth {
-
-    /**
-     * 主键id
-     */
-    @TableId(value = "id", type = IdType.AUTO)
-    private Long id;
-
-    /**
-     * 关联的本站用户id
-     */
-    private Long userId;
-
-    /**
-     * 用户来源(微信/QQ/华为)
-     */
-    private String from;
-
-    /**
-     * 配置ID
-     */
-    private String confId;
-
-    /**
-     * 第三方open id
-     */
-    private String openid;
-
-    /**
-     * 第三方秘钥
-     */
-    private String accessToken;
-
-    /**
-     * 第三方唯一用户id
-     */
-    private String unionid;
-
-    /**
-     * 第三方昵称
-     */
-    private String nickname;
-
-    /**
-     * 国家
-     */
-    private String country;
-
-    /**
-     * 省份
-     */
-    private String province;
-
-    /**
-     * 城市
-     */
-    private String city;
-
-    /**
-     * 1 男 2 女 3 未知
-     */
-    private Boolean six;
-
-    /**
-     * 头像
-     */
-    private String avatar;
-
-    /**
-     * access_token过期时间
-     */
-    private Long expiresIn;
-
-    /**
-     * 扩展信息
-     */
-    private String more;
-
-    /**
-     * 最后登录ip
-     */
-    private String lastLoginIp;
-
-    /**
-     * 最后登录时间
-     */
-    private Long lastLoginTime;
-
-    /**
-     * 绑定时间
-     */
-    private LocalDateTime createTime;
-}

+ 0 - 12
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/mapper/UserOauthMapper.java

@@ -1,12 +0,0 @@
-package com.zanxiang.mybatis.mapper;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.zanxiang.mybatis.entity.UserOauth;
-
-/**
- * @author : lingfeng
- * @time : 2022-06-06
- * @description : ${description}
- */
-public interface UserOauthMapper extends BaseMapper<UserOauth> {
-}

+ 0 - 68
game-module/game-sdk/src/main/java/com/zanxiang/sdk/constant/ApiUrlConstant.java

@@ -1,68 +0,0 @@
-package com.zanxiang.sdk.constant;
-
-/**
- * @author : lingfeng
- * @time : 2022-06-21
- * @description : 第三方api通用url
- */
-public class ApiUrlConstant {
-
-    //-------------------- 扣扣api --------------------
-
-    /**
-     * QQ授权重定向地址
-     */
-    public static final String QQ_AUTH_URL = "https://graph.qq.com/oauth2.0/authorize";
-
-    /**
-     * QQ授权回调地址
-     */
-    public static final String QQ_REDIRECT_URL = "http://127.0.0.1:8080/qqCallback";
-
-    /**
-     * QQ网页获取授权token地址
-     */
-    public static final String QQ_WEB_TOKEN_URL = "https://graph.qq.com/oauth2.0/token";
-
-    /**
-     * QQ获取用户openId地址
-     */
-    public static final String QQ_USER_OPENID_URL = "https://graph.qq.com/oauth2.0/me";
-
-    /**
-     * QQ获取用户信息地址
-     */
-    public static final String QQ_USER_INFO_URL = "https://graph.qq.com/user/get_user_info";
-
-    //-------------------- 微信api --------------------
-
-    /**
-     * VX授权重定向地址
-     */
-    public static final String VX_AUTH_URL = "https://open.weixin.qq.com/connect/qrconnect";
-
-    /**
-     * VX授权回调地址
-     */
-    public static final String VX_REDIRECT_URL = "http://127.0.0.1:8080/vxCallback";
-
-    /**
-     * VX网页获取授权token地址
-     */
-    public static final String VX_WEB_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token";
-
-    /**
-     * VX网页获取刷新token地址
-     */
-    public static final String VX_WEB_TOKEN_REFRESH_URL = "https://api.weixin.qq.com/sns/oauth2/refresh_token";
-
-    /**
-     * VX网页检测token地址
-     */
-    public static final String VX_WEB_TOKEN_CHECK_URL = "https://api.weixin.qq.com/sns/auth";
-
-    /**
-     * VX网页授权获取用户信息
-     */
-    public static final String VX_WEB_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo";
-}

+ 0 - 10
game-module/game-sdk/src/main/java/com/zanxiang/sdk/constant/RedisKeyConstant.java

@@ -32,11 +32,6 @@ public class RedisKeyConstant {
      */
     public static final String SMS_PHONE_KEY = RedisKeyConstant.REDIS_PREFIX + "sms_phone";
 
-    /**
-     * 手机验证码缓存key
-     */
-    public static final String AUTH_STATE_KEY = RedisKeyConstant.REDIS_PREFIX + "auth_state";
-
     /**
      * 角色信息更新
      */
@@ -47,11 +42,6 @@ public class RedisKeyConstant {
      */
     public static final String APPLET_ACCESS_TOKEN = RedisKeyConstant.REDIS_PREFIX + "applet_access_token_";
 
-    /**
-     * 米大师支付token
-     */
-    public static final String MI_PAY_TOKEN = RedisKeyConstant.REDIS_PREFIX + "mi_pay_token_";
-
     /**
      * 订单过期缓存key
      */

+ 1 - 36
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/LoginController.java

@@ -45,8 +45,7 @@ public class LoginController {
     @ApiOperation(value = "CP登录凭证验证")
     @GetMapping("/token/check")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Long.class)})
-    public ResultVO userTokenCheck(@RequestParam String appId, @RequestParam Long userId, @RequestParam String token,
-                                   @RequestParam String sign) {
+    public ResultVO userTokenCheck(@RequestParam String appId, @RequestParam Long userId, @RequestParam String token, @RequestParam String sign) {
         return userTokenService.cpTokenCheck(appId, userId, token, sign);
     }
 
@@ -84,38 +83,4 @@ public class LoginController {
     public ResultVO<Boolean> writeOff(@ValidLogin UserData userData) {
         return ResultVO.ok(registerLoginService.writeOff(userData));
     }
-
-    //-------------------------------- 微信和QQ授权登录(暂时没有用到) --------------------------------
-
-//    @ApiOperation(value = "用户QQ授权登录")
-//    @GetMapping("/register/login/qq")
-//    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
-//    public ResultVO qqLoginAuth(HttpServletResponse response) {
-//        registerPassword.qqLoginAuth(response);
-//        return ResultVO.ok();
-//    }
-//
-//    @ApiOperation(value = "用户QQ授权登录回调接口")
-//    @PostMapping("/register/login/qq/call/back")
-//    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
-//    public ResultVO<UserLoginVO> qqLoginCallback(@Validated @RequestBody QqLoginCallbackParam qqLoginCallbackParam,
-//                                                 HttpServletRequest request, UserData userData) {
-//        return registerPassword.qqLoginCallback(qqLoginCallbackParam, request, userData);
-//    }
-//
-//    @ApiOperation(value = "用户微信授权登录")
-//    @GetMapping("/register/login/vx")
-//    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
-//    public ResultVO getUserDetail(HttpServletResponse response) {
-//        registerPassword.vxLoginAuth(response);
-//        return ResultVO.ok();
-//    }
-//
-//    @ApiOperation(value = "用户微信授权登录回调接口")
-//    @PostMapping("/register/login/vx/call/back")
-//    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
-//    public ResultVO<UserLoginVO> vxLoginCallback(@Validated @RequestBody QqLoginCallbackParam qqLoginCallbackParam,
-//                                                 HttpServletRequest request, UserData userData) {
-//        return registerPassword.vxLoginCallback(qqLoginCallbackParam, request, userData);
-//    }
 }

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

@@ -50,7 +50,7 @@ public class PayController {
 
     @ApiOperation(value = "获取小游戏支付方式")
     @GetMapping(value = "/device/applet")
-    public ResultVO<Integer> getAppletPayDevice(@ValidLogin UserData userData) {
+    public ResultVO<Long> getAppletPayDevice(@ValidLogin UserData userData) {
         return ResultVO.ok(orderPayService.getAppletPayDevice(userData));
     }
 

+ 0 - 67
game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/TestController.java

@@ -1,67 +0,0 @@
-package com.zanxiang.sdk.controller;
-
-import com.zanxiang.module.util.JsonUtil;
-import com.zanxiang.module.util.pojo.ResultVO;
-import com.zanxiang.sdk.annotation.UnSignCheck;
-import com.zanxiang.sdk.domain.dto.PlatformOrderDTO;
-import com.zanxiang.sdk.domain.params.ProductPayParam;
-import com.zanxiang.sdk.domain.params.UserData;
-import com.zanxiang.sdk.domain.vo.GameShareVO;
-import com.zanxiang.sdk.service.IOrderPayService;
-import com.zanxiang.sdk.service.IOrderService;
-import com.zanxiang.sdk.service.pay.WxPayService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiResponse;
-import io.swagger.annotations.ApiResponses;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Map;
-
-/**
- * @author : lingfeng
- * @time : 2023-01-18
- * @description :
- */
-@Api(tags = "测试接口")
-@RestController
-@RequestMapping(value = "/api/test")
-public class TestController {
-
-    @Autowired
-    private WxPayService wxPayService;
-
-    @Autowired
-    private IOrderService orderService;
-
-    @Autowired
-    private IOrderPayService orderPayService;
-
-    @UnSignCheck
-    @GetMapping("/close/order")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameShareVO.class)})
-    public ResultVO shareGame(String param) {
-        PlatformOrderDTO platformOrderDTO = orderService.getByOrderId(param);
-        wxPayService.closeOrder(platformOrderDTO);
-        return ResultVO.ok();
-    }
-
-    @UnSignCheck
-    @GetMapping("/pay/order")
-    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = GameShareVO.class)})
-    public ResultVO payOrder() {
-        String param = "{\"payWay\":1,\"payDevice\":2,\"productId\":\"0.1元\",\"productName\":\"1元宝\",\"productDesc\":\"充值1元购买100元宝\",\"amount\":0.1,\"serverId\":\"2\",\"serverName\":\"二区\",\"roleId\":\"132\",\"roleName\":\"oHaTi5bsKYQKlbWEHcfr7UWk_Wtk\",\"roleLevel\":1,\"extension\":\"\"}";
-        ProductPayParam productPayParam = JsonUtil.toObj(param, ProductPayParam.class);
-        UserData userData = UserData.builder()
-                .gameId(21L)
-                .userId(132L)
-                .deviceSystem("android")
-                .ip("125.121.234.254")
-                .build();
-        Map<String, Object> stringObjectMap = orderPayService.payCreate(productPayParam, userData);
-        System.out.println("11111111111");
-        return ResultVO.ok();
-    }
-}

+ 10 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/IGamePayWayService.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.zanxiang.mybatis.entity.GamePayWay;
 import com.zanxiang.sdk.domain.dto.GamePayWayDTO;
 
+import java.util.List;
+
 /**
  * @author xufeng
  * @date 2022/6/13 11:27
@@ -27,4 +29,12 @@ public interface IGamePayWayService extends IService<GamePayWay> {
      * @return {@link GamePayWayDTO}
      */
     GamePayWayDTO getGamePayWay(Long gameId, Long payWayId, Long payDeviceId);
+
+    /**
+     * 游戏id列表
+     *
+     * @param gameId 游戏id
+     * @return {@link List}<{@link GamePayWayDTO}>
+     */
+    List<GamePayWayDTO> listOfGameId(Long gameId);
 }

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

@@ -33,7 +33,7 @@ public interface IOrderPayService {
      * @param userData 用户数据
      * @return {@link Integer}
      */
-    Integer getAppletPayDevice(UserData userData);
+    Long getAppletPayDevice(UserData userData);
 
     /**
      * 下单支付

+ 0 - 31
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/IUserOauthService.java

@@ -1,31 +0,0 @@
-package com.zanxiang.sdk.service;
-
-import com.zanxiang.mybatis.entity.User;
-import com.zanxiang.sdk.domain.dto.UserOauthDTO;
-
-import java.util.Map;
-
-/**
- * @author : lingfeng
- * @time : 2022-06-21
- * @description : 用户第三方授权信息
- */
-public interface IUserOauthService {
-
-    /**
-     * 根据openid查询用户授权信息
-     *
-     * @param openId : 用户第三方授权信息
-     * @return {@link UserOauthDTO}
-     */
-    UserOauthDTO getUserOauthByOpenId(String openId);
-
-    /**
-     * 创建用户授权信息
-     *
-     * @param user : 用户信息
-     * @param map  : 第三方用户信息
-     * @return {@link UserOauthDTO}
-     */
-    UserOauthDTO createUserOauth(User user, Map<String, String> map);
-}

+ 17 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/impl/GamePayWayServiceImpl.java

@@ -1,10 +1,12 @@
 package com.zanxiang.sdk.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.common.enums.DeleteEnum;
 import com.zanxiang.common.enums.StatusEnum;
 import com.zanxiang.common.exception.BaseException;
+import com.zanxiang.common.utils.bean.BeanUtils;
 import com.zanxiang.module.util.bean.BeanUtil;
 import com.zanxiang.mybatis.entity.GamePayWay;
 import com.zanxiang.mybatis.mapper.GamePayWayMapper;
@@ -13,6 +15,8 @@ import com.zanxiang.sdk.service.IGamePayWayService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
+import java.util.List;
+
 /**
  * @author xufeng
  * @date 2022/6/13 11:46
@@ -45,4 +49,17 @@ public class GamePayWayServiceImpl extends ServiceImpl<GamePayWayMapper, GamePay
         }
         return BeanUtil.copy(gamePayWay, GamePayWayDTO.class);
     }
+
+    @Override
+    public List<GamePayWayDTO> listOfGameId(Long gameId) {
+        List<GamePayWay> gamePayWayList = list(new LambdaQueryWrapper<GamePayWay>()
+                .eq(GamePayWay::getGameId, gameId)
+                .eq(GamePayWay::getStatus, StatusEnum.YES)
+        );
+        if (CollectionUtils.isEmpty(gamePayWayList)) {
+            log.error("参数错误, 游戏支付配置信息不存在, gameId : {}", gameId);
+            throw new BaseException("参数错误, 游戏支付配置信息不存在");
+        }
+        return BeanUtils.copyList(gamePayWayList, GamePayWayDTO.class);
+    }
 }

+ 35 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/impl/OrderPayServiceImpl.java

@@ -1,6 +1,7 @@
 package com.zanxiang.sdk.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zanxiang.common.enums.DeviceTypeEnum;
 import com.zanxiang.common.enums.OrderStateEnum;
 import com.zanxiang.common.enums.PayDeviceEnum;
 import com.zanxiang.common.exception.BaseException;
@@ -27,6 +28,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
@@ -102,8 +104,39 @@ public class OrderPayServiceImpl implements IOrderPayService {
     }
 
     @Override
-    public Integer getAppletPayDevice(UserData userData) {
-        return 5;
+    public Long getAppletPayDevice(UserData userData) {
+        //查询游戏配置的支付方式
+        List<GamePayWayDTO> gamePayWayList = gamePayWayService.listOfGameId(userData.getGameId());
+        //支付方式
+        GamePayWayDTO gamePayWayDTO = null;
+        //IOS用户
+        if (Objects.equals(userData.getDeviceSystem(), DeviceTypeEnum.DEVICE_TYPE_IOS.getDescribe())) {
+            //返回小程序商城支付
+            gamePayWayDTO = gamePayWayList.stream().filter(gamePayWay ->
+                    Objects.equals(gamePayWay.getPayDeviceId(), PayDeviceEnum.APPLET_PAY.getPayDeviceId()))
+                    .findFirst().orElse(null);
+        }
+        //android用户
+        if (Objects.equals(userData.getDeviceSystem(), DeviceTypeEnum.DEVICE_TYPE_ANDROID.getDescribe())) {
+            //返回米大师支付
+            gamePayWayDTO = gamePayWayList.stream().filter(gamePayWay ->
+                    Objects.equals(gamePayWay.getPayDeviceId(), PayDeviceEnum.MI_PAY.getPayDeviceId()))
+                    .findFirst().orElse(null);
+        }
+        //返回适配的支付方式
+        if (gamePayWayDTO != null) {
+            return gamePayWayDTO.getPayDeviceId();
+        }
+        //未匹配到, 尝试匹配客服支付
+        gamePayWayDTO = gamePayWayList.stream().filter(gamePayWay ->
+                Objects.equals(gamePayWay.getPayDeviceId(), PayDeviceEnum.CUSTOM_PAY.getPayDeviceId()))
+                .findFirst().orElse(null);
+        if (gamePayWayDTO != null) {
+            return gamePayWayDTO.getPayDeviceId();
+        }
+        //未匹配到任何合适的支付方式
+        log.error("数据错误, 未匹配到合适的支付方式, userData : {}", JsonUtil.toString(userData));
+        throw new BaseException("数据错误, 未匹配到合适的支付方式");
     }
 
     @Override

+ 0 - 54
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/impl/UserOauthServiceImpl.java

@@ -1,54 +0,0 @@
-package com.zanxiang.sdk.service.impl;
-
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.zanxiang.common.utils.bean.BeanUtils;
-import com.zanxiang.mybatis.entity.User;
-import com.zanxiang.mybatis.entity.UserOauth;
-import com.zanxiang.mybatis.mapper.UserOauthMapper;
-import com.zanxiang.sdk.domain.dto.UserOauthDTO;
-import com.zanxiang.sdk.service.IUserOauthService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-import java.util.Map;
-
-/**
- * @author : lingfeng
- * @time : 2022-06-21
- * @description : 用户第三方授权信息
- */
-@Slf4j
-@Service
-public class UserOauthServiceImpl extends ServiceImpl<UserOauthMapper, UserOauth> implements IUserOauthService {
-
-    @Override
-    public UserOauthDTO getUserOauthByOpenId(String openId) {
-        try {
-            //根据用户第三方唯一查询
-            UserOauth userOauth = super.getOne(new LambdaQueryWrapper<UserOauth>().eq(UserOauth::getOpenid, openId));
-            //直接查到了信息
-            if (userOauth != null) {
-                return BeanUtils.copy(userOauth, UserOauthDTO.class);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-        } finally {
-        }
-        return null;
-    }
-
-    @Override
-    public UserOauthDTO createUserOauth(User user, Map<String, String> map) {
-        UserOauth userOauth = UserOauth.builder()
-                .userId(user.getId())
-                .openid(map.get("openId"))
-                .accessToken(map.get("accessToken"))
-                .unionid(map.get("openId"))
-                .nickname(map.get("nickname"))
-                .avatar(map.get("avatar"))
-                .build();
-        super.save(userOauth);
-        return BeanUtils.copy(userOauth, UserOauthDTO.class);
-    }
-}

+ 0 - 33
game-module/game-sdk/src/main/java/com/zanxiang/sdk/util/WxPayUtil.java

@@ -28,39 +28,6 @@ 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 = SignUtil.HMACSHA256(stringBuilder.toString(), secret);
-        } catch (Exception e) {
-            throw new BaseException("米大师签名失败");
-        }
-        return sig;
-    }
-
     /**
      * webUrl转换deepLink
      *