Browse Source

add zfb、wechat网页端支付

zoujiajian 3 years ago
parent
commit
436cddafbd
28 changed files with 1346 additions and 493 deletions
  1. 13 0
      netflix-common/pom.xml
  2. 13 0
      netflix-dao/src/main/java/com/cyksj/mapper/PhoneCodeMapper.java
  3. 22 0
      netflix-dao/src/main/java/com/cyksj/model/dto/AliPayParams.java
  4. 5 0
      netflix-dao/src/main/java/com/cyksj/model/dto/H5JsPayParams.java
  5. 33 0
      netflix-dao/src/main/java/com/cyksj/model/dto/UnifiedOrder.java
  6. 49 0
      netflix-dao/src/main/java/com/cyksj/model/entity/ExchangeCode.java
  7. 20 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  8. 18 0
      netflix-dao/src/main/java/com/cyksj/model/entity/PhoneCode.java
  9. 2 0
      netflix-dao/src/main/java/com/cyksj/model/entity/User.java
  10. 26 0
      netflix-dao/src/main/java/com/cyksj/model/request/LoginPhoneReq.java
  11. 2 1
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  12. 26 0
      netflix-dao/src/main/java/com/cyksj/model/response/AliPayTradeStatus.java
  13. 26 0
      netflix-dao/src/main/java/com/cyksj/model/response/LoginPhoneRep.java
  14. 7 0
      netflix-service/src/main/java/com/cyksj/common/EnvCommonService.java
  15. 35 0
      netflix-service/src/main/java/com/cyksj/config/wxlogin/WxOpenPlatYHLXLoginConfig.java
  16. 38 0
      netflix-service/src/main/java/com/cyksj/config/zfb/BaseZfbConfig.java
  17. 51 0
      netflix-service/src/main/java/com/cyksj/config/zfb/ZfbConfig.java
  18. 23 0
      netflix-service/src/main/java/com/cyksj/config/zfb/ZfbProductCode.java
  19. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  20. 0 1
      netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java
  21. 17 1
      netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java
  22. 635 470
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  23. 1 1
      netflix-service/src/main/java/com/cyksj/service/wechat/WeChatService.java
  24. 12 7
      netflix-service/src/main/java/com/cyksj/service/wechat/impl/WeChatServiceImpl.java
  25. 139 4
      netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java
  26. 132 8
      netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java
  27. 0 0
      netflix-web/src/main/resources/application-dev.yml
  28. 0 0
      netflix-web/src/main/resources/application-prd.yml

+ 13 - 0
netflix-common/pom.xml

@@ -63,11 +63,24 @@
             <version>5.4.7</version>
         </dependency>
 
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.3.3</version>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-test</artifactId>
             <scope>test</scope>
         </dependency>
+
+        <!--阿里支付sdk-->
+        <dependency>
+            <groupId>com.alipay.sdk</groupId>
+            <artifactId>alipay-sdk-java</artifactId>
+            <version>4.34.22.ALL</version>
+        </dependency>
     </dependencies>
 
 

+ 13 - 0
netflix-dao/src/main/java/com/cyksj/mapper/PhoneCodeMapper.java

@@ -0,0 +1,13 @@
+package com.cyksj.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cyksj.model.entity.PhoneCode;
+
+/*
+ *项目名: netflix
+ *文件名: PhoneCodeMapper
+ *创建者: JavaZou
+ *创建时间:2022/11/7 13:48
+ */
+public interface PhoneCodeMapper extends BaseMapper<PhoneCode> {
+}

+ 22 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/AliPayParams.java

@@ -0,0 +1,22 @@
+package com.cyksj.model.dto;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: AliPayParams
+ *创建者: JavaZou
+ *创建时间:2022/11/2 11:16
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+public class AliPayParams {
+	private String body;
+
+	public AliPayParams(String body) {
+		this.body = body;
+	}
+}

+ 5 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/H5JsPayParams.java

@@ -47,6 +47,11 @@ public abstract class H5JsPayParams implements Serializable {
 
     private String orderNo;
 
+    /**
+     * 二维码链接
+     */
+    private String codeUrl;
+
     public String println(String shopKey) {
         return "appId=" + this.appId +
                 "&nonceStr=" + this.nonceStr +

+ 33 - 0
netflix-dao/src/main/java/com/cyksj/model/dto/UnifiedOrder.java

@@ -85,6 +85,13 @@ public class UnifiedOrder {
     @JsonProperty("spbill_create_ip")
     private String spbillCreateIp;
 
+    /**
+     * 交易结束时间
+     */
+    @JacksonXmlCData
+    @JsonProperty("time_expire")
+    private String timeExpire;
+
     /**
      * 通知地址
      */
@@ -138,4 +145,30 @@ public class UnifiedOrder {
                 "&trade_type=MWEB" +
                 "&key=" + shopKey;
     }
+
+    public String nativePrintln(String shopKey) {
+        return "appid=" + this.appid +
+                "&attach=" + this.attach +
+                "&body=" + this.body +
+                "&mch_id=" + this.mchId +
+                "&nonce_str=" + this.nonceStr +
+                "&notify_url=" + this.notifyUrl +
+                "&out_trade_no=" + this.outTradeNo +
+                "&spbill_create_ip=" + this.spbillCreateIp +
+                "&time_expire=" + this.timeExpire +
+                "&total_fee=" + totalFee +
+                "&trade_type=NATIVE" +
+                "&key=" + shopKey;
+    }
+
+    public String getPrintln(String tradeType, String shopKey) {
+        switch (tradeType) {
+            case "MWEB":
+                return this.H5Println(shopKey);
+            case "NATIVE":
+                return this.nativePrintln(shopKey);
+            default:
+                return this.println(shopKey);
+        }
+    }
 }

+ 49 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/ExchangeCode.java

@@ -0,0 +1,49 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: ExchangeCode
+ *创建者: JavaZou
+ *创建时间:2022/11/7 14:46
+ */
+@Getter
+@Setter
+public class ExchangeCode extends BaseEntity {
+	/**
+	 * 兑换码
+	 */
+	private String code;
+
+	/**
+	 * 平台id
+	 */
+	private Long goodsId;
+
+	/**
+	 * 规格id
+	 */
+	private Long skuId;
+
+	/**
+	 * 导出状态
+	 */
+	private Boolean exportStatus;
+
+	/**
+	 * 使用人id
+	 */
+	private Long userId;
+
+	/**
+	 * 兑换时间
+	 */
+	private String useTime;
+
+	/**
+	 * 使用状态
+	 */
+	private Boolean useStatus;
+}

+ 20 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -4,6 +4,7 @@ import lombok.*;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Arrays;
 import java.util.Date;
 
 /**
@@ -54,6 +55,11 @@ public class OrderDon extends BaseEntity implements Serializable {
     /** 支付状态 */
     private Status status ;
 
+    /**
+     * 支付类型
+     */
+    private Type type;
+
     /**
      * 支付时间
      */
@@ -81,4 +87,18 @@ public class OrderDon extends BaseEntity implements Serializable {
             return desc;
         }
     }
+
+    @Getter
+    @AllArgsConstructor
+    public enum Type{
+        WeChat("wechat","微信"),
+        ALI_PAY("zfb","支付宝"),
+        ;
+        String type;
+        String desc;
+
+        public static Type getType(String type) {
+            return Arrays.stream(Type.values()).filter(tp -> tp.getType().equals(type)).findFirst().orElse(WeChat);
+        }
+    }
 }

+ 18 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/PhoneCode.java

@@ -0,0 +1,18 @@
+package com.cyksj.model.entity;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: PhoneCode
+ *创建者: JavaZou
+ *创建时间:2022/11/7 13:47
+ */
+@Getter
+@Setter
+public class PhoneCode extends BaseEntity{
+	private String phone;
+
+	private String code;
+}

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/User.java

@@ -16,6 +16,8 @@ import java.io.Serializable;
 public class User extends BaseEntity implements Serializable{
     /** 手机号;手机号 */
     private String phone ;
+    /** 手机号登录 */
+    private String loginPhone;
     /** 昵称;昵称 */
     private String nickname ;
     /** 头像;头像 */

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/request/LoginPhoneReq.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.request;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: PhoneLoginDtp
+ *创建者: JavaZou
+ *创建时间:2022/11/7 13:32
+ */
+@Getter
+@Setter
+public class LoginPhoneReq {
+	private String phone;
+
+	/**
+	 * 验证码
+	 */
+	private String code;
+
+	/**
+	 * 跳转url
+	 */
+	private String redirectUrl;
+}

+ 2 - 1
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -4,7 +4,6 @@ import lombok.Getter;
 import lombok.Setter;
 import lombok.ToString;
 
-import javax.validation.constraints.DecimalMin;
 import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 
@@ -55,4 +54,6 @@ public class OrderPayRequest {
      * 收获地址id
      */
     private Long addressId;
+
+    private String type;
 }

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/response/AliPayTradeStatus.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author chan
+ * @className AliPayTradeStatus
+ * @description 支付宝支付 状态枚举
+ * @date 2020/9/2 11:56 上午
+ */
+@AllArgsConstructor
+@Getter
+public enum AliPayTradeStatus {
+
+    TRADE_CLOSED("TRADE_CLOSED", "交易关闭"),
+    TRADE_FINISHED("TRADE_FINISHED", "交易完结"),
+    TRADE_SUCCESS("TRADE_SUCCESS", "支付成功"),
+    WAIT_BUYER_PAY("WAIT_BUYER_PAY", "交易创建");
+
+    private String status;
+
+    private String desc;
+
+
+}

+ 26 - 0
netflix-dao/src/main/java/com/cyksj/model/response/LoginPhoneRep.java

@@ -0,0 +1,26 @@
+package com.cyksj.model.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: LoginPhoneRep
+ *创建者: JavaZou
+ *创建时间:2022/11/7 15:08
+ */
+@Getter
+@Setter
+@AllArgsConstructor
+@NoArgsConstructor
+public class LoginPhoneRep {
+	private String saToken;
+
+	private Long uid;
+
+	private String nickname;
+
+	private String img;
+}

+ 7 - 0
netflix-service/src/main/java/com/cyksj/common/EnvCommonService.java

@@ -20,4 +20,11 @@ public class EnvCommonService {
 
 	@Value(value = "${spring.profiles.active}")
 	private String env;
+
+	public String getHost() {
+		if ("dev".equals(env)) {
+			return "inside.yicanggongyi.com";
+		}
+		return "netflix.tw.cn";
+	}
 }

+ 35 - 0
netflix-service/src/main/java/com/cyksj/config/wxlogin/WxOpenPlatYHLXLoginConfig.java

@@ -0,0 +1,35 @@
+package com.cyksj.config.wxlogin;
+
+import lombok.Getter;
+import lombok.Setter;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+/*
+ *项目名: netflix
+ *文件名: WxOpenPlatYHLXLogin
+ *创建者: JavaZou
+ *创建时间:2022/11/1 14:46
+ * 银河录像网页微信登录配置
+ */
+@Configuration
+@ConfigurationProperties(prefix = "wx-login")
+@Getter
+@Setter
+public class WxOpenPlatYHLXLoginConfig {
+	/**
+	 * 应用唯一标识
+	 */
+	private String appId;
+
+	private String secret;
+
+	/**
+	 * 请使用 urlEncode 对链接进行处理
+	 */
+	private String redirectUri;
+
+	private String loginUrl;
+
+	private String remark;
+}

+ 38 - 0
netflix-service/src/main/java/com/cyksj/config/zfb/BaseZfbConfig.java

@@ -0,0 +1,38 @@
+package com.cyksj.config.zfb;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/*
+ *项目名: netflix
+ *文件名: BaseZfbConfig
+ *创建者: JavaZou
+ *创建时间:2022/11/2 10:38
+ */
+@Getter
+@Setter
+public class BaseZfbConfig {
+	/**
+	 * 请求支付宝的网关地址
+	 */
+	public static String url = "https://openapi.alipay.com/gateway.do";
+
+	/**
+	 * 参数返回格式
+	 */
+	public static String format = "JSON";
+
+	/**
+	 * 编码格式
+	 */
+	public static String  charset = "UTF-8";
+
+	/**
+	 * 签名算法
+	 */
+	public static String signType = "RSA2";
+
+	public static String returnUrl = "yinhe/web/ticket";
+
+	public static String notifyUrl = "applets/order/prepay/zfb/notify";
+}

+ 51 - 0
netflix-service/src/main/java/com/cyksj/config/zfb/ZfbConfig.java

@@ -0,0 +1,51 @@
+package com.cyksj.config.zfb;
+
+import lombok.Getter;
+
+/*
+ *项目名: netflix
+ *文件名: YHLXZfbConfig
+ *创建者: JavaZou
+ *创建时间:2022/11/2 11:18
+ */
+@Getter
+public enum ZfbConfig {
+	YHLX_ZfB("银河录像支付宝",
+			"2021003159660212",
+			"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn2EhukP6egJbIheQuphvxJEoDybu39DXU4VClwE0kPPPro2kP4pjCEDmcIDmIr27YR06sBXv7BoYCrex4WWFXXemH2yP7skHyD3UdsFCG4eQhrApwrYoSraIoumE0CEDwNvUjLZ3DYqyFGIE5OumsX/3HBMC4xcOWlZilhtGCgruL2IeOt5R1qVUgiER1Gu/Ng3U/HrhZG1raJRb+f8PmUKgC/ZeT2avxkjqYqp5QBR0BIZhCbi+SbO4YHCZ79k+hn/ZySJqXRo1jpxWSzb3r/BXV4j8YZzqJm+FThKHB2HWLDz5R5tUpGR0PgxtLPx+mTI1wIqmRmzjUZeTPdqg+wIDAQAB",
+			"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu6ghAniFoAfa6iTLA+EjQfnSJNcsVWl+tB9VDVBTX00JPg+kIMNi+PFoHZciQMQrpmzHsRc90z4oMulgT36/ZzBSm68C/gk0SfCrLouA+EKti1NxX/WuUoRFbSabYwmE9YIfkvM9Shx13iHr1NyOLwfl4jFOjgj0Dd1psa+lGqFUDEV/3YVNkS1fzMkTZtx2ODBPdMGLmi+JdtIBDE2FpSg5YcgvCV1qJ22m6k5DQ9k270ckdg1LtJ9jVkYUyO2B18YrIkOmY6u6MiZGINK6/1JkoS5LPVZK95D+3SKLQNPMeQCPfdZ9+GFehhRbol2pwy1Yw8DOmgt90rF8u8v7+wIDAQAB",
+			"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC7qCECeIWgB9rqJMsD4SNB+dIk1yxVaX60H1UNUFNfTQk+D6Qgw2L48WgdlyJAxCumbMexFz3TPigy6WBPfr9nMFKbrwL+CTRJ8Ksui4D4Qq2LU3Ff9a5ShEVtJptjCYT1gh+S8z1KHHXeIevU3I4vB+XiMU6OCPQN3Wmxr6UaoVQMRX/dhU2RLV/MyRNm3HY4ME90wYuaL4l20gEMTYWlKDlhyC8JXWonbabqTkND2TbvRyR2DUu0n2NWRhTI7YHXxisiQ6Zjq7oyJkYg0rr/UmShLks9Vkr3kP7dIotA08x5AI991n34YV6GFFuiXanDLVjDwM6aC33SsXy7y/v7AgMBAAECggEAH5vXS5I/d9A66Juf8pxWkwNgiUIRPqXRaMeqTN7N3EyelOyPidE/d406K1nMtDoW3CaQkFzI1i8vGDxFM762wMvb7ktRZrboLtgyDVoENE0O7Fv2yeIZJd8Pzq3lGI5+7deoN9lu5m/azrrJ/YXVEUj0SOBjSftqGHfGGN7sIYrnRDYeK/m5T5cBsPOjqDc+VbUVl71kDCxrrQHFoDeZ7NFvQTKI3ILcd2IUxXkDA/WNUqrbLB3EABWxQRnGXh4PBc5T0rGOePfEhOYX1sd6MPCTelqiYEF/DM4827j8ED1nnof5UdUj2ftI/Gm9eV4CJ3ZUR/yJtJHPmXoXMcuyeQKBgQDd+DBL2JvQ1iaRN3VsiaT8oP34dXd3M+H4LUoAgVzl1Dd42CmhznbczafUDkiHVRq6iskK9qrBRBZ9Bh287c301oq3oMvak4Gora9dinjZ/Ynk0ZYpb4gYxAEeU66YYMarnxDYK/ISKanZsTWE9++54oQMIX94x3FyW9lVmx7pBwKBgQDYbT3NByn5L85+cBksp00TZCUFgoZbU4fxB+o48Tpd5ibC14tZPGQnB0trrAvYV3WRg5Y+oFEfO7yzCzA3k8eEMhA1ogq0QzrkuJsRkWGIURmiFo37Gf0+F1UewgqZZqlL5PYY0Th+eRgniwnKO67/W6EeejWbpZO1uOXplSocbQKBgQC69yynFkLYuyktNEuCKsZ/zJNfzoHcNCVoR62Hk29OX1yCO4GFu0S/Y7KzmXxaEcM70V7aDz9xHwraMGaoFp5eVr/tQFG1QH38OJ/36IU3CKo3xJn5OOqoAaD3jIEJ9KojMQ6dJxb1WYapyOxNnhGcv0F+flDCySuzqc38n3Z/zQKBgHIyEe3g3dDR3M7yLxZUoGKe8LnbiTEe/he76WZqQjXRfppISQqoxt+hBbambQmV/D7vg5M/3A3y4zpFqQdqPlgOYmcqPSOoZabRkWDPqPrYcAIKjJf1up3MielU0WrntGSLRx8JJhn1oz0aK+w9WbT7kCQYr7iUwT+ddBKv1ixxAoGAS/1B81tliN26c/+Awf46hfre+vSEsipxf9OvoJIRXaUkGh/gk/ub/FeGTIN8TiBwEK00zM9NCSquhSGuxetvqkwAE7yoqRJw7igCv6BjQVEJXC+zqnnVQFytmq5qPrFnj9CVY/5AgPvdGj3nba0yi5oiF6mWDa8O5LVJUylkI8E="),
+	;
+	/**
+	 * 描述
+	 */
+	private String desc;
+
+	/**
+	 * appid 即创建应用后生成。
+	 */
+	private String appId;
+
+	/**
+	 * 支付宝公钥
+	 */
+	private String alipayPublicKey;
+
+	/**
+	 * 应用公钥
+	 */
+	public String aliAppPublicKey;
+
+	/**
+	 * 开发者私钥,由开发者自己生成
+	 */
+	private String privateKey;
+
+	ZfbConfig(String desc, String appId, String alipayPublicKey, String aliAppPublicKey, String privateKey) {
+		this.desc = desc;
+		this.appId = appId;
+		this.alipayPublicKey = alipayPublicKey;
+		this.aliAppPublicKey = aliAppPublicKey;
+		this.privateKey = privateKey;
+	}
+}

+ 23 - 0
netflix-service/src/main/java/com/cyksj/config/zfb/ZfbProductCode.java

@@ -0,0 +1,23 @@
+package com.cyksj.config.zfb;
+
+import lombok.Getter;
+
+/*
+ *项目名: netflix
+ *文件名: ZfbProductCode
+ *创建者: JavaZou
+ *创建时间:2022/11/2 14:44
+ */
+@Getter
+public enum ZfbProductCode {
+	MOBILE_WEB("支付宝手机网页支付", "QUICK_WAP_PAY"),
+	PC_WEB("支付宝电脑网站支付", "FAST_INSTANT_TRADE_PAY"),
+	;
+	String desc;
+	String productCode;
+
+	ZfbProductCode(String desc, String productCode) {
+		this.desc = desc;
+		this.productCode = productCode;
+	}
+}

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -583,6 +583,7 @@ public class RedisService {
 	    CORP_JS_TICKET_KEY("corp_wechat:js_ticket:", "js_ticket", 60 * 30L),
 	    CORP_AGENT_JS_TICKET_KEY("corp_wechat:js_ticket:agent:", "js_ticket", 60 * 30L),
 	    MAPPING_INDEX_KEY("mapper:index:", "授权跳转", 60 * 10L),
+        WX_LOGIN_AUTH_URI("wx_login_auth_uri:%s", "微信网页授权登录uri", 60 * 60 * 24L),
         ;
 
         private String name;

+ 0 - 1
netflix-service/src/main/java/com/cyksj/service/mange/group/CmsGroupServiceImpl.java

@@ -16,7 +16,6 @@ import com.cyksj.model.entity.OrderDon;
 import com.cyksj.service.mange.CmsGroupService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;

+ 17 - 1
netflix-service/src/main/java/com/cyksj/service/order/OrderDonService.java

@@ -1,6 +1,7 @@
 package com.cyksj.service.order;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.dto.H5JsPayParams;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.manage.views.OrderDonView;
@@ -21,7 +22,12 @@ public interface OrderDonService extends IService<OrderDon> {
     /**
      * 订单支付
      */
-    H5JsPayParams pay(Long orderId) throws Exception;
+    H5JsPayParams pay(Long orderId, String tradeType) throws Exception;
+
+    /**
+     * 微信pc端支付
+     */
+    H5JsPayParams wxPcWebPay(Long orderId, String tradeType) throws Exception;
 
     /**
      * 微信支付回调
@@ -38,4 +44,14 @@ public interface OrderDonService extends IService<OrderDon> {
     OrderDonView getDetail(Long orderId, long userId);
 
 	List<OrderDon> getAppleOneOrderDons(String appleOne, List<Long> skuIds, List<String> noOrderStatus, Date yesZeroDate, Date thisZeroDate);
+
+    /**
+     * 支付宝预支付
+     */
+    AliPayParams aliPay(Long orderId, String productCode) throws Exception;
+
+    /**
+     * 支付宝回调
+     */
+    void aliPayNotify(Map<String, String> paramsMap) throws Exception;
 }

+ 635 - 470
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -1,7 +1,14 @@
 package com.cyksj.service.order.impl;
 
 import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import com.alipay.api.*;
+import com.alipay.api.domain.AlipayTradePagePayModel;
+import com.alipay.api.domain.AlipayTradeWapPayModel;
+import com.alipay.api.internal.util.AlipaySignature;
+import com.alipay.api.request.AlipayTradePagePayRequest;
+import com.alipay.api.request.AlipayTradeWapPayRequest;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cyksj.common.EnvCommonService;
@@ -12,8 +19,12 @@ import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.Codec;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.config.WeChatConfig;
+import com.cyksj.config.zfb.BaseZfbConfig;
+import com.cyksj.config.zfb.ZfbConfig;
+import com.cyksj.config.zfb.ZfbProductCode;
 import com.cyksj.dto.RedisKey;
 import com.cyksj.mapper.*;
+import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.dto.H5JsPayParams;
 import com.cyksj.model.dto.WxMpTemplateData;
 import com.cyksj.model.dto.WxMpTemplateMessage;
@@ -34,6 +45,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -55,476 +67,629 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
     private static final GlobalThreadPoolTaskExecutor THREAD_POOL_TASK_EXECUTOR = GlobalThreadPoolTaskExecutor.getInstance();
 
-    private static final Sequence SEQUENCE = new Sequence(0);
+	private static final Sequence SEQUENCE = new Sequence(0);
 
-    private final WeChatConfig weChatConfig;
-
-    private final UserMapper userMapper;
+	private final WeChatConfig weChatConfig;
+
+	private final UserMapper userMapper;
 
-    private final WeChatService weChatService;
-
-    private final RedisService redisService;
-
-    private final GoodsDonSkuMapper goodsDonSkuMapper;
-
-    private final GoodsDonMapper goodsDonMapper;
-
-    private final GroupsRelationMapper groupsRelationMapper;
-
-    private final BeanSearcher beanSearcher;
-
-    private final GroupsMapper groupsMapper;
-
-    private final JobManager jobManager;
-
-    private final OrderDonTransportMapper orderDonTransportMapper;
-
-    private final AddressMapper addressMapper;
-
-    private final OrderDonTransportMapper transportMapper;
-
-    private final OrderDonWaybillMapper waybillMapper;
-
-    private final OrderDonMapper orderDonMapper;
-
-    private final EnvCommonService envCommonService;
-
-    private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
-
-    private final CustomerServiceMapper customerServiceMapper;
-
-
-    @Transactional(rollbackFor = Throwable.class)
-    @Override
-    public OrderDon submit(OrderPayRequest payRequest) {
-        User user = userMapper.selectById(payRequest.getUserId());
-        GoodsDonSku sku = goodsDonSkuMapper.selectById(payRequest.getSkuId());
-        GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
-        if (goodsDon == null || !goodsDon.getStatus()) {
-            throw new BusinessRuntimeException("商品已下架");
-        }
-        String payOpenId = user.getOpenId();
-
-        Long relationId = 0L;
-
-        if(goodsDon.getType() == 1){
-            GroupsRelation relation = null;
-            //锁定座位
-            if (payRequest.getRelationId() != null && payRequest.getRelationId() > 0) {
-                relation = groupsRelationMapper.selectById(payRequest.getRelationId());
-                if (relation == null) {
-                    throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
-                }
-                if (relation.getUserId() != null && relation.getUserId() > 0L) {
-                    throw new BusinessRuntimeException(GROUP_INDEX_ALREADY_BE_USER.getCode(), GROUP_INDEX_ALREADY_BE_USER.getMsg());
-                }
-
-            } else {
-                //TODO 如果没指定座位,等待逻辑确认
-                GroupsTrips groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class).eq(GroupsTrips::getSkuId, payRequest.getSkuId()).gt(GroupsTrips::getAvailableNum, 0).last("limit 1").orderByAsc(GroupsTrips::getAvailableNum));
-                if (groups == null) {
-                    //新增车次
-                    groups = new GroupsTrips();
-                    groups.setSkuId(sku.getId());
-                    groups.setNum(sku.getNum());
-                    groups.setAvailableNum(sku.getNum());
-                    groups.setStatus(GroupsTrips.Status.waiting);
-                    groups.setRemark("等待设置账号");
-                    groupsMapper.insert(groups);
-                    relation = new GroupsRelation();
-                    relation.setGroupsId(groups.getId());
-                    relation.setNum(1);
-                    relation.setStatus(GroupsRelation.Status.locking);
-                    relation.setGroupsId(groups.getId());
-                    groupsRelationMapper.insert(relation);
-
-                    for (int i = 2; i <= groups.getNum(); i++) {
-                        GroupsRelation groupsRelation = new GroupsRelation();
-                        groupsRelation.setGroupsId(groups.getId());
-                        groupsRelation.setNum(i);
-                        groupsRelation.setStatus(GroupsRelation.Status.none);
-                        groupsRelationMapper.insert(groupsRelation);
-                    }
-                } else {
-                    //寻找快满编车队进行占座
-                    relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
-                            .eq(GroupsRelation::getGroupsId, groups.getId())
-                            .eq(GroupsRelation::getStatus, "none")
-                            .eq(GroupsRelation::getUserId, 0)
-                            .orderByAsc(GroupsRelation::getNum)
-                            .last("limit 1")
-                    );
-                    if (relation == null) {
-                        throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
-                    }
-                }
-            }
-
-            //锁定座位
-            setRelation(relation.getId(), payRequest.getUserId());
-            relation.setUserId(user.getId());
-            relation.setStatus(GroupsRelation.Status.locking);
-            groupsRelationMapper.updateById(relation);
-            relationId = relation.getId();
-        }else {
-
-        }
-
-        /* 生成订单 */
-        String donNo = SEQUENCE.nextId().toString();
-        OrderDon orderDon = new OrderDon();
-        orderDon.setOrderNo(donNo);
-        orderDon.setOpenId(payOpenId);
-        orderDon.setMoney(payRequest.getDonMoney());
-        orderDon.setSkuId(payRequest.getSkuId());
-        orderDon.setRelationId(relationId);
-        orderDon.setNum(payRequest.getNum());
-        orderDon.setGoodsId(goodsDon.getId());
-        orderDon.setStatus(OrderDon.Status.noPayment);
-        orderDon.setUserId(user.getId());
-        this.saveOrUpdate(orderDon);
-
-
-        if (goodsDon.getType() == 2) {
-            saveTransport(payRequest.getAddressId(), orderDon.getId());
-        }
-
-        jobManager.addJob(EXPIRY_TIME, () -> {
-            closeOrder(orderDon.getId());
-        });
-
-        return orderDon;
-    }
-
-    @Override
-    public H5JsPayParams pay(Long orderId) throws Exception {
-        log.info("调起微信支付[start] orderId:{}", orderId);
-        OrderDon orderDon = this.getById(orderId);
-
-        OrderAttach attach = new OrderAttach();
-        attach.setO(orderDon.getId());
-
-        String toWechatAttach = Codec.DoBase64.custom()
-                .setData(Jsons.toJson(attach)).encodeAsText();
-
-        H5JsPayParams params = weChatService.getJsPayParams(
-                weChatConfig.getAppid(),
-                orderDon.getOpenId(),
-                orderDon.getMoney().intValue(),
-                orderDon.getOrderNo(),
-                weChatConfig.getDomain() + "applets/order/prepay/notify",
-                toWechatAttach,
-                "银河录像局"
-        );
-
-        log.info("微信支付成功[end]");
-        return params;
-    }
-
-
-    @Transactional(rollbackFor = Throwable.class)
-    @Override
-    public void prepayNotify(Map<String, String> map) throws Exception {
-        /* 此处处理订单等业务逻辑 */
-        // 获取订单 和 微信订单号 和 支付的金额
-
-        String attach = Codec.DoBase64.custom().setData(map.get("attach")).decodeAsText();
-
-        OrderAttach orderAttach = Jsons.parseObject(attach, OrderAttach.class);
-
-        final Long oid = orderAttach.getO();
-
-        //final Long shareId = orderAttach.getShared();
-
-        OrderDon order = this.getById(oid);
-
-        if (null == order) {
-            throw BusinessRuntimeException.getInstance("订单不存在.");
-        }
-
-        // 校验签名
-        boolean f = weChatService.checkSignWithMd5(map, weChatConfig.getShopKey());
-        if (!f) {
-            log.error("回调数据:{}", map);
-            throw BusinessRuntimeException.getInstance("支付成功回调, 校验签名失败.");
-        }
-
-        GoodsDonSku sku = goodsDonSkuMapper.selectById(order.getSkuId());
-        GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
-
-        String transactionId = map.get("transaction_id");
-
-        if (order.getStatus().equals(OrderDon.Status.hasPayment)) {
-            log.info("已回调,重复修改状态 id:{}", order.getId());
-            return;
-        }
-
-        // 更改订单状态
-        order.setTransactionId(transactionId);
-        order.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
-
-        order.setPayTime(DateUtil.parse(map.get("time_end"), "yyyyMMddHHmmss"));
-
-        if (StringUtils.isBlank(order.getOpenId())) {
-            order.setOpenId(map.get("openid"));
-        }
-
-        if (goodsDon.getType() == 1) {
-            //修改车位状态
-            GroupsRelation relation = groupsRelationMapper.selectById(order.getRelationId());
-            GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
-            if (GroupsRelation.Status.locking.equals(relation.getStatus()) || GroupsRelation.Status.validity.equals(relation.getStatus())) {
-                relation.setStatus(GroupsRelation.Status.validity);
-                //续费后,下一次续费意愿状态为false
-                relation.setRenewStatus(false);
-                relation.setIsHandle(false);
-                if (GroupsTrips.Status.validity.equals(groupsTrips.getStatus())) {
-                    //如果续费增加时间,如果首次则设置当前时间为初始时间
-                    Date expiryTime = Optional.ofNullable(relation.getExpiryTime()).orElse(new Date());
-                    GoodsDonSku donSku = goodsDonSkuMapper.selectById(order.getSkuId());
-
-                    Date newDate = DateUtil.offset(expiryTime, DateField.MONTH, donSku.getMonths() * order.getNum());
-                    relation.setExpiryTime(newDate);
-                    relation.setStartTime(relation.getStartTime() == null ? new Date() : null);
-                }else if(GroupsTrips.Status.waiting.equals(groupsTrips.getStatus())){
-                    order.setStatus(OrderDon.Status.hasPayment);
-                }
-                //TODO 如未发车逻辑
-                groupsRelationMapper.updateById(relation);
-            }
-        }
-
-        this.updateById(order);
-
-        //新订单产生 发送模板消息给用户、客服
-        User user = userMapper.selectById(order.getUserId());
-        THREAD_POOL_TASK_EXECUTOR.execute(() -> {
-            try {
-                //发送至用户消息
-                newOderSendMsgByType(order, goodsDon, sku, user, user.getOpenId());
-            } catch (Exception e) {
-                log.error("向用户发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
-            }
-        });
-        THREAD_POOL_TASK_EXECUTOR.execute(() -> {
-            try {
-                //发送至客服消息
-                List<CustomerService> customerServices = customerServiceMapper.selectList(null);
-                for (CustomerService customerService : customerServices) {
-                    log.info("向客服{}发送新订单消息通知..", customerService.getNickName());
-                    newOderSendMsgByType(order, goodsDon, sku, user, customerService.getOpenId());
-                }
-            } catch (Exception e) {
-                log.error("向客服发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
-            }
-        });
-    }
-
-    private void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user, String toPeople) throws Exception {
-        TemplateEnum templateEnum = null;
-        if (EnvCommonService.active.equals(envCommonService.getEnv())) {
-            templateEnum = TemplateEnum.NEW_ORDER_ENV_TEMPLATE;
-        }else {
-            templateEnum = TemplateEnum.NEW_ORDER_PRD_TEMPLATE;
-        }
-        WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-                .setToUser(toPeople)
-                .setTemplateId(templateEnum.getTemplateId())
-                //TODO
-                .setUrl(" ");
-        WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-        data.setFirst(new WxMpTemplateData("新订单通知!"));
-        data.setKeyword1(new WxMpTemplateData(order.getOrderNo()));
-        data.setKeyword2(new WxMpTemplateData(String.format("%s,%s", goodsDon.getTitle(), sku.getSpecVal())));
-        data.setKeyword3(new WxMpTemplateData(user.getNickname()));
-        data.setKeyword4(new WxMpTemplateData(order.getMoney().divide(BigDecimal.valueOf(100)).toString()));
-        data.setKeyword5(new WxMpTemplateData(DateUtil.format(order.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
-        data.setRemark(new WxMpTemplateData("点击查看详情"));
-        weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
-    }
-
-    @Transactional(rollbackFor = Throwable.class)
-    @Override
-    public void closeOrder(Long orderId) {
-        log.info("关闭订单 orderId:{}", orderId);
-        //关闭订单逻辑
-        OrderDon orderDon = getById(orderId);
-        if (OrderDon.Status.noPayment.equals(orderDon.getStatus())) {
-            //查询微信支付是否已支付
-            orderDon.setStatus(OrderDon.Status.close);
-            updateById(orderDon);
-
-            //关闭车位锁定
-            GroupsRelation groupsRelation = groupsRelationMapper.selectById(orderDon.getRelationId());
-            if (groupsRelation != null) {
-                if (!groupsRelation.getUserId().equals(orderDon.getUserId())) {
-                    throw new BusinessRuntimeException("订单用户与车位用户不匹配!");
-                } else {
-                    if (GroupsRelation.Status.locking.equals(groupsRelation.getStatus())) {
-                        groupsRelation.setUserId(0L);
-                        groupsRelation.setStatus(GroupsRelation.Status.none);
-                        groupsRelationMapper.updateById(groupsRelation);
-                        delRelation(groupsRelation.getId());
-
-                        //车位空余发送模板消息
-                        TASK_POOL.execute(() -> {
-                            try {
-                                List<CustomerService> customerServices = customerServiceMapper.selectList(null);
-                                for (CustomerService customerService : customerServices) {
-                                    log.info("发送客服{}空车位通知消息", customerService.getNickName());
-                                    emptySendMsgNotify(orderDon, customerService.getOpenId());
-                                }
-                            } catch (Exception e) {
-                                log.error("发送{}空车位模板消息至客服失败:{}", orderDon.getGoodsId(), e);
-                            }
-                        });
-                    }
-                }
-            }
-        }
-    }
-
-    private void emptySendMsgNotify(OrderDon orderDon, String toPeople) throws Exception {
-        TemplateEnum templateEnum = null;
-        if (EnvCommonService.active.equals(envCommonService.getEnv())) {
-            templateEnum = TemplateEnum.EMPTY_ENV_TEMPLATE;
-        }else {
-            templateEnum = TemplateEnum.EMPTY_PRD_TEMPLATE;
-        }
-        User u = userMapper.selectById(orderDon.getUserId());
-        WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
-                .setToUser(toPeople)
-                .setTemplateId(templateEnum.getTemplateId())
-                //TODO
-                .setUrl(" ");
-        GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
-        GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
-        WxMpTemplateMessage.TemplateData data = templateMessage.getData();
-        data.setFirst(new WxMpTemplateData("空车位通知!"));
-        data.setKeyword1(new WxMpTemplateData(orderDon.getOrderNo()));
-        data.setKeyword2(new WxMpTemplateData(String.format("%s,%s", goodsDon.getTitle(), goodsDonSku.getSpecVal())));
-        data.setKeyword3(new WxMpTemplateData((u == null ? " " : u.getNickname())));
-        data.setKeyword4(new WxMpTemplateData(orderDon.getMoney().divide(BigDecimal.valueOf(100)).toString()));
-        data.setKeyword5(new WxMpTemplateData(DateUtil.format(orderDon.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
-        data.setRemark(new WxMpTemplateData("请尽快关联账号信息"));
-        weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
-    }
-
-    @Override
-    public OrderDon renewal(OrderPayRequest payRequest) {
-        User user = userMapper.selectById(payRequest.getUserId());
-
-        Long relationId = payRequest.getRelationId();
-        if (relationId == null || relationId <= 0 || payRequest.getSkuId() == null || payRequest.getNum() == null) {
-            throw new BusinessRuntimeException("缺少必填参数");
-        }
-
-        GoodsDonSku sku = goodsDonSkuMapper.selectById(payRequest.getSkuId());
-
-        GroupsRelation relation = groupsRelationMapper.selectById(relationId);
-        if (relation == null) {
-            throw new BusinessRuntimeException("");
-        }
-        if (!relation.getUserId().equals(user.getId())) {
-            throw new BusinessRuntimeException("");
-        }
-
-        GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
-        if (goodsDon == null || !goodsDon.getStatus()) {
-            throw new BusinessRuntimeException("商品已下架");
-        }
-
-        if (goodsDon.getType() == 2) {
-            throw new BusinessRuntimeException("实物不支持续费");
-        }
-
-        String payOpenId = user.getOpenId();
-
-        /* 生成订单 */
-        String donNo = SEQUENCE.nextId().toString();
-        OrderDon orderDon = new OrderDon();
-        orderDon.setOrderNo(donNo);
-        orderDon.setOpenId(payOpenId);
-        orderDon.setMoney(sku.getPrice().multiply(BigDecimal.valueOf(payRequest.getNum())));
-        orderDon.setSkuId(payRequest.getSkuId());
-        orderDon.setRelationId(relation.getId());
-
-        orderDon.setStatus(OrderDon.Status.noPayment);
-        orderDon.setUserId(user.getId());
-        this.saveOrUpdate(orderDon);
-
-        jobManager.addJob(EXPIRY_TIME, () -> {
-            closeOrder(orderDon.getId());
-        });
-
-        return orderDon;
-    }
-
-    @Override
-    public OrderDonView getDetail(Long orderId, long userId) {
-
-        OrderDonView detail = beanSearcher.searchFirst(OrderDonView.class, MapUtils.builder()
-                .field(OrderDonView::getUserId,userId)
-                .field(OrderDonView::getId,orderId)
-                .orderBy(OrderDonView::getId).desc()
-                .build());
-
-        detail.setTransport(transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId,detail.getId()).last(" limit 1")));
-        detail.setWaybill(waybillMapper.selectOne(Wrappers.lambdaQuery(OrderDonWaybill.class).eq(OrderDonWaybill::getOrderId,detail.getId()).last(" limit 1")));
-        return detail;
-    }
-
-    @Override
-    public List<OrderDon> getAppleOneOrderDons(String appleOne, List<Long> skuIds, List<String> noOrderStatus, Date yesZeroDate, Date thisZeroDate) {
-        return orderDonMapper.getAppleOneOrderDons(appleOne, skuIds, noOrderStatus, yesZeroDate, thisZeroDate);
-    }
-
-    public void setRelation(Long relationId, Long userId) {
-        int noPayCount = count(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, userId).eq(OrderDon::getStatus, OrderDon.Status.noPayment.toString()));
-
-        if (noPayCount > 0) {
-            throw new BusinessRuntimeException("您有未支付订单.");
-        }
-
-        if (redisService.get(RedisKey.GROUPS_RELATION_NUM_KEY + relationId) != null) {
-            throw new BusinessRuntimeException("客官手慢啦,该座位已经有人啦!");
-        } else {
-            redisService.set(RedisKey.GROUPS_RELATION_NUM_KEY + relationId, userId, 60 * 5L);
-            GroupsRelation relation = groupsRelationMapper.selectById(relationId);
-            int count = groupsMapper.decrAvailableNum(relation.getGroupsId());
-            if (count == 0) {
-                log.error("车位异常 groupId:{}", relation.getGroupsId());
-                throw new BusinessRuntimeException("车位异常");
-            }
-        }
-    }
-
-    public void delRelation(Long relationId) {
-        redisService.del(RedisKey.GROUPS_RELATION_NUM_KEY + relationId);
-        GroupsRelation relation = groupsRelationMapper.selectById(relationId);
-        int count = groupsMapper.incrAvailableNum(relation.getGroupsId());
-        if (count == 0) {
-            log.error("车位异常 groupId:{}", relation.getGroupsId());
-            throw new BusinessRuntimeException("车位异常");
-        }
-    }
-
-    public void saveTransport(Long addressId, Long orderId) {
-        if (addressId == null) {
-            throw new BusinessRuntimeException("请选择收货地址.");
-        }
-        Address address = addressMapper.selectById(addressId);
-        if (address == null) {
-            throw new BusinessRuntimeException("请添加收货地址.");
-        }
-        OrderDonTransport transport = new OrderDonTransport();
-        transport.setOrderId(orderId);
-        transport.setReceiver(address.getReceiver());
-        transport.setPhone(address.getPhone());
-        transport.setProvince(address.getProvince());
-        transport.setCity(address.getCity());
-        transport.setDistrict(address.getDistrict());
-        transport.setAddress(address.getAddress());
-        orderDonTransportMapper.insert(transport);
-    }
+	private final WeChatService weChatService;
+
+	private final RedisService redisService;
+
+	private final GoodsDonSkuMapper goodsDonSkuMapper;
+
+	private final GoodsDonMapper goodsDonMapper;
+
+	private final GroupsRelationMapper groupsRelationMapper;
+
+	private final BeanSearcher beanSearcher;
+
+	private final GroupsMapper groupsMapper;
+
+	private final JobManager jobManager;
+
+	private final OrderDonTransportMapper orderDonTransportMapper;
+
+	private final AddressMapper addressMapper;
+
+	private final OrderDonTransportMapper transportMapper;
+
+	private final OrderDonWaybillMapper waybillMapper;
+
+	private final OrderDonMapper orderDonMapper;
+
+	private final EnvCommonService envCommonService;
+
+	private static final GlobalThreadPoolTaskExecutor TASK_POOL = GlobalThreadPoolTaskExecutor.getInstance();
+
+	private final CustomerServiceMapper customerServiceMapper;
+
+
+	@Transactional(rollbackFor = Throwable.class)
+	@Override
+	public OrderDon submit(OrderPayRequest payRequest) {
+		User user = userMapper.selectById(payRequest.getUserId());
+		GoodsDonSku sku = goodsDonSkuMapper.selectById(payRequest.getSkuId());
+		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
+		if (goodsDon == null || !goodsDon.getStatus()) {
+			throw new BusinessRuntimeException("商品已下架");
+		}
+		String payOpenId = user.getOpenId();
+
+		Long relationId = 0L;
+
+		if (goodsDon.getType() == 1) {
+			GroupsRelation relation = null;
+			//锁定座位
+			if (payRequest.getRelationId() != null && payRequest.getRelationId() > 0) {
+				relation = groupsRelationMapper.selectById(payRequest.getRelationId());
+				if (relation == null) {
+					throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
+				}
+				if (relation.getUserId() != null && relation.getUserId() > 0L) {
+					throw new BusinessRuntimeException(GROUP_INDEX_ALREADY_BE_USER.getCode(), GROUP_INDEX_ALREADY_BE_USER.getMsg());
+				}
+
+			} else {
+				//TODO 如果没指定座位,等待逻辑确认
+				GroupsTrips groups = groupsMapper.selectOne(Wrappers.lambdaQuery(GroupsTrips.class).eq(GroupsTrips::getSkuId, payRequest.getSkuId()).gt(GroupsTrips::getAvailableNum, 0).last("limit 1").orderByAsc(GroupsTrips::getAvailableNum));
+				if (groups == null) {
+					//新增车次
+					groups = new GroupsTrips();
+					groups.setSkuId(sku.getId());
+					groups.setNum(sku.getNum());
+					groups.setAvailableNum(sku.getNum());
+					groups.setStatus(GroupsTrips.Status.waiting);
+					groups.setRemark("等待设置账号");
+					groupsMapper.insert(groups);
+					relation = new GroupsRelation();
+					relation.setGroupsId(groups.getId());
+					relation.setNum(1);
+					relation.setStatus(GroupsRelation.Status.locking);
+					relation.setGroupsId(groups.getId());
+					groupsRelationMapper.insert(relation);
+
+					for (int i = 2; i <= groups.getNum(); i++) {
+						GroupsRelation groupsRelation = new GroupsRelation();
+						groupsRelation.setGroupsId(groups.getId());
+						groupsRelation.setNum(i);
+						groupsRelation.setStatus(GroupsRelation.Status.none);
+						groupsRelationMapper.insert(groupsRelation);
+					}
+				} else {
+					//寻找快满编车队进行占座
+					relation = groupsRelationMapper.selectOne(Wrappers.lambdaQuery(GroupsRelation.class)
+							.eq(GroupsRelation::getGroupsId, groups.getId())
+							.eq(GroupsRelation::getStatus, "none")
+							.eq(GroupsRelation::getUserId, 0)
+							.orderByAsc(GroupsRelation::getNum)
+							.last("limit 1")
+					);
+					if (relation == null) {
+						throw new BusinessRuntimeException(GROUP_INDEX_NOT_FIND.getCode(), GROUP_INDEX_NOT_FIND.getMsg());
+					}
+				}
+			}
+
+			//锁定座位
+			setRelation(relation.getId(), payRequest.getUserId());
+			relation.setUserId(user.getId());
+			relation.setStatus(GroupsRelation.Status.locking);
+			groupsRelationMapper.updateById(relation);
+			relationId = relation.getId();
+		} else {
+
+		}
+
+		/* 生成订单 */
+		String donNo = SEQUENCE.nextId().toString();
+		OrderDon orderDon = new OrderDon();
+		orderDon.setOrderNo(donNo);
+		orderDon.setOpenId(payOpenId);
+		orderDon.setMoney(payRequest.getDonMoney());
+		orderDon.setSkuId(payRequest.getSkuId());
+		orderDon.setRelationId(relationId);
+		orderDon.setNum(payRequest.getNum());
+		orderDon.setGoodsId(goodsDon.getId());
+		orderDon.setStatus(OrderDon.Status.noPayment);
+		orderDon.setUserId(user.getId());
+		orderDon.setType(OrderDon.Type.getType(payRequest.getType()));
+		this.saveOrUpdate(orderDon);
+
+
+		if (goodsDon.getType() == 2) {
+			saveTransport(payRequest.getAddressId(), orderDon.getId());
+		}
+
+		jobManager.addJob(EXPIRY_TIME, () -> {
+			closeOrder(orderDon.getId());
+		});
+
+		return orderDon;
+	}
+
+	@Override
+	public H5JsPayParams pay(Long orderId, String tradeType) throws Exception {
+		log.info("调起微信支付[start] orderId:{}", orderId);
+		OrderDon orderDon = this.getById(orderId);
+
+		OrderAttach attach = new OrderAttach();
+		attach.setO(orderDon.getId());
+
+		String toWechatAttach = Codec.DoBase64.custom()
+				.setData(Jsons.toJson(attach)).encodeAsText();
+
+		H5JsPayParams params = weChatService.getJsPayParams(
+				weChatConfig.getAppid(),
+				orderDon.getOpenId(),
+				orderDon.getMoney().intValue(),
+				orderDon.getOrderNo(),
+				weChatConfig.getDomain() + "applets/order/prepay/notify",
+				toWechatAttach,
+				"银河录像局",
+				tradeType
+		);
+
+		log.info("微信支付成功[end]");
+		return params;
+	}
+
+	@Override
+	public H5JsPayParams wxPcWebPay(Long orderId, String tradeType) throws Exception {
+		log.info("调起微信支付[start] orderId:{}", orderId);
+		OrderDon orderDon = this.getById(orderId);
+
+		OrderAttach attach = new OrderAttach();
+		attach.setO(orderDon.getId());
+
+		String toWechatAttach = Codec.DoBase64.custom()
+				.setData(Jsons.toJson(attach)).encodeAsText();
+
+		H5JsPayParams params = weChatService.getJsPayParams(
+				weChatConfig.getAppid(),
+				orderDon.getOpenId(),
+				orderDon.getMoney().intValue(),
+				orderDon.getOrderNo(),
+				weChatConfig.getDomain() + "applets/order/pc/prepay/notify",
+				toWechatAttach,
+				"银河录像局",
+				tradeType
+		);
+
+		log.info("微信支付成功[end]");
+		return params;
+	}
+
+
+	@Transactional(rollbackFor = Throwable.class)
+	@Override
+	public void prepayNotify(Map<String, String> map) throws Exception {
+		/* 此处处理订单等业务逻辑 */
+		// 获取订单 和 微信订单号 和 支付的金额
+
+		String attach = Codec.DoBase64.custom().setData(map.get("attach")).decodeAsText();
+
+		OrderAttach orderAttach = Jsons.parseObject(attach, OrderAttach.class);
+
+		final Long oid = orderAttach.getO();
+
+		//final Long shareId = orderAttach.getShared();
+
+		OrderDon order = this.getById(oid);
+
+		if (null == order) {
+			throw BusinessRuntimeException.getInstance("订单不存在.");
+		}
+
+		// 校验签名
+		boolean f = weChatService.checkSignWithMd5(map, weChatConfig.getShopKey());
+		if (!f) {
+			log.error("回调数据:{}", map);
+			throw BusinessRuntimeException.getInstance("支付成功回调, 校验签名失败.");
+		}
+
+		GoodsDonSku sku = goodsDonSkuMapper.selectById(order.getSkuId());
+		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
+
+		String transactionId = map.get("transaction_id");
+
+		if (order.getStatus().equals(OrderDon.Status.hasPayment)) {
+			log.info("已回调,重复修改状态 id:{}", order.getId());
+			return;
+		}
+
+		// 更改订单状态
+		order.setTransactionId(transactionId);
+		order.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
+
+		order.setPayTime(DateUtil.parse(map.get("time_end"), "yyyyMMddHHmmss"));
+
+		if (StringUtils.isBlank(order.getOpenId())) {
+			order.setOpenId(map.get("openid"));
+		}
+		updateCarParkAndSendMsg(goodsDon, sku, order);
+		order.setType(OrderDon.Type.WeChat);
+		this.updateById(order);
+	}
+
+	private void newOderSendMsgByType(OrderDon order, GoodsDon goodsDon, GoodsDonSku sku, User user, String toPeople) throws Exception {
+		TemplateEnum templateEnum = null;
+		if (EnvCommonService.active.equals(envCommonService.getEnv())) {
+			templateEnum = TemplateEnum.NEW_ORDER_ENV_TEMPLATE;
+		} else {
+			templateEnum = TemplateEnum.NEW_ORDER_PRD_TEMPLATE;
+		}
+		WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+				.setToUser(toPeople)
+				.setTemplateId(templateEnum.getTemplateId())
+				//TODO
+				.setUrl(" ");
+		WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+		data.setFirst(new WxMpTemplateData("新订单通知!"));
+		data.setKeyword1(new WxMpTemplateData(order.getOrderNo()));
+		data.setKeyword2(new WxMpTemplateData(String.format("%s,%s", goodsDon.getTitle(), sku.getSpecVal())));
+		data.setKeyword3(new WxMpTemplateData(user.getNickname()));
+		data.setKeyword4(new WxMpTemplateData(order.getMoney().divide(BigDecimal.valueOf(100)).toString()));
+		data.setKeyword5(new WxMpTemplateData(DateUtil.format(order.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
+		data.setRemark(new WxMpTemplateData("点击查看详情"));
+		weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+	}
+
+	@Transactional(rollbackFor = Throwable.class)
+	@Override
+	public void closeOrder(Long orderId) {
+		log.info("关闭订单 orderId:{}", orderId);
+		//关闭订单逻辑
+		OrderDon orderDon = getById(orderId);
+		if (OrderDon.Status.noPayment.equals(orderDon.getStatus())) {
+			//查询微信支付是否已支付
+			orderDon.setStatus(OrderDon.Status.close);
+			updateById(orderDon);
+
+			//关闭车位锁定
+			GroupsRelation groupsRelation = groupsRelationMapper.selectById(orderDon.getRelationId());
+			if (groupsRelation != null) {
+				if (!groupsRelation.getUserId().equals(orderDon.getUserId())) {
+					throw new BusinessRuntimeException("订单用户与车位用户不匹配!");
+				} else {
+					if (GroupsRelation.Status.locking.equals(groupsRelation.getStatus())) {
+						groupsRelation.setUserId(0L);
+						groupsRelation.setStatus(GroupsRelation.Status.none);
+						groupsRelationMapper.updateById(groupsRelation);
+						delRelation(groupsRelation.getId());
+
+						//车位空余发送模板消息
+						TASK_POOL.execute(() -> {
+							try {
+								List<CustomerService> customerServices = customerServiceMapper.selectList(null);
+								for (CustomerService customerService : customerServices) {
+									log.info("发送客服{}空车位通知消息", customerService.getNickName());
+									emptySendMsgNotify(orderDon, customerService.getOpenId());
+								}
+							} catch (Exception e) {
+								log.error("发送{}空车位模板消息至客服失败:{}", orderDon.getGoodsId(), e);
+							}
+						});
+					}
+				}
+			}
+		}
+	}
+
+	private void emptySendMsgNotify(OrderDon orderDon, String toPeople) throws Exception {
+		TemplateEnum templateEnum = null;
+		if (EnvCommonService.active.equals(envCommonService.getEnv())) {
+			templateEnum = TemplateEnum.EMPTY_ENV_TEMPLATE;
+		} else {
+			templateEnum = TemplateEnum.EMPTY_PRD_TEMPLATE;
+		}
+		User u = userMapper.selectById(orderDon.getUserId());
+		WxMpTemplateMessage templateMessage = new WxMpTemplateMessage()
+				.setToUser(toPeople)
+				.setTemplateId(templateEnum.getTemplateId())
+				//TODO
+				.setUrl(" ");
+		GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
+		GoodsDonSku goodsDonSku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
+		WxMpTemplateMessage.TemplateData data = templateMessage.getData();
+		data.setFirst(new WxMpTemplateData("空车位通知!"));
+		data.setKeyword1(new WxMpTemplateData(orderDon.getOrderNo()));
+		data.setKeyword2(new WxMpTemplateData(String.format("%s,%s", goodsDon.getTitle(), goodsDonSku.getSpecVal())));
+		data.setKeyword3(new WxMpTemplateData((u == null ? " " : u.getNickname())));
+		data.setKeyword4(new WxMpTemplateData(orderDon.getMoney().divide(BigDecimal.valueOf(100)).toString()));
+		data.setKeyword5(new WxMpTemplateData(DateUtil.format(orderDon.getCreatedTime(), "yyyy-MM-dd HH:mm:ss")));
+		data.setRemark(new WxMpTemplateData("请尽快关联账号信息"));
+		weChatService.sendTemplateMessage(weChatService.getAccessToken(), Jsons.toJson(templateMessage));
+	}
+
+	@Override
+	public OrderDon renewal(OrderPayRequest payRequest) {
+		User user = userMapper.selectById(payRequest.getUserId());
+
+		Long relationId = payRequest.getRelationId();
+		if (relationId == null || relationId <= 0 || payRequest.getSkuId() == null || payRequest.getNum() == null) {
+			throw new BusinessRuntimeException("缺少必填参数");
+		}
+
+		GoodsDonSku sku = goodsDonSkuMapper.selectById(payRequest.getSkuId());
+
+		GroupsRelation relation = groupsRelationMapper.selectById(relationId);
+		if (relation == null) {
+			throw new BusinessRuntimeException("");
+		}
+		if (!relation.getUserId().equals(user.getId())) {
+			throw new BusinessRuntimeException("");
+		}
+
+		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
+		if (goodsDon == null || !goodsDon.getStatus()) {
+			throw new BusinessRuntimeException("商品已下架");
+		}
+
+		if (goodsDon.getType() == 2) {
+			throw new BusinessRuntimeException("实物不支持续费");
+		}
+
+		String payOpenId = user.getOpenId();
+
+		/* 生成订单 */
+		String donNo = SEQUENCE.nextId().toString();
+		OrderDon orderDon = new OrderDon();
+		orderDon.setOrderNo(donNo);
+		orderDon.setOpenId(payOpenId);
+		orderDon.setMoney(sku.getPrice().multiply(BigDecimal.valueOf(payRequest.getNum())));
+		orderDon.setSkuId(payRequest.getSkuId());
+		orderDon.setRelationId(relation.getId());
+
+		orderDon.setStatus(OrderDon.Status.noPayment);
+		orderDon.setUserId(user.getId());
+		this.saveOrUpdate(orderDon);
+
+		jobManager.addJob(EXPIRY_TIME, () -> {
+			closeOrder(orderDon.getId());
+		});
+
+		return orderDon;
+	}
+
+	@Override
+	public OrderDonView getDetail(Long orderId, long userId) {
+
+		OrderDonView detail = beanSearcher.searchFirst(OrderDonView.class, MapUtils.builder()
+				.field(OrderDonView::getUserId, userId)
+				.field(OrderDonView::getId, orderId)
+				.orderBy(OrderDonView::getId).desc()
+				.build());
+
+		detail.setTransport(transportMapper.selectOne(Wrappers.lambdaQuery(OrderDonTransport.class).eq(OrderDonTransport::getOrderId, detail.getId()).last(" limit 1")));
+		detail.setWaybill(waybillMapper.selectOne(Wrappers.lambdaQuery(OrderDonWaybill.class).eq(OrderDonWaybill::getOrderId, detail.getId()).last(" limit 1")));
+		return detail;
+	}
+
+	@Override
+	public List<OrderDon> getAppleOneOrderDons(String appleOne, List<Long> skuIds, List<String> noOrderStatus, Date yesZeroDate, Date thisZeroDate) {
+		return orderDonMapper.getAppleOneOrderDons(appleOne, skuIds, noOrderStatus, yesZeroDate, thisZeroDate);
+	}
+
+	@Override
+	public AliPayParams aliPay(Long orderId, String productCode) throws Exception {
+		return commonAliPay(orderId, productCode, ZfbConfig.YHLX_ZfB);
+	}
+
+	@Override
+	@Transactional(rollbackFor = Throwable.class)
+	public void aliPayNotify(Map<String, String> params) throws Exception {
+		//调用SDK验证签名
+		boolean signVerified = AlipaySignature.rsaCheckV1(params, ZfbConfig.YHLX_ZfB.getAlipayPublicKey(), BaseZfbConfig.charset, BaseZfbConfig.signType);
+		if (!signVerified) {
+			log.error("支付宝回调校验签名错误,自定义入参:{}", params.get("body"));
+			throw BusinessRuntimeException.getInstance("支付宝回调校验签名错误");
+		}
+		String transactionId = params.get("trade_no");
+		String payTimeStr = params.get("gmt_payment");
+		String body = Codec.DoBase64.custom().setData(params.get("body")).decodeAsText();
+		OrderAttach orderAttach = Jsons.parseObject(body, OrderAttach.class);
+		Long oderId = orderAttach.getO();
+		OrderDon orderDon = orderDonMapper.selectById(oderId);
+		if (null == orderDon) {
+			throw BusinessRuntimeException.getInstance("订单不存在.");
+		}
+		if (orderDon.getStatus().equals(OrderDon.Status.hasPayment)) {
+			log.info("支付宝已回调,重复修改状态 id:{}", orderDon.getId());
+			return;
+		}
+		GoodsDonSku sku = goodsDonSkuMapper.selectById(orderDon.getSkuId());
+		GoodsDon goodsDon = goodsDonMapper.selectById(sku.getGoodsId());
+		Date payTime = DateTime.now();
+		if (StringUtils.isNotBlank(payTimeStr)) {
+			payTime = DateUtil.parse(payTimeStr, "yyyyMMddHHmmss");
+		}
+		// 更改订单状态
+		orderDon.setTransactionId(transactionId);
+		orderDon.setStatus(goodsDon.getType() == 1 && goodsDon.getSecondType() == 2 ? OrderDon.Status.complete : OrderDon.Status.hasPayment);
+		orderDon.setPayTime(payTime);
+		//修改车位状态并发送模板消息
+		updateCarParkAndSendMsg(goodsDon, sku, orderDon);
+		orderDon.setType(OrderDon.Type.ALI_PAY);
+		this.updateById(orderDon);
+	}
+
+	public void setRelation(Long relationId, Long userId) {
+		int noPayCount = count(Wrappers.lambdaQuery(OrderDon.class).eq(OrderDon::getUserId, userId).eq(OrderDon::getStatus, OrderDon.Status.noPayment.toString()));
+
+		if (noPayCount > 0) {
+			throw new BusinessRuntimeException("您有未支付订单.");
+		}
+
+		if (redisService.get(RedisKey.GROUPS_RELATION_NUM_KEY + relationId) != null) {
+			throw new BusinessRuntimeException("客官手慢啦,该座位已经有人啦!");
+		} else {
+			redisService.set(RedisKey.GROUPS_RELATION_NUM_KEY + relationId, userId, 60 * 5L);
+			GroupsRelation relation = groupsRelationMapper.selectById(relationId);
+			int count = groupsMapper.decrAvailableNum(relation.getGroupsId());
+			if (count == 0) {
+				log.error("车位异常 groupId:{}", relation.getGroupsId());
+				throw new BusinessRuntimeException("车位异常");
+			}
+		}
+	}
+
+	public void delRelation(Long relationId) {
+		redisService.del(RedisKey.GROUPS_RELATION_NUM_KEY + relationId);
+		GroupsRelation relation = groupsRelationMapper.selectById(relationId);
+		int count = groupsMapper.incrAvailableNum(relation.getGroupsId());
+		if (count == 0) {
+			log.error("车位异常 groupId:{}", relation.getGroupsId());
+			throw new BusinessRuntimeException("车位异常");
+		}
+	}
+
+	public void saveTransport(Long addressId, Long orderId) {
+		if (addressId == null) {
+			throw new BusinessRuntimeException("请选择收货地址.");
+		}
+		Address address = addressMapper.selectById(addressId);
+		if (address == null) {
+			throw new BusinessRuntimeException("请添加收货地址.");
+		}
+		OrderDonTransport transport = new OrderDonTransport();
+		transport.setOrderId(orderId);
+		transport.setReceiver(address.getReceiver());
+		transport.setPhone(address.getPhone());
+		transport.setProvince(address.getProvince());
+		transport.setCity(address.getCity());
+		transport.setDistrict(address.getDistrict());
+		transport.setAddress(address.getAddress());
+		orderDonTransportMapper.insert(transport);
+	}
+
+	public AliPayParams commonAliPay(Long orderId, String productCode, ZfbConfig zfbConfig) throws Exception {
+		AlipayConfig alipayConfig = new AlipayConfig();
+		//网关地址
+		alipayConfig.setServerUrl(BaseZfbConfig.url);
+		alipayConfig.setAppId(zfbConfig.getAppId());
+		alipayConfig.setPrivateKey(zfbConfig.getPrivateKey());
+		alipayConfig.setFormat(BaseZfbConfig.format);
+		alipayConfig.setCharset(BaseZfbConfig.charset);
+		alipayConfig.setSignType(BaseZfbConfig.signType);
+		alipayConfig.setAlipayPublicKey(zfbConfig.getAlipayPublicKey());
+		AlipayClient alipayClient = new DefaultAlipayClient(alipayConfig);
+		// 创建API对应的request
+		AlipayRequest alipayRequest = getAliAayRequest(orderId, productCode);
+		if (alipayRequest == null) {
+			throw BusinessRuntimeException.getInstance("支付宝不支持该支付方式:{0}", productCode);
+		}
+		//回调地址
+		String host = envCommonService.getHost();
+		String notifyUrl = String.format("https://%s/8081/api/%s", host, BaseZfbConfig.notifyUrl);
+		//去除返回地址
+//		String returnUrl = String.format("https://%s/%s", host, BaseZfbConfig.returnUrl);
+		alipayRequest.setNotifyUrl(notifyUrl);
+//		alipayRequest.setReturnUrl(returnUrl);
+		String form = null;
+		try {
+			//调用SDK生成表单
+			//pagePay 统一下单接口
+			form = alipayClient.pageExecute(alipayRequest).getBody();
+		} catch (AlipayApiException e) {
+			log.error("支付宝生成表单错误:{}", e == null ? null : e.getMessage());
+		}
+		log.info("支付宝返回参数:{}", form);
+		return new AliPayParams(form);
+	}
+
+	/**
+	 * 支付宝获取不同的request
+	 * @param productCode 销售产品码,与支付宝签约的产品码名称
+	 * @return
+	 */
+	private AlipayRequest getAliAayRequest(Long orderId, String productCode) throws Exception {
+		DateTime now = DateTime.now();
+		OrderAttach attach = new OrderAttach();
+		attach.setO(orderId);
+		String body = Codec.DoBase64.custom()
+				.setData(Jsons.toJson(attach)).encodeAsText();
+		OrderDon orderDon = orderDonMapper.selectById(orderId);
+		GoodsDon goodsDon = goodsDonMapper.selectById(orderDon.getGoodsId());
+		if (ZfbProductCode.MOBILE_WEB.getProductCode().equals(productCode)) {
+			//手机网站支付
+			AlipayTradeWapPayRequest alipayTradeWapPayRequest = new AlipayTradeWapPayRequest();
+			//手机网站支付支付参数
+			AlipayTradeWapPayModel alipayTradeWapPayModel = new AlipayTradeWapPayModel();
+			alipayTradeWapPayModel.setBody(body);
+			alipayTradeWapPayModel.setOutTradeNo(orderDon.getOrderNo());
+			alipayTradeWapPayModel.setTotalAmount(orderDon.getMoney().divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN).toString());
+			alipayTradeWapPayModel.setSubject(goodsDon.getTitle());
+			alipayTradeWapPayModel.setProductCode(productCode);
+			alipayTradeWapPayRequest.setBizModel(alipayTradeWapPayModel);
+			return alipayTradeWapPayRequest;
+		} else if (ZfbProductCode.PC_WEB.getProductCode().equals(productCode)) {
+			//电脑网站支付
+			AlipayTradePagePayRequest alipayTradePagePayRequest = new AlipayTradePagePayRequest();
+			//电脑网站支付参数
+			AlipayTradePagePayModel alipayTradePagePayModel = new AlipayTradePagePayModel();
+			alipayTradePagePayModel.setBody(body);
+			alipayTradePagePayModel.setOutTradeNo(orderDon.getOrderNo());
+			alipayTradePagePayModel.setTotalAmount(orderDon.getMoney().divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN).toString());
+			alipayTradePagePayModel.setSubject(goodsDon.getTitle());
+			alipayTradePagePayModel.setProductCode(productCode);
+			//5分钟订单失效时间
+			alipayTradePagePayModel.setTimeExpire(DateUtil.offsetMinute(now, 5).toString());
+			alipayTradePagePayModel.setQrPayMode("4");
+			alipayTradePagePayRequest.setBizModel(alipayTradePagePayModel);
+			return alipayTradePagePayRequest;
+		}
+		return null;
+	}
+
+	public void updateCarParkAndSendMsg(GoodsDon goodsDon, GoodsDonSku sku, OrderDon order) {
+		if (goodsDon.getType() == 1) {
+			//修改车位状态
+			GroupsRelation relation = groupsRelationMapper.selectById(order.getRelationId());
+			GroupsTrips groupsTrips = groupsMapper.selectById(relation.getGroupsId());
+			if (GroupsRelation.Status.locking.equals(relation.getStatus()) || GroupsRelation.Status.validity.equals(relation.getStatus())) {
+				relation.setStatus(GroupsRelation.Status.validity);
+				//续费后,下一次续费意愿状态为false
+				relation.setRenewStatus(false);
+				relation.setIsHandle(false);
+				if (GroupsTrips.Status.validity.equals(groupsTrips.getStatus())) {
+					//如果续费增加时间,如果首次则设置当前时间为初始时间
+					Date expiryTime = Optional.ofNullable(relation.getExpiryTime()).orElse(new Date());
+					GoodsDonSku donSku = goodsDonSkuMapper.selectById(order.getSkuId());
+
+					Date newDate = DateUtil.offset(expiryTime, DateField.MONTH, donSku.getMonths() * order.getNum());
+					relation.setExpiryTime(newDate);
+					relation.setStartTime(relation.getStartTime() == null ? new Date() : null);
+				} else if (GroupsTrips.Status.waiting.equals(groupsTrips.getStatus())) {
+					order.setStatus(OrderDon.Status.hasPayment);
+				}
+				//TODO 如未发车逻辑
+				groupsRelationMapper.updateById(relation);
+			}
+		}
+
+		//新订单产生 发送模板消息给用户、客服
+		User user = userMapper.selectById(order.getUserId());
+		THREAD_POOL_TASK_EXECUTOR.execute(() -> {
+			try {
+				//发送至用户消息
+				newOderSendMsgByType(order, goodsDon, sku, user, user.getOpenId());
+			} catch (Exception e) {
+				log.error("向用户发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
+			}
+		});
+		THREAD_POOL_TASK_EXECUTOR.execute(() -> {
+			try {
+				//发送至客服消息
+				List<CustomerService> customerServices = customerServiceMapper.selectList(null);
+				for (CustomerService customerService : customerServices) {
+					log.info("向客服{}发送新订单消息通知..", customerService.getNickName());
+					newOderSendMsgByType(order, goodsDon, sku, user, customerService.getOpenId());
+				}
+			} catch (Exception e) {
+				log.error("向客服发送新订单{}通知消息失败:{}", order.getOrderNo(), e);
+			}
+		});
+	}
 }

+ 1 - 1
netflix-service/src/main/java/com/cyksj/service/wechat/WeChatService.java

@@ -41,7 +41,7 @@ public interface WeChatService {
      * /@param attach     传入订单id 在查询API和支付通知中原样返回 用于处理订单
      * @return h5调用微信js-sdk必要的参数
      */
-    H5JsPayParams getJsPayParams(String appid, String openid, Integer totalFee, String outTradeNo, String notifyUrl, String attach, String body) throws Exception;
+    H5JsPayParams getJsPayParams(String appid, String openid, Integer totalFee, String outTradeNo, String notifyUrl, String attach, String body, String tradeType) throws Exception;
 
 
     /* 微信签名算法 */

+ 12 - 7
netflix-service/src/main/java/com/cyksj/service/wechat/impl/WeChatServiceImpl.java

@@ -1,5 +1,7 @@
 package com.cyksj.service.wechat.impl;
 
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.*;
@@ -181,9 +183,9 @@ public class WeChatServiceImpl implements WeChatService {
 
 
     @Override
-    public H5JsPayParams getJsPayParams(String appid, String openid, Integer totalFee, String outTradeNo, String notifyUrl, String attach, String body) throws Exception {
+    public H5JsPayParams getJsPayParams(String appid, String openid, Integer totalFee, String outTradeNo, String notifyUrl, String attach, String body, String tradeType) throws Exception {
         log.info("------------------- 调用微信h5支付 开始 -------------------");
-
+        DateTime now = DateTime.now();
         BaseWeChatConfig weChatConfigStrategy = WeChatFactory.getWeChatConfigStrategy(appid);
 
         // 拼接统一下单实体类
@@ -194,15 +196,17 @@ public class WeChatServiceImpl implements WeChatService {
                 .setMchId(weChatConfigStrategy.getShopid())
                 .setNonceStr("chan.123")
                 .setNotifyUrl(notifyUrl)
-                .setOpenid(openid)
                 .setOutTradeNo(outTradeNo)
                 .setSpbillCreateIp("127.0.0.1")
                 .setTotalFee(totalFee)
-                .setTradeType("JSAPI");
-
+                .setTradeType(tradeType);
+        if ("NATIVE".equals(tradeType)) {
+            //5分钟订单失效时间
+            order.setTimeExpire(DateUtil.format(DateUtil.offsetMinute(now, 5), "yyyyMMddHHmmss"));
+        } else order.setOpenid(openid);
         String sign = Codec.DoDigest.custom()
                 .setAlgorithm(Codec.DoDigest.Algorithm.MD5)
-                .setStringData(order.println(weChatConfigStrategy.getShopKey()))
+                .setStringData(order.getPrintln(tradeType, weChatConfigStrategy.getShopKey()))
                 .toHexString()
                 .toUpperCase();
         order.setSign(sign);
@@ -256,7 +260,8 @@ public class WeChatServiceImpl implements WeChatService {
                 .toHexString()
                 .toUpperCase();
         params.setPaySign(sign);
-
+        //二维码链接
+        params.setCodeUrl(wxResult.get("code_url"));
         log.info("------------------- 调用微信h5支付 结束 -------------------");
         return params;
     }

+ 139 - 4
netflix-web/src/main/java/com/cyksj/web/controller/payment/OrderController.java

@@ -1,15 +1,21 @@
 package com.cyksj.web.controller.payment;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
+import cn.hutool.extra.qrcode.QrCodeUtil;
+import cn.hutool.extra.qrcode.QrConfig;
+import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.util.IoKit;
 import com.cyksj.common.util.Xmls;
+import com.cyksj.config.zfb.BaseZfbConfig;
+import com.cyksj.config.zfb.ZfbProductCode;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.model.dto.AliPayParams;
 import com.cyksj.model.dto.H5JsPayParams;
 import com.cyksj.model.entity.OrderDon;
 import com.cyksj.model.manage.views.OrderDonView;
 import com.cyksj.model.request.OrderPayRequest;
+import com.cyksj.model.response.AliPayTradeStatus;
 import com.cyksj.service.order.OrderDonService;
 import com.cyksj.web.util.StpUserUtil;
 import com.ejlchina.searcher.BeanSearcher;
@@ -25,9 +31,9 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.OutputStream;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @author chan
@@ -47,6 +53,9 @@ public class OrderController {
     @Resource
     private HttpServletRequest request;
 
+    @Autowired
+    private EnvCommonService envCommonService;
+
     /**
      * 支付
      * @author chan
@@ -74,11 +83,25 @@ public class OrderController {
         final String methodName = "吊起微信支付";
         log.info("{}[start] orderId:{}",methodName,orderId);
 
-        H5JsPayParams payParams = orderDonService.pay(orderId);
+        H5JsPayParams payParams = orderDonService.pay(orderId, "JSAPI");
 
         return GatewayResponse.SUCCESS.newBuilder().toResult(payParams);
     }
 
+    /**
+     * 调用生成订单之后
+     * 微信网页预下单获取交易链接生成二维码
+     */
+    @PostMapping("/get/wx/orderQrCode/{orderId}")
+    public Result<String> createUnifiedOrderQr(@PathVariable Long orderId) throws Exception {
+        //预下单
+        H5JsPayParams payParams = orderDonService.wxPcWebPay(orderId, "NATIVE");
+        //获取二维码链接code_url
+        String codeUrl = payParams.getCodeUrl();
+        QrConfig qrConfig = new QrConfig(300, 300);
+        return GatewayResponse.SUCCESS.newBuilder().toResult(QrCodeUtil.generateAsBase64(codeUrl, qrConfig, "png"));
+    }
+
     /**
      * 微信支付回调
      * @author chan
@@ -112,6 +135,81 @@ public class OrderController {
         }
     }
 
+    /**
+     * pc端微信支付回调
+     * @author chan
+     * @date 2021-10-11 下午5:42
+     */
+    @PostMapping("/pc/prepay/notify")
+    public void pcPrepayNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
+
+        String xml = IoKit.toString(request.getInputStream());
+        log.info("=== 微信pc端分发支付成功的回调: \n {}", xml);
+
+        // 解析xml
+        Map<String, String> map = Xmls.toMap(xml);
+
+        // 支付失败
+        if (!StringUtils.equals("SUCCESS", map.get("return_code")) || !StringUtils.equals("SUCCESS", map.get("result_code"))) {
+            throw BusinessRuntimeException.getInstance("支付失败.");
+        }
+
+        orderDonService.prepayNotify(map);
+        log.info("pc端微信支付回调修改订单状态成功");
+        return;
+//        String host = envCommonService.getHost();
+//        String returnUrl = String.format("https://%s/yinhe/web/ticket", host);
+//        response.sendRedirect(returnUrl);
+    }
+
+	/**
+     * 支付宝表单支付
+	 * 支付宝调起支付宝表单
+	 */
+	@PostMapping("/post/pay/zfb/{orderId}")
+    @Deprecated
+	public void aliPay(@PathVariable Long orderId,HttpServletResponse response) throws Exception {
+        AliPayParams aliPayParams = orderDonService.aliPay(orderId, ZfbProductCode.MOBILE_WEB.getProductCode());
+        response.setContentType("text/html;charset=" + BaseZfbConfig.charset);
+        //直接将完整的表单html输出到页面
+        response.getWriter().write(aliPayParams.getBody());
+        response.getWriter().flush();
+        response.getWriter().close();
+//        return GatewayResponse.SUCCESS.newBuilder().toResult();
+	}
+
+    /**
+     * 支付宝web支付
+     * pc网页二维码
+     */
+    @PostMapping("/get/zfb/orderQrCode/{orderId}")
+    public Result<String> zfbWebQrCode(@PathVariable Long orderId, HttpServletResponse response) throws Exception {
+        AliPayParams aliPayParams = orderDonService.aliPay(orderId, ZfbProductCode.PC_WEB.getProductCode());
+//        response.setContentType("text/html;charset=" + BaseZfbConfig.charset);
+//        //直接将完整的表单html输出到页面
+//        response.getWriter().write(aliPayParams.getBody());
+//        response.getWriter().flush();
+//        response.getWriter().close();
+        return GatewayResponse.SUCCESS.newBuilder().toResult(aliPayParams.getBody());
+    }
+
+	/**
+	 * 支付宝回调
+	 */
+	@PostMapping("/prepay/zfb/notify")
+	public String aliPayNotify(HttpServletRequest request) throws Exception {
+		////将异步通知中收到的所有参数都存放到map中
+		Map<String, String> params = convertRequestParamsToMap(request);
+		String tradeStatus = params.get("trade_status");
+		if (AliPayTradeStatus.TRADE_SUCCESS.getStatus().equals(tradeStatus) || AliPayTradeStatus.TRADE_FINISHED.getStatus().equals(tradeStatus)) {
+			orderDonService.aliPayNotify(params);
+		} else {
+			log.error("支付宝回调 error 状态不符合 成功或完成 status:{} ,orderNo:{}", tradeStatus, params.get("out_trade_no"));
+			return "fail";
+		}
+		return "success";
+	}
+
     /**
      * 获取订单列表
      */
@@ -147,4 +245,41 @@ public class OrderController {
       return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
 
+    @GetMapping("/get/order/status/{orderId}")
+    public Result<OrderDon> getOrderStatusById(@PathVariable Long orderId) {
+        if (orderId < 1) {
+            throw BusinessRuntimeException.getInstance("订单不存在");
+        }
+        OrderDon orderDon = orderDonService.getById(orderId);
+        if (orderDon == null) {
+            throw BusinessRuntimeException.getInstance("订单不存在");
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(orderDon);
+    }
+
+    /**
+     * 获取支付宝回调参数
+     */
+    private static Map<String, String> convertRequestParamsToMap(HttpServletRequest request) {
+        Map<String, String> retMap = new HashMap<>();
+        Set<Map.Entry<String, String[]>> entrySet = request.getParameterMap().entrySet();
+        for (Map.Entry<String, String[]> entry : entrySet) {
+            String name = entry.getKey();
+            String[] values = entry.getValue();
+            int valLen = values.length;
+            if (valLen == 1) {
+                retMap.put(name, values[0]);
+            } else if (valLen > 1) {
+                StringBuilder sb = new StringBuilder();
+                for (String val : values) {
+                    sb.append(",").append(val);
+                }
+                retMap.put(name, sb.substring(1));
+            } else {
+                retMap.put(name, "");
+            }
+        }
+        return retMap;
+    }
+
 }

+ 132 - 8
netflix-web/src/main/java/com/cyksj/web/controller/user/AuthorizationController.java

@@ -1,25 +1,38 @@
 package com.cyksj.web.controller.user;
 
 import cn.hutool.core.codec.Base64;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.lang.Validator;
+import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
-import com.cyksj.model.dto.AuthRedirect;
-import com.cyksj.model.dto.AuthToken;
-import com.cyksj.model.dto.GzhOAuth2UserInfo;
-import com.cyksj.model.dto.JsSdkTicket;
-import com.cyksj.web.util.StpUserUtil;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.snowflake.Sequence;
 import com.cyksj.common.util.Codec;
 import com.cyksj.common.util.Jsons;
+import com.cyksj.common.util.SmsUtil;
+import com.cyksj.config.WeChatConfig;
+import com.cyksj.config.wxlogin.WxOpenPlatYHLXLoginConfig;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayResponse;
+import com.cyksj.mapper.PhoneCodeMapper;
 import com.cyksj.mapper.WxAppMapper;
+import com.cyksj.model.dto.AuthRedirect;
+import com.cyksj.model.dto.AuthToken;
+import com.cyksj.model.dto.GzhOAuth2UserInfo;
+import com.cyksj.model.dto.JsSdkTicket;
+import com.cyksj.model.entity.PhoneCode;
 import com.cyksj.model.entity.User;
+import com.cyksj.model.request.LoginPhoneReq;
+import com.cyksj.model.response.LoginPhoneRep;
 import com.cyksj.redis.RedisService;
 import com.cyksj.service.authorization.AuthorizationService;
-import com.cyksj.config.WeChatConfig;
+import com.cyksj.service.order.OrderDonService;
 import com.cyksj.service.user.UserService;
 import com.cyksj.service.wechat.WeChatService;
+import com.cyksj.web.util.StpUserUtil;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -29,6 +42,10 @@ import org.springframework.web.bind.annotation.*;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.Random;
 
 /**
  * @author chan
@@ -58,6 +75,14 @@ public class AuthorizationController {
 
     private final RedisService redisService;
 
+    private final WxOpenPlatYHLXLoginConfig wxOpenPlatYHLXLoginConfig;
+
+    private EnvCommonService envCommonService;
+
+    private final OrderDonService orderDonService;
+
+    private final PhoneCodeMapper phoneCodeMapper;
+
 
 
     @GetMapping(value = "/weChat")
@@ -99,7 +124,6 @@ public class AuthorizationController {
         //保存用户信息
         User user = userService.saveAuth(userinfo);
 
-
         //写回登陆信息
         StpUserUtil.login(user.getId());
         response.addHeader("satoken",StpUserUtil.getTokenValue());
@@ -116,7 +140,6 @@ public class AuthorizationController {
         cookie.setMaxAge(31536000);
         cookie.setPath("/");
         response.addCookie(userInfo);
-
         String url = redisService.getStr(re.getMappingId().toString());
         redisService.del(re.getMappingId().toString());
         log.info("微信授权转跳.url: {}",url);
@@ -196,4 +219,105 @@ public class AuthorizationController {
     //}
 
 
+    /**
+     * 网页微信授权登录
+     */
+    @GetMapping("/wx/login/authUrl")
+    public Result<String> wxAuthorize() throws Exception {
+        String wxAuthUrl = redisService.getStr(RedisService.key.WX_LOGIN_AUTH_URI.getNameFormat(wxOpenPlatYHLXLoginConfig.getAppId()));
+        Long mappingId = SEQUENCE.nextId();
+        redisService.set(mappingId.toString(), wxOpenPlatYHLXLoginConfig.getLoginUrl(), 60 * 60 * 24L);
+        AuthRedirect redirect = new AuthRedirect().setMappingId(mappingId);
+        String state = Codec.DoBase64.custom().setData(Jsons.toJson(redirect)).encodeAsText();
+        if (StrUtil.isEmpty(wxAuthUrl)) {
+            wxAuthUrl = String.format("https://open.weixin.qq.com/connect/qrconnect?" +
+                            "appid=%s&redirect_uri=%s&response_type=code&scope=snsapi_login&state=%s#wechat_redirect",
+                    wxOpenPlatYHLXLoginConfig.getAppId(),
+                    URLEncoder.encode(wxOpenPlatYHLXLoginConfig.getRedirectUri(), StandardCharsets.UTF_8), state);
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(wxAuthUrl);
+    }
+
+    /**
+     * 网页微信用户登录授权后,重定向至web端
+     */
+    @GetMapping("/wx/login/redirect")
+    public void wxLoginRedirect(String code, String state, HttpServletResponse response) throws Exception {
+        String env = envCommonService.getEnv();
+        String domain = "netflix.tw.cn";
+        if ("dev".equals(env)) {
+            domain = "inside.yicanggongyi.com";
+        }
+        String url = String.format("https://%/8081/api/weChat/baseRedirect?code=%s&state=%s", domain, code, state);
+        response.sendRedirect(url);
+    }
+
+    /**
+     * 获取手机验证码
+     */
+    @GetMapping("/get/phone/code")
+    public Result<String> getPhoneCode(String phone, Integer digit) {
+        if (StrUtil.isBlank(phone) || !Validator.isMobile(phone)) {
+            throw BusinessRuntimeException.getInstance("请输入正确手机号");
+        }
+        if (null == digit) {
+            digit = 6;
+        }
+        PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, phone).last("limit 1"));
+        if (phoneCode == null) {
+            phoneCode = new PhoneCode();
+            phoneCode.setPhone(phone);
+        }
+        String code;
+        // 生成验证码
+        if (digit == 4) {
+            code = new Random().nextInt(8999) + 1000 + "";
+        } else {
+            code = new Random().nextInt(899999) + 100000 + "";
+        }
+        phoneCode.setCode(code);
+        if (phoneCode.getId() == null) {
+            phoneCodeMapper.insert(phoneCode);
+        } else phoneCodeMapper.updateById(phoneCode);
+        // 发送短信
+        SmsUtil.send(phone, String.format("尊敬的用户,您的验证码为%s,此验证码仅用于银河录像。【银河录像局】", code));
+        return GatewayResponse.SUCCESS.newBuilder().toResult(
+                "发送成功");
+    }
+
+    /**
+     * 手机号授权登录
+     */
+    @PostMapping("/login/phone")
+    public Result<LoginPhoneRep> loginByPhone(@RequestBody LoginPhoneReq loginPhoneReq, HttpServletResponse response) throws Exception {
+        if (StrUtil.hasEmpty(loginPhoneReq.getPhone(), loginPhoneReq.getCode())) {
+            throw BusinessRuntimeException.getInstance("请输入对应信息");
+        }
+        DateTime now = DateTime.now();
+        PhoneCode phoneCode = phoneCodeMapper.selectOne(Wrappers.lambdaQuery(PhoneCode.class).eq(PhoneCode::getPhone, loginPhoneReq.getPhone()).last("limit 1"));
+        if (phoneCode == null || StrUtil.isEmpty(phoneCode.getCode())) {
+            throw BusinessRuntimeException.getInstance("请重新获取手机验证码");
+        }
+        //3分钟失效
+        Date updateTime = phoneCode.getUpdateTime();
+        DateTime afterFiveMinutes = DateUtil.offsetMinute(updateTime, 3);
+        if (now.isAfter(afterFiveMinutes)) {
+            throw BusinessRuntimeException.getInstance("手机验证码已失效,请重新获取");
+        }
+        if (!StrUtil.equals(loginPhoneReq.getCode(), phoneCode.getCode())) {
+            throw BusinessRuntimeException.getInstance("手机验证码错误,请重新输入");
+        }
+        //保存用户信息
+        User user = userService.getOne(Wrappers.lambdaQuery(User.class).eq(User::getLoginPhone, loginPhoneReq.getPhone()).last("limit 1"));
+        if (user == null) {
+            user = new User();
+            user.setLoginPhone(loginPhoneReq.getPhone());
+            user.setNickname(String.format("银河用户%s", Codec.DoDigest.custom().setAlgorithm(Codec.DoDigest.Algorithm.MD5).setStringData(String.format("%s%s", user.getId(), user.getLoginPhone())).toHexString().substring(0, 6)));
+            userService.save(user);
+        }
+        //写回登陆信息
+        StpUserUtil.login(user.getId());
+        LoginPhoneRep loginPhoneRep = new LoginPhoneRep(StpUserUtil.getTokenValue(), user.getId(), user.getNickname(), user.getHeadimgurl());
+        return GatewayResponse.SUCCESS.newBuilder().toResult(loginPhoneRep);
+    }
 }

File diff suppressed because it is too large
+ 0 - 0
netflix-web/src/main/resources/application-dev.yml


File diff suppressed because it is too large
+ 0 - 0
netflix-web/src/main/resources/application-prd.yml


Some files were not shown because too many files changed in this diff