Browse Source

Merge remote-tracking branch 'origin/dev0.0.1' into dev-lingfeng

bilingfeng 2 years ago
parent
commit
f8f0fb2c11

+ 0 - 9
game-module/game-common/src/main/java/com/zanxiang/common/Test.java

@@ -1,9 +0,0 @@
-package com.zanxiang.common;
-
-import lombok.Data;
-
-//@Entity(name="test")
-@Data
-public class Test {
-    private Long Id;
-}

+ 11 - 1
game-module/game-common/src/main/java/com/zanxiang/common/enums/HttpStatusEnum.java

@@ -27,6 +27,11 @@ public enum HttpStatusEnum {
      */
      */
     UNKNOWN_ERROR(-9999, "未知错误"),
     UNKNOWN_ERROR(-9999, "未知错误"),
 
 
+    /**
+     * 请先登录
+     */
+    USER_NO_LOGIN(40400, "请登录"),
+
     /**
     /**
      * 用户名为空
      * 用户名为空
      */
      */
@@ -315,7 +320,12 @@ public enum HttpStatusEnum {
     /**
     /**
      * 玩家充值未达标
      * 玩家充值未达标
      */
      */
-    MEM_NOT_REACH_STAND(41407, "玩家充值未达标");
+    MEM_NOT_REACH_STAND(41407, "玩家充值未达标"),
+
+    /**
+     * 玩家充值未达标
+     */
+    ORDER_AMOUNT_IS_NULL(41500, "订单金额为空");
 
 
     /**
     /**
      * 回传类型
      * 回传类型

+ 29 - 0
game-module/game-common/src/main/java/com/zanxiang/common/enums/PayDeviceEnum.java

@@ -0,0 +1,29 @@
+package com.zanxiang.common.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 支付设备类型
+ *
+ * @author xufeng
+ * @date 2022/6/16 18:07
+ */
+@Getter
+@AllArgsConstructor
+public enum PayDeviceEnum {
+    PC(1, "pc", "Pc端支付"),
+    H5(2, "h5", "Wap端支付"),
+    APP(3, "app", "App支付"),
+    MP(4, "mp", "小程序");
+
+    private Integer code;
+
+    private String name;
+
+    private String desc;
+
+    String getSqlCode(Integer code) {
+        return "," + code + ",";
+    }
+}

+ 7 - 0
game-module/game-common/src/main/java/com/zanxiang/common/exception/CustomException.java

@@ -1,5 +1,7 @@
 package com.zanxiang.common.exception;
 package com.zanxiang.common.exception;
 
 
+import com.zanxiang.common.enums.HttpStatusEnum;
+
 /**
 /**
  * 自定义异常
  * 自定义异常
  */
  */
@@ -19,6 +21,11 @@ public class CustomException extends RuntimeException {
         this.code = code;
         this.code = code;
     }
     }
 
 
+    public CustomException(HttpStatusEnum httpStatusEnum) {
+        this.message = httpStatusEnum.getMsg();
+        this.code = httpStatusEnum.getCode();
+    }
+
     public CustomException(String message, Throwable e) {
     public CustomException(String message, Throwable e) {
         super(message, e);
         super(message, e);
         this.message = message;
         this.message = message;

+ 1 - 1
game-module/game-common/src/main/java/com/zanxiang/common/handler/GlobalExceptionHandler.java

@@ -37,7 +37,7 @@ public class GlobalExceptionHandler {
         if (StringUtils.isNull(e.getCode())) {
         if (StringUtils.isNull(e.getCode())) {
             return ResultVo.fail(e.getMessage());
             return ResultVo.fail(e.getMessage());
         }
         }
-        return ResultVo.fail(e.getMessage());
+        return new ResultVo<>(e.getCode(), e.getMessage());
     }
     }
 
 
     @ExceptionHandler(Exception.class)
     @ExceptionHandler(Exception.class)

+ 5 - 0
game-module/game-manage/pom.xml

@@ -16,6 +16,11 @@
             <groupId>com.zanxiang.game</groupId>
             <groupId>com.zanxiang.game</groupId>
             <version>0.0.1-SNAPSHOT</version>
             <version>0.0.1-SNAPSHOT</version>
         </dependency>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>${alibaba.fastjson.version}</version>
+        </dependency>
     </dependencies>
     </dependencies>
 
 
 </project>
 </project>

+ 13 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/annotation/ValidLogin.java

@@ -0,0 +1,13 @@
+package com.zanxiang.sdk.common.annotation;
+
+import java.lang.annotation.*;
+
+/**
+ * @author xufeng
+ * @date 2022/6/21 11:24
+ */
+@Target({ElementType.PARAMETER})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface ValidLogin {
+}

+ 68 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/resolver/TokenArgumentResolver.java

@@ -0,0 +1,68 @@
+package com.zanxiang.sdk.common.resolver;
+
+import com.zanxiang.common.enums.HttpStatusEnum;
+import com.zanxiang.common.exception.CustomException;
+import com.zanxiang.common.utils.StringUtils;
+import com.zanxiang.common.utils.bean.BeanUtils;
+import com.zanxiang.sdk.common.annotation.ValidLogin;
+import com.zanxiang.sdk.common.util.DeviceCheckUtil;
+import com.zanxiang.sdk.domain.dto.UserTokenDTO;
+import com.zanxiang.sdk.domain.params.UserData;
+import com.zanxiang.sdk.service.IUserTokenService;
+import org.springframework.core.MethodParameter;
+import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Service;
+import org.springframework.web.bind.support.WebDataBinderFactory;
+import org.springframework.web.context.request.NativeWebRequest;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.method.support.ModelAndViewContainer;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * token转用户信息解析器
+ *
+ * @author xufeng
+ * @date 2022/6/20 09:59
+ */
+@Component
+@Service
+public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
+
+    @Resource
+    private IUserTokenService iUserTokenService;
+
+    @Override
+    public boolean supportsParameter(MethodParameter parameter) {
+        return parameter.getParameterType().equals(UserData.class);
+    }
+
+    @Override
+    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
+        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
+        if (request == null) {
+            throw new CustomException(HttpStatusEnum.UNKNOWN_ERROR);
+        }
+        boolean b = parameter.hasParameterAnnotation(ValidLogin.class);
+        String token = request.getHeader("token");
+        if (b && StringUtils.isEmpty(token)) {
+            throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
+        }
+        String userAgent = request.getHeader("user-agent");
+        Integer deviceType = DeviceCheckUtil.getType(userAgent);
+        UserData data = new UserData();
+        data.setDeviceType(deviceType);
+        if (StringUtils.isEmpty(token)) {
+            return data;
+        }
+        UserTokenDTO tokenInfoByTokenDevice = iUserTokenService.getTokenInfoByTokenDevice(token, deviceType.toString());
+        if (tokenInfoByTokenDevice == null) {
+            return data;
+        }
+        if (b && tokenInfoByTokenDevice.getUserId() == null) {
+            throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
+        }
+        return BeanUtils.copy(tokenInfoByTokenDevice, UserData.class);
+    }
+}

+ 96 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/DeviceCheckUtil.java

@@ -0,0 +1,96 @@
+package com.zanxiang.sdk.common.util;
+
+import com.zanxiang.common.enums.PayDeviceEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 通过user-agent匹配用户访问设备类型
+ *
+ * @author xufeng
+ * @date 2022/6/22 10:45
+ */
+@Component
+@Slf4j
+public class DeviceCheckUtil {
+    //手机
+    static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i"
+            + "|windows (phone|ce)|blackberry|symbianos"
+            + "|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp"
+            + "|laystation portable)|nokia|fennec|htc[-_]"
+            + "|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";
+    //平板
+    static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser"
+            + "|[1-4][0-9]{2}x[1-4][0-9]{2})\\b";
+    //苹果设备
+    static String appleReg = "\\b(ip(hone|od|ad))\\b";
+
+    //苹果设备
+    static String wxMiniReg = "\\b(miniProgram)\\b";
+
+
+    //移动设备正则匹配:手机端、平板、苹果设备、微信小程序
+    static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE);
+    static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE);
+    static Pattern applePat = Pattern.compile(appleReg, Pattern.CASE_INSENSITIVE);
+    static Pattern wxMiniPat = Pattern.compile(wxMiniReg, Pattern.CASE_INSENSITIVE);
+
+    /**
+     * 检测是否是移动设备访问
+     *
+     * @param userAgent 浏览器标识
+     * @return true:移动设备接入,false:pc端接入
+     * @Title: check
+     */
+    public static boolean isMobile(String userAgent) {
+        if (null == userAgent) {
+            return false;
+        }
+        // 匹配
+        Matcher matcherPhone = phonePat.matcher(userAgent);
+        Matcher matcherTable = tablePat.matcher(userAgent);
+        if (matcherPhone.find() || matcherTable.find()) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 通过userAgent获取支付设备类型id
+     *
+     * @param userAgent
+     * @return PayDeviceEnum
+     */
+    public static Integer getType(String userAgent) {
+        //todo app判断场景待加入
+        //todo 微信小程序场景待校验
+        boolean isMobile = isMobile(userAgent);
+        if (!isMobile) {
+            return PayDeviceEnum.PC.getCode();
+        }
+        //验证是否为微信小程序环境
+        Matcher matcherWxMini = wxMiniPat.matcher(userAgent);
+        if (matcherWxMini.find()) {
+            return PayDeviceEnum.MP.getCode();
+        }
+        return PayDeviceEnum.H5.getCode();
+    }
+
+    /**
+     * 检查是否为苹果IOS设备
+     *
+     * @param userAgent
+     * @return
+     */
+    public static Boolean isIOS(String userAgent) {
+        Matcher matcherApple = applePat.matcher(userAgent);
+        if (matcherApple.find()) {
+            return true;
+        }
+        return false;
+    }
+}

+ 27 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/config/WebMvcConfig.java

@@ -0,0 +1,27 @@
+package com.zanxiang.sdk.config;
+
+import com.zanxiang.sdk.common.resolver.TokenArgumentResolver;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author xufeng
+ * @date 2022/6/20 09:59
+ */
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Resource
+    private TokenArgumentResolver tokenArgumentResolver;
+
+
+    @Override
+    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
+        argumentResolvers.add(tokenArgumentResolver);
+    }
+
+}

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

@@ -2,22 +2,30 @@ package com.zanxiang.sdk.controller;
 
 
 import com.alibaba.nacos.common.utils.IPUtil;
 import com.alibaba.nacos.common.utils.IPUtil;
 import com.zanxiang.common.domain.ResultMap;
 import com.zanxiang.common.domain.ResultMap;
+import com.zanxiang.common.enums.HttpStatusEnum;
 import com.zanxiang.common.enums.PayWayEnum;
 import com.zanxiang.common.enums.PayWayEnum;
+import com.zanxiang.common.utils.StringUtils;
+import com.zanxiang.sdk.common.annotation.ValidLogin;
+import com.zanxiang.sdk.domain.bo.PlatformOrderBO;
 import com.zanxiang.sdk.domain.bo.ProductPayParamBO;
 import com.zanxiang.sdk.domain.bo.ProductPayParamBO;
 import com.zanxiang.sdk.domain.dto.PlatformOrderDTO;
 import com.zanxiang.sdk.domain.dto.PlatformOrderDTO;
 import com.zanxiang.sdk.domain.params.ProductPayParam;
 import com.zanxiang.sdk.domain.params.ProductPayParam;
+import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.service.Impl.pay.PayService;
 import com.zanxiang.sdk.service.Impl.pay.PayService;
 import com.zanxiang.sdk.service.PlatformOrderService;
 import com.zanxiang.sdk.service.PlatformOrderService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import org.jdom.JDOMException;
 import org.jdom.JDOMException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.IOException;
+import java.math.BigDecimal;
+import java.util.Objects;
 
 
 /**
 /**
  * 支付公共入口
  * 支付公共入口
@@ -36,14 +44,26 @@ public class PayController {
     private PlatformOrderService platformOrderService;
     private PlatformOrderService platformOrderService;
 
 
     @ApiOperation(value = "支付参数生成")
     @ApiOperation(value = "支付参数生成")
-    @GetMapping(value = "/create")
-    public ResultMap create(@RequestBody ProductPayParam product) {
-        PlatformOrderDTO info = platformOrderService.info("1", "1");
-        System.out.println(info);
+    @PostMapping(value = "/create")
+    public ResultMap create(@Validated @RequestBody ProductPayParam product, @ValidLogin UserData userData) {
         String userId = "1";
         String userId = "1";
+        if (StringUtils.isEmpty(product.getOrderId())) {
+            //虚拟充值情况,直接传金额实时生成订单
+            if (product.getAmount() == null || Objects.equals(product.getAmount(), BigDecimal.ZERO)) {
+                return ResultMap.error(HttpStatusEnum.ORDER_AMOUNT_IS_NULL.getMsg());
+            }
+            PlatformOrderBO orderBO = new PlatformOrderBO();
+            orderBO.setAmount(product.getAmount());
+            orderBO.setProductName("充值" + product.getAmount());
+            orderBO.setProductId("ptb_charge");
+            orderBO.setMgUserId(product.getMgUserId());
+            orderBO.setUserId(userId);
+            String orderId = platformOrderService.create(orderBO);
+            product.setOrderId(orderId);
+        }
         ProductPayParamBO bo = new ProductPayParamBO();
         ProductPayParamBO bo = new ProductPayParamBO();
         bo.setUserId(userId);
         bo.setUserId(userId);
-        bo.setPayDevice(product.getPayDevice());
+        bo.setPayDevice(userData.getDeviceType());
         bo.setSpbillCreateIp(IPUtil.localHostIP());
         bo.setSpbillCreateIp(IPUtil.localHostIP());
         bo.setOutTradeNo(product.getOrderId());
         bo.setOutTradeNo(product.getOrderId());
         bo.setPayWay(product.getPayWay());
         bo.setPayWay(product.getPayWay());

+ 4 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/CommonParam.java

@@ -14,6 +14,10 @@ public class CommonParam {
     @JsonAlias("app_id")
     @JsonAlias("app_id")
     private String gameId;
     private String gameId;
 
 
+    @ApiModelProperty("游戏玩家id")
+    @JsonAlias("mg_user_id")
+    private String mgUserId;
+
     //==============device 相关===============
     //==============device 相关===============
     @ApiModelProperty("设备id")
     @ApiModelProperty("设备id")
     @JsonAlias("device-device_id")
     @JsonAlias("device-device_id")

+ 8 - 4
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/ProductPayParam.java

@@ -5,6 +5,8 @@ import com.sun.istack.NotNull;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.Data;
 
 
+import java.math.BigDecimal;
+
 /**
 /**
  * 支付调起生成相关参数
  * 支付调起生成相关参数
  *
  *
@@ -17,17 +19,19 @@ public class ProductPayParam extends CommonParam {
 
 
     @ApiModelProperty("订单id")
     @ApiModelProperty("订单id")
     @JsonAlias("device-orderId")
     @JsonAlias("device-orderId")
-    @NotNull
     private String orderId;
     private String orderId;
 
 
+    @ApiModelProperty("金额")
+    private BigDecimal amount;
+
     @ApiModelProperty("支付类型(1:支付宝 2:微信 3:银联)")
     @ApiModelProperty("支付类型(1:支付宝 2:微信 3:银联)")
     @JsonAlias("payway")
     @JsonAlias("payway")
     @NotNull
     @NotNull
     private Integer payWay;
     private Integer payWay;
 
 
-    @ApiModelProperty("支付方式 (1:PC,平板 2:Wap 3:App )")
-    @NotNull
-    private Integer payDevice;
+//    @ApiModelProperty("支付方式 (1:PC,平板 2:Wap 3:App )")
+////    @NotNull
+//    private Integer payDevice;
 
 
 
 
 }
 }

+ 30 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/UserData.java

@@ -0,0 +1,30 @@
+package com.zanxiang.sdk.domain.params;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * @author : xufeng
+ * @time : 2022-06-20
+ * @description : 用户信息
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserData implements Serializable {
+
+    /**
+     * 玩家id
+     */
+    private Long userId;
+
+
+    /**
+     * 设备类型;mobile,android,iphone,ipad,web,pc,mac,wxapp
+     */
+    private Integer deviceType;
+
+}

+ 5 - 5
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/PlatformOrderServiceImpl.java

@@ -108,8 +108,8 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
 
 
     @Override
     @Override
     public PlatformOrderDTO info(String id, String userId) {
     public PlatformOrderDTO info(String id, String userId) {
-        Order order = orderMapper.selectByPrimaryKey(Long.valueOf(id));
-//        Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getId, id).eq(Order::getUserId, userId));
+//        Order order = orderMapper.selectByPrimaryKey(Long.valueOf(id));
+        Order order = getOne(new LambdaQueryWrapper<Order>().eq(Order::getId, id).eq(Order::getUserId, userId));
         return BeanUtils.copy(order, PlatformOrderDTO.class);
         return BeanUtils.copy(order, PlatformOrderDTO.class);
     }
     }
 
 
@@ -137,9 +137,9 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
                 if (StringUtils.isEmpty(platformOrderBO.getProductName())) {
                 if (StringUtils.isEmpty(platformOrderBO.getProductName())) {
                     throw new NullPointerException("ProductName");
                     throw new NullPointerException("ProductName");
                 }
                 }
-                if (platformOrderBO.getProductCnt() == null) {
-                    throw new NullPointerException("ProductCnt");
-                }
+//                if (platformOrderBO.getProductCnt() == null) {
+//                    throw new NullPointerException("ProductCnt");
+//                }
                 if (platformOrderBO.getAmount() == null) {
                 if (platformOrderBO.getAmount() == null) {
                     throw new NullPointerException("Amount");
                     throw new NullPointerException("Amount");
                 }
                 }

+ 2 - 0
game-module/game-sdk/src/main/resources/META-INF/spring.factories

@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+  com.zanxiang.common.handler.GlobalExceptionHandler