Преглед на файлове

全局设备类型类型解析

xufeng преди 2 години
родител
ревизия
e71c949af3

+ 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 + ",";
+    }
+}

+ 8 - 4
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/resolver/TokenArgumentResolver.java

@@ -5,6 +5,7 @@ import com.zanxiang.common.exception.CustomException;
 import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.common.utils.bean.BeanUtils;
 import com.zanxiang.common.utils.bean.BeanUtils;
 import com.zanxiang.sdk.common.annotation.ValidLogin;
 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.dto.UserTokenDTO;
 import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.domain.params.UserData;
 import com.zanxiang.sdk.service.IUserTokenService;
 import com.zanxiang.sdk.service.IUserTokenService;
@@ -48,13 +49,16 @@ public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
         if (b && StringUtils.isEmpty(token)) {
         if (b && StringUtils.isEmpty(token)) {
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
         }
         }
-        String deviceType = "";
+        String userAgent = request.getHeader("user-agent");
+        Integer deviceType = DeviceCheckUtil.getType(userAgent);
+        UserData data = new UserData();
+        data.setDeviceType(deviceType);
         if (StringUtils.isEmpty(token)) {
         if (StringUtils.isEmpty(token)) {
-            return null;
+            return data;
         }
         }
-        UserTokenDTO tokenInfoByTokenDevice = iUserTokenService.getTokenInfoByTokenDevice(token, deviceType);
+        UserTokenDTO tokenInfoByTokenDevice = iUserTokenService.getTokenInfoByTokenDevice(token, deviceType.toString());
         if (tokenInfoByTokenDevice == null) {
         if (tokenInfoByTokenDevice == null) {
-            return null;
+            return data;
         }
         }
         if (b && tokenInfoByTokenDevice.getUserId() == null) {
         if (b && tokenInfoByTokenDevice.getUserId() == null) {
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);

+ 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;
+    }
+}

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

@@ -2,14 +2,15 @@ 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.domain.ResultVo;
 import com.zanxiang.common.enums.HttpStatusEnum;
 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.common.utils.StringUtils;
+import com.zanxiang.sdk.common.annotation.ValidLogin;
 import com.zanxiang.sdk.domain.bo.PlatformOrderBO;
 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;
@@ -43,8 +44,8 @@ public class PayController {
     private PlatformOrderService platformOrderService;
     private PlatformOrderService platformOrderService;
 
 
     @ApiOperation(value = "支付参数生成")
     @ApiOperation(value = "支付参数生成")
-    @GetMapping(value = "/create")
-    public ResultMap create(@Validated @RequestBody ProductPayParam product) {
+    @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 (StringUtils.isEmpty(product.getOrderId())) {
             //虚拟充值情况,直接传金额实时生成订单
             //虚拟充值情况,直接传金额实时生成订单
@@ -60,11 +61,9 @@ public class PayController {
             String orderId = platformOrderService.create(orderBO);
             String orderId = platformOrderService.create(orderBO);
             product.setOrderId(orderId);
             product.setOrderId(orderId);
         }
         }
-        PlatformOrderDTO info = platformOrderService.info("1", "1");
-        System.out.println(info);
         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());

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

@@ -29,9 +29,9 @@ public class ProductPayParam extends CommonParam {
     @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;
 
 
 
 
 }
 }

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

@@ -25,6 +25,6 @@ public class UserData implements Serializable {
     /**
     /**
      * 设备类型;mobile,android,iphone,ipad,web,pc,mac,wxapp
      * 设备类型;mobile,android,iphone,ipad,web,pc,mac,wxapp
      */
      */
-    private String deviceType;
+    private Integer deviceType;
 
 
 }
 }