Bläddra i källkod

1、支付宝h5支持app地址
2、操作系统自动获取
3、支付成功自动履约:宽表数据生成、首充逻辑、用户充值统计等

xufeng 2 år sedan
förälder
incheckning
299f1e0ea4
26 ändrade filer med 251 tillägg och 39 borttagningar
  1. 5 0
      game-module/game-common/src/main/java/com/zanxiang/common/enums/HttpStatusEnum.java
  2. 21 1
      game-module/game-common/src/main/java/com/zanxiang/common/enums/OsEnum.java
  3. 5 0
      game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/LogPayCp.java
  4. 0 2
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/SDKApplication.java
  5. 10 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/resolver/TokenArgumentResolver.java
  6. 43 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/DeviceCheckUtil.java
  7. 37 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/HttpUtil.java
  8. 1 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/config/MybatisPlusConfig.java
  9. 6 2
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/controller/PayController.java
  10. 2 2
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/bo/PlatformOrderBO.java
  11. 2 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/bo/ProductPayParamBO.java
  12. 4 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/dto/PlatformOrderDTO.java
  13. 3 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/CommonParam.java
  14. 9 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/ProductPayParam.java
  15. 9 0
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/params/UserData.java
  16. 3 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GamePayWayServiceImpl.java
  17. 0 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GameUserImpl.java
  18. 0 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GameUserRoleImpl.java
  19. 1 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/PerformOrderServiceImpl.java
  20. 2 8
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/PlatformOrderServiceImpl.java
  21. 0 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserExtServiceImpl.java
  22. 0 1
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserServiceImpl.java
  23. 74 7
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/pay/AlipayServiceImpl.java
  24. 5 4
      game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/pay/PayService.java
  25. 8 1
      game-module/game-sdk/src/main/resources/bootstrap.yml
  26. 1 1
      game-module/game-sdk/src/test/java/com/zanxiang/sdk/OrderTests.java

+ 5 - 0
game-module/game-common/src/main/java/com/zanxiang/common/enums/HttpStatusEnum.java

@@ -327,6 +327,11 @@ public enum HttpStatusEnum {
      */
     ORDER_AMOUNT_IS_NULL(41500, "订单金额为空"),
 
+    /**
+     * 玩家充值未达标
+     */
+    ORDER_GAME_ID_IS_NULL(41501, "订单游戏id为空"),
+
     /**
      * 参数为空
      */

+ 21 - 1
game-module/game-common/src/main/java/com/zanxiang/common/enums/OsEnum.java

@@ -20,7 +20,27 @@ public enum OsEnum {
     /**
      * 安卓
      */
-    SYSTEM_ANDROID("android", "安卓手机操作系统");
+    SYSTEM_ANDROID("android", "安卓手机操作系统"),
+
+    /**
+     * window操作系统
+     */
+    SYSTEM_WINDOW("window", "window操作系统"),
+
+    /**
+     * window操作系统
+     */
+    SYSTEM_LINUX("linux", "linux操作系统"),
+
+    /**
+     * Mac操作系统
+     */
+    SYSTEM_MAC("mac", "Mac操作系统"),
+
+    /**
+     * 其它操作系统
+     */
+    SYSTEM_OTHER("other", "other操作系统");
 
     /**
      * 平台id

+ 5 - 0
game-module/game-mybatis/src/main/java/com/zanxiang/mybatis/entity/LogPayCp.java

@@ -30,6 +30,11 @@ public class LogPayCp implements Serializable {
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
+    /**
+     * 支付方式
+     */
+    private String payId;
+
     /**
      * 订单号
      */

+ 0 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/SDKApplication.java

@@ -1,7 +1,6 @@
 package com.zanxiang.sdk;
 
 import lombok.extern.slf4j.Slf4j;
-import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@@ -12,7 +11,6 @@ import org.springframework.web.bind.annotation.CrossOrigin;
 @Slf4j
 @EnableDiscoveryClient
 @SpringBootApplication
-@MapperScan({"com.zanxiang.mybatis.mapper", "com.zanxiang.sdk.domain.mapper"})
 @Configuration
 public class SDKApplication {
 

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

@@ -7,7 +7,11 @@ 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.Impl.pay.AlipayServiceImpl;
 import com.zanxiang.sdk.service.UserTokenService;
+import lombok.extern.slf4j.Slf4j;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.core.MethodParameter;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
@@ -27,8 +31,11 @@ import javax.servlet.http.HttpServletRequest;
  */
 @Component
 @Service
+@Slf4j
 public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
 
+    private static final Logger logger = LoggerFactory.getLogger(AlipayServiceImpl.class);
+
     @Resource
     private UserTokenService userTokenService;
 
@@ -50,9 +57,12 @@ public class TokenArgumentResolver implements HandlerMethodArgumentResolver {
             throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);
         }
         String userAgent = request.getHeader("user-agent");
+        logger.info("user-agent:{}", userAgent);
         Integer deviceType = DeviceCheckUtil.getType(userAgent);
         UserData data = new UserData();
         data.setDeviceType(deviceType);
+        data.setDeviceSystem(DeviceCheckUtil.getDeviceSystem(userAgent));
+        logger.info("UserData:{}", data);
         if (StringUtils.isEmpty(token)) {
             if (b) {
                 throw new CustomException(HttpStatusEnum.USER_NO_LOGIN);

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

@@ -1,9 +1,12 @@
 package com.zanxiang.sdk.common.util;
 
+import com.zanxiang.common.enums.OsEnum;
 import com.zanxiang.common.enums.PayDeviceEnum;
+import com.zanxiang.common.utils.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Component;
 
+import java.util.Locale;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -93,4 +96,44 @@ public class DeviceCheckUtil {
         }
         return false;
     }
+
+
+    /**
+     * 获取设备系统
+     *
+     * @param userAgent
+     * @return
+     */
+    public static String getDeviceSystem(String userAgent) {
+        if (StringUtils.isEmpty(userAgent)) {
+            return OsEnum.SYSTEM_OTHER.getOs();
+        }
+        //window
+        userAgent = userAgent.toLowerCase(Locale.ROOT);
+        if (userAgent.contains(OsEnum.SYSTEM_WINDOW.getOs())) {
+            return OsEnum.SYSTEM_WINDOW.getOs();
+        }
+        //linux
+        if (userAgent.contains(OsEnum.SYSTEM_LINUX.getOs())) {
+            return OsEnum.SYSTEM_LINUX.getOs();
+        }
+        boolean isMobile = isMobile(userAgent);
+        if (isMobile) {
+            // android
+            if (userAgent.contains(OsEnum.SYSTEM_ANDROID.getOs())) {
+                return OsEnum.SYSTEM_ANDROID.getOs();
+            }
+            //ios
+            if (isIOS(userAgent)) {
+                return OsEnum.SYSTEM_IOS.getOs();
+            }
+        } else {
+            //mac
+            if (userAgent.contains(OsEnum.SYSTEM_MAC.getOs())) {
+                return OsEnum.SYSTEM_MAC.getOs();
+            }
+        }
+
+        return OsEnum.SYSTEM_OTHER.getOs();
+    }
 }

+ 37 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/common/util/HttpUtil.java

@@ -62,6 +62,42 @@ public class HttpUtil {
         return null;
     }
 
+    public static String postDataUrl(String urlStr, String data, String contentType) {
+        BufferedReader reader = null;
+        try {
+            URLConnection conn = initHttps(urlStr);
+            if (contentType != null) {
+                conn.setRequestProperty("content-type", contentType);
+            }
+            OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream(), DEFAULT_ENCODING);
+            if (data == null) {
+                data = "";
+            }
+            writer.write(data);
+            writer.flush();
+            writer.close();
+
+            reader = new BufferedReader(new InputStreamReader(conn.getInputStream(), DEFAULT_ENCODING));
+            StringBuilder sb = new StringBuilder();
+            String line;
+            while ((line = reader.readLine()) != null) {
+                sb.append(line);
+                sb.append("\r\n");
+            }
+            return conn.getURL().toString();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                if (reader != null) {
+                    reader.close();
+                }
+            } catch (IOException e) {
+            }
+        }
+        return null;
+    }
+
     /**
      * 初始化http请求参数
      */
@@ -85,7 +121,7 @@ public class HttpUtil {
                 "application/x-www-form-urlencoded");
         http.setRequestProperty(
                 "User-Agent",
-                "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36");
+                "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36");
         http.setSSLSocketFactory(ssf);
         http.setDoOutput(true);
         http.setDoInput(true);

+ 1 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/config/MybatisPlusConfig.java

@@ -28,7 +28,7 @@ import java.sql.SQLException;
  */
 @Configuration
 @EnableTransactionManagement
-@MapperScan("com.zanxiang.mybatis.mapper")
+@MapperScan({"com.zanxiang.mybatis.mapper", "com.zanxiang.sdk.domain.mapper"})
 public class MybatisPlusConfig {
 
     /**

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

@@ -56,13 +56,16 @@ public class PayController {
             if (product.getAmount() == null || Objects.equals(product.getAmount(), BigDecimal.ZERO)) {
                 return ResultMap.error(HttpStatusEnum.ORDER_AMOUNT_IS_NULL.getMsg());
             }
+            if (StringUtils.isEmpty(product.getGameId())) {
+                return ResultMap.error(HttpStatusEnum.ORDER_GAME_ID_IS_NULL.getMsg());
+            }
             PlatformOrderBO orderBO = new PlatformOrderBO();
             orderBO.setAmount(product.getAmount());
-            orderBO.setProductName("充值" + product.getAmount());
+            orderBO.setProductName(product.getAmount().toString());//"充值" +
             orderBO.setProductId("ptb_charge");
             orderBO.setMgUserId(product.getMgUserId());
             orderBO.setUserId(userId);
-            orderBO.setGameId(product.getGameId());
+            orderBO.setGameId(Long.valueOf(product.getGameId()));
             orderBO.setCpId(cpId);
             String orderId = platformOrderService.create(orderBO);
             product.setOrderId(orderId);
@@ -71,6 +74,7 @@ public class PayController {
         bo.setGameId(product.getGameId());
         bo.setUserId(userId);
         bo.setPayDevice(userData.getDeviceType());
+        bo.setDeviceSystem(userData.getDeviceSystem());
         //todo : 工具类做了修改
         bo.setSpbillCreateIp(IpUtils.getHostIp());
         bo.setOutTradeNo(product.getOrderId());

+ 2 - 2
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/bo/PlatformOrderBO.java

@@ -7,7 +7,7 @@ import java.util.Date;
 
 @Data
 public class PlatformOrderBO {
-    
+
     private String id;
 
     /**
@@ -35,7 +35,7 @@ public class PlatformOrderBO {
      * 游戏ID
      */
 //    @NonNull
-    private String gameId;
+    private Long gameId;
 
     /**
      * 货物总价

+ 2 - 0
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/bo/ProductPayParamBO.java

@@ -41,4 +41,6 @@ public class ProductPayParamBO {
 
     private Object config; //支付相关配置
 
+    private String deviceSystem; //支付类型详情(android / ios/ window)
+
 }

+ 4 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/domain/dto/PlatformOrderDTO.java

@@ -1,5 +1,7 @@
 package com.zanxiang.sdk.domain.dto;
 
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -36,7 +38,8 @@ public class PlatformOrderDTO implements Serializable {
      * 游戏ID
      */
 //    @NonNull
-    private String gameId;
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long gameId;
 
     /**
      * 货物总价

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

@@ -4,8 +4,10 @@ import com.fasterxml.jackson.annotation.JsonAlias;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.io.Serializable;
+
 @Data
-public class CommonParam {
+public class CommonParam implements Serializable {
     //==============必须携带相关参数===========
     @ApiModelProperty("token")
     private String token;

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

@@ -3,8 +3,12 @@ package com.zanxiang.sdk.domain.params;
 import com.fasterxml.jackson.annotation.JsonAlias;
 import com.sun.istack.NotNull;
 import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.NoArgsConstructor;
 
+import java.io.Serializable;
 import java.math.BigDecimal;
 
 /**
@@ -14,7 +18,10 @@ import java.math.BigDecimal;
  * @date 2022/6/8 15:21
  */
 @Data
-public class ProductPayParam extends CommonParam {
+@EqualsAndHashCode(callSuper = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class ProductPayParam extends CommonParam implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty("订单id")
@@ -29,6 +36,7 @@ public class ProductPayParam extends CommonParam {
     @NotNull
     private Integer payWay;
 
+
 //    @ApiModelProperty("支付方式 (1:PC,平板 2:Wap 3:App )")
 ////    @NotNull
 //    private Integer payDevice;

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

@@ -27,6 +27,11 @@ public class UserData implements Serializable {
      */
     private Integer deviceType;
 
+    /**
+     * 设备类型(android / ios)
+     */
+    private String deviceSystem;
+
     public Long getUserId() {
         if (userId == null) {
             return 1L;
@@ -40,4 +45,8 @@ public class UserData implements Serializable {
         }
         return deviceType;
     }
+
+    public String getDeviceSystem() {
+        return deviceSystem;
+    }
 }

+ 3 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GamePayWayServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.zanxiang.common.enums.DeleteEnum;
 import com.zanxiang.common.enums.MaxPayLock;
+import com.zanxiang.common.enums.StatusEnum;
 import com.zanxiang.common.utils.StringUtils;
 import com.zanxiang.mybatis.entity.GamePayWay;
 import com.zanxiang.mybatis.mapper.GamePayWayMapper;
@@ -32,8 +33,9 @@ public class GamePayWayServiceImpl extends ServiceImpl<GamePayWayMapper, GamePay
                 .eq(GamePayWay::getGameId, gameId)
                 .eq(GamePayWay::getPayWayId, payType)
                 .eq(GamePayWay::getIsDelete, DeleteEnum.NO.getCode())
-                .eq(GamePayWay::getStatus, DeleteEnum.NO.getCode())
+                .eq(GamePayWay::getStatus, StatusEnum.YES.getCode())
                 .eq(GamePayWay::getMaxPayLock, MaxPayLock.UNLOCK.getCode())
+                .last("limit 1")
                 .orderBy(true, true, GamePayWay::getCreateTime));
         if (payInfo == null)
             throw new RuntimeException("暂无该游戏支付方式 gameId:" + gameId + " payType:" + payType);

+ 0 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GameUserImpl.java

@@ -17,7 +17,6 @@ import org.springframework.transaction.annotation.Transactional;
  */
 @Slf4j
 @Service
-@Transactional
 public class GameUserImpl extends ServiceImpl<GameUserMapper, GameUser> implements GameUserService {
 
 }

+ 0 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/GameUserRoleImpl.java

@@ -37,7 +37,6 @@ import java.util.Random;
  */
 @Slf4j
 @Service
-@Transactional
 public class GameUserRoleImpl extends ServiceImpl<GameUserRoleMapper, GameUserRole> implements GameUserRoleService {
 
 }

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

@@ -72,7 +72,7 @@ public class PerformOrderServiceImpl implements PerformOrderService {
         String cpPaybackUrl = "https://baidu.com";
 
         HashMap<String, String> map = new HashMap<>();
-        map.put("app_id", orderInfo.getGameId());
+        map.put("app_id", String.valueOf(orderInfo.getGameId()));
         map.put("cp_order_id", orderInfo.getCpOrderId());
         map.put("mem_id", orderInfo.getMgUserId());
         map.put("order_status", String.valueOf(orderInfo.getStatus()));

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

@@ -34,7 +34,7 @@ import java.util.Date;
 @Component
 @Slf4j
 @Service
-@Transactional
+@Transactional(rollbackFor = {Exception.class, RuntimeException.class})
 public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements PlatformOrderService {
     protected final Logger logger = LoggerFactory.getLogger(PlatformOrderServiceImpl.class);
 
@@ -44,7 +44,6 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
     @Autowired
     private ApplicationContext applicationContext;
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
     public String create(PlatformOrderBO platformOrderBO) {
         try {
@@ -56,12 +55,10 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
             }
         } catch (Exception e) {
             logger.error("生成订单失败 platformOrderBO:{}, error:{}", platformOrderBO, e);
-            e.printStackTrace();
         }
         return null;
     }
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean pay(PlatformOrderBO platformOrderBO) {
         logger.info("订单支付请求参数 platformOrderBO:{}", platformOrderBO);
@@ -84,14 +81,12 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
                 return true;
             }
             return false;
-        } catch (ParameterResolutionException e) {
+        } catch (Exception e) {
             logger.error("订单支付失败 platformOrderBO:{}, error:{}", platformOrderBO, e);
-            e.printStackTrace();
             return false;
         }
     }
 
-    @Transactional(rollbackFor = Exception.class)
     @Override
     public Boolean cancel(PlatformOrderBO platformOrderBO) {
         logger.info("订单支付取消请求参数 platformOrderBO:{}", platformOrderBO);
@@ -106,7 +101,6 @@ public class PlatformOrderServiceImpl extends ServiceImpl<OrderMapper, Order> im
             return updateById(order);
         } catch (Exception e) {
             logger.error("订单取消失败 platformOrderBO:{}, error:{}", platformOrderBO, e);
-            e.printStackTrace();
             return false;
         }
     }

+ 0 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserExtServiceImpl.java

@@ -15,7 +15,6 @@ import org.springframework.transaction.annotation.Transactional;
  */
 @Slf4j
 @Service
-@Transactional
 public class UserExtServiceImpl extends ServiceImpl<UserExtMapper, UserExt> implements UserExtService {
 
 

+ 0 - 1
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/UserServiceImpl.java

@@ -33,7 +33,6 @@ import java.util.Objects;
  */
 @Slf4j
 @Service
-@Transactional
 public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
 
     @Autowired

+ 74 - 7
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/pay/AlipayServiceImpl.java

@@ -9,7 +9,9 @@ import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse;
 import com.alipay.easysdk.payment.wap.models.AlipayTradeWapPayResponse;
 import com.zanxiang.common.domain.ResultMap;
 import com.zanxiang.common.enums.HttpStatusEnum;
+import com.zanxiang.common.enums.OsEnum;
 import com.zanxiang.common.enums.ResEnum;
+import com.zanxiang.sdk.common.util.HttpUtil;
 import com.zanxiang.sdk.domain.bo.ProductPayParamBO;
 import com.zanxiang.sdk.service.OrderPayService;
 import lombok.extern.slf4j.Slf4j;
@@ -21,10 +23,13 @@ import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * @author xufeng
@@ -42,6 +47,8 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
     @Value("payConfig.alipay.notifyUrl")
     private String notifyUrl;
 
+    private Config config;
+
     /**
      * 支付调起
      *
@@ -49,7 +56,6 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
      * @return
      */
     @Override
-
     public ResultMap create(ProductPayParamBO product) {
         this.attach = product.getAttach();
         configInit(getPayConfig(product.getGameId(), product.getPayWay(), product.getPayWay()));
@@ -64,7 +70,7 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
             case 1:
                 return this.pc(product);
             case 2:
-                return this.mobile(product);
+                return this.mobile2(product);
             case 3:
                 return this.app(product);
             default:
@@ -82,7 +88,7 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
     @Override
     public String notify(HttpServletRequest request, HttpServletResponse response) {
         try {
-            Map<String, String> params = new HashMap<>();
+            Map<String, String> params = new HashMap<String, String>();
             Enumeration<String> parameterNames = request.getParameterNames();
             while (parameterNames.hasMoreElements()) {
                 String parameterName = parameterNames.nextElement();
@@ -118,7 +124,7 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
     public ResultMap synNotify(HttpServletRequest request) {
         try {
             //获取支付宝GET过来反馈信息
-            Map<String, String> params = new HashMap<>();
+            Map<String, String> params = new HashMap<String, String>();
             Map<String, String[]> requestParams = request.getParameterMap();
             for (Iterator<String> iter = requestParams.keySet().iterator(); iter.hasNext(); ) {
                 String name = iter.next();
@@ -173,16 +179,76 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "", this.returnUrl);
             logger.info("mobile端支付生成,result:{}", response);
             if (ResponseChecker.success(response)) {
+                System.out.println("mobile端支付生成================");
+                System.out.println(response.getBody());
                 return ResultMap.ok(product.getPayDevice(), response.getBody());
             } else {
                 return ResultMap.ok(ResEnum.FAIL.getMsg());
             }
         } catch (Exception e) {
-            e.printStackTrace();
             return ResultMap.error(ResEnum.FAIL.getMsg());
         }
     }
 
+    private ResultMap mobile2(ProductPayParamBO product) {
+        try {
+            logger.info("mobile端支付生成,请求参数 bo:{}", product);
+            AlipayTradeWapPayResponse response = Factory.Payment
+                    .Wap().asyncNotify(notifyUrl)
+                    .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), "", this.returnUrl);
+            logger.info("mobile端支付生成,result:{}", response);
+            if (ResponseChecker.success(response)) {
+                HashMap<String, String> result = new HashMap<>();
+                String body = response.getBody();
+                result.put("fromData", body);
+                //安卓与ios系统时才单独获取app支付地址
+                if (product.getDeviceSystem().contains(OsEnum.SYSTEM_ANDROID.getOs()) || product.getDeviceSystem().contains(OsEnum.SYSTEM_IOS.getOs())) {
+                    Pattern pattern = Pattern.compile("action=\"(.*)\">", Pattern.CASE_INSENSITIVE);
+                    Matcher matcher = pattern.matcher(body);
+                    if (matcher.find()) {
+                        String url = matcher.group();
+                        url = url.substring(8, url.length() - 2);
+                        System.out.println(url);
+                        Pattern param = Pattern.compile("value=\"(.*)\">", Pattern.CASE_INSENSITIVE);
+                        Matcher paraMatcher = param.matcher(body);
+                        if (paraMatcher.find()) {
+                            String paramData = paraMatcher.group();
+                            paramData = paramData.substring(7, paramData.length() - 2);
+                            paramData = paramData.replace("&quot;", "\"");
+                            String mobileClientUrl = HttpUtil.postDataUrl(url, "biz_content=" + paramData, null);
+                            System.out.println(mobileClientUrl);
+                            String alipayContentBody = HttpUtil.postData(mobileClientUrl, "");
+                            Pattern mobileClientParam = Pattern.compile("\\{\"queryResultUrl\".*?\"}", Pattern.CASE_INSENSITIVE);
+                            Matcher mobileClientMatcher = mobileClientParam.matcher(alipayContentBody);
+                            System.out.println(mobileClientMatcher);
+                            String deeplink_android = "alipays://platformapi/startApp?appId=20000125&orderSuffix=";
+                            String deeplink_ios = "alipay://alipayclient/?";
+                            if (mobileClientMatcher.find()) {
+                                //示例:{"queryResultUrl":"/h5/h5RoutePayResultQuery.json?h5_route_token=GZ00rxXoidjHj2airAK8nhYz70MUBsmobilecashierGZ00","invokeAlipayData":{"dataString":"h5_route_token=\"GZ00rxXoidjHj2airAK8nhYz70MUBsmobilecashierGZ00\"&is_h5_route=\"true\""}
+                                String pageData = mobileClientMatcher.group() + "}";
+                                JSONObject jsonObject = JSONObject.parseObject(pageData);
+                                Object invokeAlipayData = jsonObject.get("invokeAlipayData");
+                                String dataString = JSONObject.parseObject(invokeAlipayData.toString()).get("dataString").toString();
+                                deeplink_android += URLEncoder.encode(dataString, "utf-8");
+                                deeplink_ios += URLEncoder.encode(pageData, "utf-8");
+                                if (product.getDeviceSystem().contains(OsEnum.SYSTEM_ANDROID.getOs())) {
+                                    result.put("appLink", deeplink_android);
+                                } else {
+                                    result.put("appLink", deeplink_ios);
+                                }
+                            }
+                        }
+                    }
+                }
+                return ResultMap.ok(product.getPayDevice(), result);
+            }
+        } catch (
+                Exception e) {
+            return ResultMap.error(ResEnum.FAIL.getMsg());
+        }
+        return ResultMap.error(ResEnum.FAIL.getMsg());
+    }
+
     /**
      * 电脑支付
      *
@@ -194,6 +260,7 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
             logger.info("pc端支付生成,请求参数 bo:{}", product);
             AlipayTradePagePayResponse response = Factory.Payment
                     .Page().asyncNotify(notifyUrl)
+                    .optional("goods_detail", "1")
                     .pay(product.getSubject(), product.getOutTradeNo(), product.getTotalFee(), this.returnUrl);
             logger.info("pc端支付生成,result:{}", response);
             if (ResponseChecker.success(response)) {
@@ -203,7 +270,6 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
             }
         } catch (Exception e) {
             logger.error("pc端支付生成异常 e:{}", e);
-            e.printStackTrace();
             return ResultMap.error(ResEnum.FAIL.getMsg());
         }
     }
@@ -239,5 +305,6 @@ public class AlipayServiceImpl extends PayService implements OrderPayService {
     public void configInit(String obj) {
         Config config = JSONObject.parseObject(obj, Config.class);
         Factory.setOptions(config);
+        this.config = config;
     }
-}
+}

+ 5 - 4
game-module/game-sdk/src/main/java/com/zanxiang/sdk/service/Impl/pay/PayService.java

@@ -62,15 +62,16 @@ public class PayService {
         try {
             //获取订单信息
             PlatformOrderDTO info = platformOrderService.info(product.getOutTradeNo(), product.getUserId());
-            if (info == null)
+            if (info == null) {
                 throw new RuntimeException("订单不存在");
-
+            }
+            String gameId = String.valueOf(info.getGameId());
             //根据订单中游戏id,获取游戏的支付方式
-            GamePayWay payInfo = gamePayWayService.getPayWayToOrderPay(info.getGameId(), product.getPayWay());
+            GamePayWay payInfo = gamePayWayService.getPayWayToOrderPay(gameId, product.getPayWay());
 
             product.setProductId(info.getProductId());
             product.setSubject(info.getProductName());
-            product.setGameId(info.getGameId());
+            product.setGameId(gameId);
             product.setTotalFee(String.valueOf(info.getAmount()));
             product.setOutTradeNo(info.getId());
             product.setFrontUrl("");

+ 8 - 1
game-module/game-sdk/src/main/resources/bootstrap.yml

@@ -3,7 +3,10 @@ server:
   shutdown: graceful
   port: 8091
   domain: http://localhost:8091
-#  servlet:
+
+  servlet:
+    encoding:
+      charset: UTF-8
 #    context-path: /game-manage
 
 # Spring
@@ -69,3 +72,7 @@ payConfig:
   alipay:
     returnUrl: http://localhost:8091/pay/alipaySynNotify
     notifyUrl: http://localhost:8091/pay/notify
+
+
+
+

+ 1 - 1
game-module/game-sdk/src/test/java/com/zanxiang/sdk/OrderTests.java

@@ -38,7 +38,7 @@ public class OrderTests extends SDKApplicationTests {
         bo.setCpOrderId("cp00001");
         bo.setUserId("1");
         bo.setMgUserId("1");
-        bo.setGameId("1");
+        bo.setGameId(1L);
         bo.setAmount(new BigDecimal("0.01"));
         bo.setProductId("cs0001");
         bo.setProductCnt(1);