Explorar o código

Merge remote-tracking branch 'origin/developerA' into developer

huangzhiguo %!s(int64=2) %!d(string=hai) anos
pai
achega
1cc3bdbc7f
Modificáronse 47 ficheiros con 3559 adicións e 475 borrados
  1. 5 2
      pom.xml
  2. 18 0
      src/main/java/com/caimei365/order/annotation/FieldDes.java
  3. 18 0
      src/main/java/com/caimei365/order/annotation/FieldEncrypt.java
  4. 19 0
      src/main/java/com/caimei365/order/annotation/SignExclude.java
  5. 135 28
      src/main/java/com/caimei365/order/components/HeliPayUtil.java
  6. 24 15
      src/main/java/com/caimei365/order/constant/Constant.java
  7. 131 9
      src/main/java/com/caimei365/order/controller/HeliPayApi.java
  8. 11 3
      src/main/java/com/caimei365/order/controller/HeliPayNonOrderApi.java
  9. 24 0
      src/main/java/com/caimei365/order/mapper/PayOrderMapper.java
  10. 18 0
      src/main/java/com/caimei365/order/model/dto/BankListDto.java
  11. 26 2
      src/main/java/com/caimei365/order/model/dto/HeliDto.java
  12. 4 3
      src/main/java/com/caimei365/order/model/enums/BizType.java
  13. 4 0
      src/main/java/com/caimei365/order/model/po/DiscernReceiptPo.java
  14. 66 0
      src/main/java/com/caimei365/order/model/vo/BankCardUnbindResponseVo.java
  15. 75 0
      src/main/java/com/caimei365/order/model/vo/BankCardUnbindVo.java
  16. 125 0
      src/main/java/com/caimei365/order/model/vo/BindCardPreOrderResponseVo.java
  17. 76 0
      src/main/java/com/caimei365/order/model/vo/BindCardQueryResponseVo.java
  18. 65 0
      src/main/java/com/caimei365/order/model/vo/BindCardQueryVo.java
  19. 128 0
      src/main/java/com/caimei365/order/model/vo/ConfirmBindCardResponseVo.java
  20. 74 0
      src/main/java/com/caimei365/order/model/vo/ConfirmBindCardVo.java
  21. 8 0
      src/main/java/com/caimei365/order/model/vo/DiscernReceiptVo.java
  22. 61 0
      src/main/java/com/caimei365/order/model/vo/FirstPaySendValidateCodeVo.java
  23. 78 0
      src/main/java/com/caimei365/order/model/vo/FirstQuickPayVo.java
  24. 141 0
      src/main/java/com/caimei365/order/model/vo/OnceBindCardVo.java
  25. 75 0
      src/main/java/com/caimei365/order/model/vo/OnceBindResponseVo.java
  26. 28 0
      src/main/java/com/caimei365/order/model/vo/QuickBankVo.java
  27. 31 0
      src/main/java/com/caimei365/order/model/vo/QuickInfoVo.java
  28. 180 0
      src/main/java/com/caimei365/order/model/vo/QuickPayBindCardPreOrderVo.java
  29. 155 0
      src/main/java/com/caimei365/order/model/vo/QuickPayConfirmPayResponseVo.java
  30. 114 0
      src/main/java/com/caimei365/order/model/vo/QuickPayCreateOrderResponseVo.java
  31. 81 0
      src/main/java/com/caimei365/order/model/vo/QuickPaySendValidateCodeResponseVo.java
  32. 34 0
      src/main/java/com/caimei365/order/model/vo/QuickPayUserVo.java
  33. 27 16
      src/main/java/com/caimei365/order/service/HeliPayNonOrderService.java
  34. 18 0
      src/main/java/com/caimei365/order/service/HeliPayService.java
  35. 124 229
      src/main/java/com/caimei365/order/service/impl/HeliPayNonOrderServiceImpl.java
  36. 491 23
      src/main/java/com/caimei365/order/service/impl/HeliPayServiceImpl.java
  37. 20 8
      src/main/java/com/caimei365/order/service/impl/OrderClubServiceImpl.java
  38. 11 2
      src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java
  39. 7 3
      src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java
  40. 73 0
      src/main/java/com/caimei365/order/utils/helipay/HeliPayCertConfig.java
  41. 81 0
      src/main/java/com/caimei365/order/utils/helipay/HeliPayCertUtils.java
  42. 128 0
      src/main/java/com/caimei365/order/utils/helipay/MessageHandle.java
  43. 94 0
      src/main/java/com/caimei365/order/utils/helipay/SM2Utils.java
  44. 100 0
      src/main/java/com/caimei365/order/utils/helipay/SM4Utils.java
  45. 11 7
      src/main/resources/mapper/BaseMapper.xml
  46. 2 0
      src/main/resources/mapper/OrderCommonMapper.xml
  47. 340 125
      src/main/resources/mapper/PayOrderMapper.xml

+ 5 - 2
pom.xml

@@ -161,8 +161,11 @@
             <version>29.0-jre</version>
         </dependency>
 
-
-
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-crypto</artifactId>
+            <version>5.7.16</version>
+        </dependency>
 
 
 

+ 18 - 0
src/main/java/com/caimei365/order/annotation/FieldDes.java

@@ -0,0 +1,18 @@
+package com.caimei365.order.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * Created by heli50 on 2018-06-25.
+ */
+@Target(FIELD)
+@Retention(RUNTIME)
+@Documented
+public @interface FieldDes {
+    String value() default "";
+}

+ 18 - 0
src/main/java/com/caimei365/order/annotation/FieldEncrypt.java

@@ -0,0 +1,18 @@
+package com.caimei365.order.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * Created by heli50 on 2018-06-25.
+ */
+@Target(FIELD)
+@Retention(RUNTIME)
+@Documented
+public @interface FieldEncrypt {
+	String value() default "";
+}

+ 19 - 0
src/main/java/com/caimei365/order/annotation/SignExclude.java

@@ -0,0 +1,19 @@
+package com.caimei365.order.annotation;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * Created by heli50 on 2018-06-25.
+ */
+
+@Target(FIELD)
+@Retention(RUNTIME)
+@Documented
+public @interface SignExclude {
+	String value() default "";
+}

+ 135 - 28
src/main/java/com/caimei365/order/components/HeliPayUtil.java

@@ -1,6 +1,5 @@
 package com.caimei365.order.components;
 
-import com.alibaba.fastjson.JSON;
 import com.caimei365.order.constant.Constant;
 import com.caimei365.order.mapper.OrderCommonMapper;
 import com.caimei365.order.mapper.PayOrderMapper;
@@ -8,8 +7,8 @@ import com.caimei365.order.model.bo.VipRecordBo;
 import com.caimei365.order.model.dto.HeliDto;
 import com.caimei365.order.model.enums.BizType;
 import com.caimei365.order.model.vo.*;
-import com.caimei365.order.utils.MathUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
@@ -18,8 +17,8 @@ import javax.annotation.Resource;
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Date;
+import java.util.UUID;
 
 @Slf4j
 @Service
@@ -51,8 +50,12 @@ public class HeliPayUtil {
     private String couponUrl;
     @Value("${pay.coupon-union-url}")
     private String couponUnionPay;
+    @Value("${pay.quick-url}")
+    private String quickPayUrl;
+    @Value("${pay.quick-un-url}")
+    private String quickUnOrderUrl;
 
-    private final String publicCode="wx91c4152b60ca91a3";
+    private final String publicCode = "wx91c4152b60ca91a3";
 
     //小程序/公众号线上公用方法 p8 openid在自己方法传
     public AppPayPublicCreateOrderVo setOnlineValue(AppPayPublicCreateOrderVo pay, HeliDto heliDto, String payFlag, HttpHeaders headers) {
@@ -115,14 +118,14 @@ public class HeliPayUtil {
             pay.setP18_desc(attach);
             //收款账号
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
-        }else if("coupon".equals(payFlag)){
+        } else if ("coupon".equals(payFlag)) {
             Double couponPrice = payOrderMapper.getCouponPrice(heliDto.getCouponRecordId());
             orderId = heliDto.getUserId() + "C" + heliDto.getCouponId() + "R" + heliDto.getCouponRecordId() + "T" + time + environment;
             pay.setP9_orderAmount(couponPrice.toString());
             pay.setP12_notifyUrl(couponUrl);
             String product = "采美订单" + orderId;
             pay.setP15_goodsName(product);
-            String attach = heliDto.getCouponId() + "," + heliDto.getUserId() + "," + heliDto.getCouponRecordId() + "," + BizType.getNumByType(heliDto.getPayType())+","+heliDto.getSource();
+            String attach = heliDto.getCouponId() + "," + heliDto.getUserId() + "," + heliDto.getCouponRecordId() + "," + BizType.getNumByType(heliDto.getPayType()) + "," + heliDto.getSource();
             pay.setP18_desc(attach);
             //收款账号
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
@@ -134,7 +137,7 @@ public class HeliPayUtil {
             pay.setP12_notifyUrl(notifyUrl);
             String product = "采美订单" + order.getOrderNo();
             pay.setP15_goodsName(product);
-            String attach = order.getOrderId() + "," + BizType.getNumByType(heliDto.getPayType())+","+heliDto.getShopOrderId();
+            String attach = order.getOrderId() + "," + BizType.getNumByType(heliDto.getPayType()) + "," + heliDto.getShopOrderId();
             pay.setP18_desc(attach);
         }
         pay.setP1_bizType(BizType.getP1ByType(heliDto.getPayType()));
@@ -175,7 +178,7 @@ public class HeliPayUtil {
             pay.setP14_desc(heliDto.getProductId().toString() + "," + BizType.getNumByType(heliDto.getPayType()));
             //网络收款,分账进信息
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
-        }else if ("vip".equals(payFlag)) {
+        } else if ("vip".equals(payFlag)) {
             VipRecordBo record = payOrderMapper.getVipPackageRecord(heliDto.getVipRecordId());
             Double price = payOrderMapper.getVipPackagePriceById(record.getPackageId());
             pay.setP5_orderAmount(price.toString());
@@ -187,7 +190,7 @@ public class HeliPayUtil {
             pay.setP14_desc(attach);
             //收款账号
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
-        }else if ("authVip".equals(payFlag)) {
+        } else if ("authVip".equals(payFlag)) {
             VipRecordBo record = payOrderMapper.getAuthVipRecord(heliDto.getVipRecordId());
             Double price = payOrderMapper.getAuthVipPackagePrice(record.getPackageId());
             pay.setP5_orderAmount(price.toString());
@@ -199,19 +202,18 @@ public class HeliPayUtil {
             pay.setP14_desc(attach);
             //收款账号
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
-        }else if("coupon".equals(payFlag)){
+        } else if ("coupon".equals(payFlag)) {
             Double couponPrice = payOrderMapper.getCouponPrice(heliDto.getCouponRecordId());
             orderId = heliDto.getUserId() + "C" + heliDto.getCouponId() + "R" + heliDto.getCouponRecordId() + "T" + time + environment;
             pay.setP5_orderAmount(couponPrice.toString());
             pay.setP9_notifyUrl(couponUrl);
             String product = "采美订单" + orderId;
             pay.setP12_goodsName(product);
-            String attach = heliDto.getCouponId() + "," + heliDto.getUserId() + "," + heliDto.getCouponRecordId() + "," + BizType.getNumByType(heliDto.getPayType())+","+heliDto.getSource();
+            String attach = heliDto.getCouponId() + "," + heliDto.getUserId() + "," + heliDto.getCouponRecordId() + "," + BizType.getNumByType(heliDto.getPayType()) + "," + heliDto.getSource();
             pay.setP14_desc(attach);
             //收款账号
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
-        }
-        else if ("order".equals(payFlag)) {
+        } else if ("order".equals(payFlag)) {
             //以子订单为单位付款,商户号为商品的分帐号
             OrderVo order = orderCommonMapper.getOrderByShopOrderId(heliDto.getShopOrderId());
             orderId = order.getOrderNo() + "T" + time + environment;
@@ -219,7 +221,8 @@ public class HeliPayUtil {
             pay.setP9_notifyUrl(notifyUrl);
             String product = "采美订单" + order.getOrderNo();
             pay.setP12_goodsName(product);
-            String attach = order.getOrderId() + "," + BizType.getNumByType(heliDto.getPayType())+","+heliDto.getShopOrderId();;
+            String attach = order.getOrderId() + "," + BizType.getNumByType(heliDto.getPayType()) + "," + heliDto.getShopOrderId();
+            ;
             pay.setP14_desc(attach);
         }
         pay.setP1_bizType(BizType.getP1ByType(heliDto.getPayType()));
@@ -228,7 +231,7 @@ public class HeliPayUtil {
         pay.setP6_currency("CNY");
         pay.setP7_authcode("1");
         //pc二维码apptype不是微信就是支付宝
-        String appType="WXEWM".equals(heliDto.getPayType())?"WXPAY":"ALIPAY";
+        String appType = "WXEWM".equals(heliDto.getPayType()) ? "WXPAY" : "ALIPAY";
         pay.setP8_appType(appType);
         pay.setP10_successToUrl(heliDto.getReturnUrl());
         pay.setP11_orderIp(headers.getFirst("X-CLIENT-IP"));
@@ -252,12 +255,12 @@ public class HeliPayUtil {
                 pay.setP12_serverCallback(secondUnionPay);
                 orderId = heliDto.getProductId() + "T" + time + environment;
                 String product = "采美订单" + orderId;
-                URLEncoder.encode(product,"UTF-8");
+                URLEncoder.encode(product, "UTF-8");
                 pay.setP8_goodsName(product);
-                String desc=heliDto.getProductId().toString() + "," + BizType.getNumByType(heliDto.getUserType());
-                URLEncoder.encode(desc,"UTF-8");
+                String desc = heliDto.getProductId().toString() + "," + BizType.getNumByType(heliDto.getUserType());
+                URLEncoder.encode(desc, "UTF-8");
                 pay.setP15_desc(desc);
-            }else if ("vip".equals(payFlag)) {
+            } else if ("vip".equals(payFlag)) {
                 pay.setP3_customerNumber(Constant.CUSTOMERNUM);
                 VipRecordBo record = payOrderMapper.getVipPackageRecord(heliDto.getVipRecordId());
                 Double price = payOrderMapper.getVipPackagePriceById(record.getPackageId());
@@ -265,22 +268,22 @@ public class HeliPayUtil {
                 pay.setP12_serverCallback(vipUnionPay);
                 orderId = record.getUserId() + "R" + heliDto.getVipRecordId() + "V" + record.getPackageId() + "T" + time + environment;
                 String product = "采美订单" + orderId;
-                URLEncoder.encode(product,"UTF-8");
+                URLEncoder.encode(product, "UTF-8");
                 pay.setP8_goodsName(product);
                 String attach = record.getPackageId() + "," + record.getUserId() + "," + heliDto.getVipRecordId() + "," + BizType.getNumByType(heliDto.getUserType());
-                URLEncoder.encode(attach,"UTF-8");
+                URLEncoder.encode(attach, "UTF-8");
                 pay.setP15_desc(attach);
-            }else if("coupon".equals(payFlag)){
+            } else if ("coupon".equals(payFlag)) {
                 pay.setP3_customerNumber(Constant.CUSTOMERNUM);
                 Double couponPrice = payOrderMapper.getCouponPrice(heliDto.getCouponRecordId());
                 pay.setP4_orderAmount(couponPrice.toString());
                 pay.setP12_serverCallback(couponUnionPay);
                 orderId = heliDto.getUserId() + "C" + heliDto.getCouponId() + "R" + heliDto.getCouponRecordId() + "T" + time + environment;
                 String product = "采美订单" + orderId;
-                URLEncoder.encode(product,"UTF-8");
+                URLEncoder.encode(product, "UTF-8");
                 pay.setP8_goodsName(product);
-                String attach = heliDto.getCouponId() + "," + heliDto.getUserId() + "," + heliDto.getCouponRecordId() + "," + BizType.getNumByType(heliDto.getPayType())+","+heliDto.getSource();
-                URLEncoder.encode(attach,"UTF-8");
+                String attach = heliDto.getCouponId() + "," + heliDto.getUserId() + "," + heliDto.getCouponRecordId() + "," + BizType.getNumByType(heliDto.getPayType()) + "," + heliDto.getSource();
+                URLEncoder.encode(attach, "UTF-8");
                 pay.setP15_desc(attach);
             } else if ("authVip".equals(payFlag)) {
                 pay.setP3_customerNumber(Constant.CUSTOMERNUM);
@@ -290,10 +293,10 @@ public class HeliPayUtil {
                 pay.setP12_serverCallback(authVipUnionPay);
                 orderId = record.getUserId() + "A" + heliDto.getVipRecordId() + "V" + record.getPackageId() + "T" + time + environment;
                 String product = "采美订单" + orderId;
-                URLEncoder.encode(product,"UTF-8");
+                URLEncoder.encode(product, "UTF-8");
                 pay.setP8_goodsName(product);
                 String attach = record.getPackageId() + "," + record.getUserId() + "," + heliDto.getVipRecordId() + "," + BizType.getNumByType(heliDto.getUserType());
-                URLEncoder.encode(attach,"UTF-8");
+                URLEncoder.encode(attach, "UTF-8");
                 pay.setP15_desc(attach);
             } else if ("order".equals(payFlag)) {
                 OrderVo order = orderCommonMapper.getOrderByShopOrderId(heliDto.getShopOrderId());
@@ -318,8 +321,112 @@ public class HeliPayUtil {
             pay.setP13_orderIp(headers.getFirst("X-CLIENT-IP"));
             pay.setP14_onlineCardType("DEBIT");
         } catch (UnsupportedEncodingException e) {
-            log.error("网银支付设值错误=================>"+e);
+            log.error("网银支付设值错误=================>" + e);
         }
         return pay;
     }
+
+    public void setQuickValue(HeliDto heliDto, FirstQuickPayVo firstQuickPayVo, HttpHeaders headers) {
+        /**
+         *  查询银行卡在数据库是否存在,不存在则insert,cm_quickpay_info的id必传,quickPaybindId通过回调修改,用户解绑后再通过
+         *  当前接口下单,quickPaybindId会修改
+         *
+         *
+         *  校验当前卡是否存在
+         */
+        QuickInfoVo info = payOrderMapper.findInfoByBankNumber(heliDto.getQuickPayBankNumber());
+        Integer infoId = 0;
+        if (null != info && null != info.getId()) {
+            infoId = info.getId();
+        } else {
+            QuickInfoVo quickInfoVo = payOrderMapper.findInfoByBankNumber(heliDto.getQuickPayBankNumber());
+            QuickInfoVo quick = new QuickInfoVo();
+            quick.setBankNumber(heliDto.getQuickPayBankNumber());
+            quick.setBindMobile(heliDto.getQuickPayMobile());
+            quick.setUserId(heliDto.getUserId());
+            quick.setQuickPayUserId("U" + heliDto.getUserId());
+            quick.setIdCard(heliDto.getIdCard());
+            quick.setBankUserName(heliDto.getQuickPayUserName());
+            if (null != heliDto.getQuickPayBankExpireTime()) {
+                quick.setBankCvvCode(heliDto.getCvvCode());
+                quick.setBankExpireTime(heliDto.getQuickPayBankExpireTime());
+            }
+            if (null == quickInfoVo) {
+                payOrderMapper.insertQuickPayInfo(quick);
+            } else {
+                quick.setId(quickInfoVo.getId());
+                payOrderMapper.updateQuickPayInfo(quick);
+            }
+            infoId = quick.getId();
+        }
+        firstQuickPayVo.setP1_bizType("QuickPayFirstPayPreOrder");
+        // 首次下单接口统一视为未绑卡处理
+        firstQuickPayVo.setP3_userId("U" + heliDto.getUserId());
+        //姓名
+        firstQuickPayVo.setP6_payerName(heliDto.getQuickPayUserName());
+        //身份证号
+        firstQuickPayVo.setP8_idCardNo(heliDto.getIdCard());
+        //银行卡号
+        firstQuickPayVo.setP9_cardNo(heliDto.getQuickPayBankNumber());
+        //银行绑定手机号
+        firstQuickPayVo.setP13_phone(heliDto.getQuickPayMobile());
+        //信用卡有效期年,月,cvv2 选择信用卡时必填,否则不填  传参为2023-04,字符串截取年份
+        if (StringUtils.isNotBlank(heliDto.getQuickPayBankExpireTime())) {
+            String[] split = heliDto.getQuickPayBankExpireTime().split("-");
+            firstQuickPayVo.setP10_year(split[0].substring(2));
+            firstQuickPayVo.setP11_month(split[1]);
+            firstQuickPayVo.setP12_cvv2(heliDto.getCvvCode());
+        }
+        /**
+         *  快捷支付中回调参数不能带备注,无法在备注区传参,在快捷支付中订单id承担额外参数作用
+         *  (见其他支付方式desc参数)
+         *
+         *  QuickPayFlag快捷支付类型标记1订单2超级会员3认证通会员4优惠券
+         */
+        String orderId = "";
+        String time = new SimpleDateFormat("MMddHHmmssSSS").format(new Date());
+        //非订单统一回调地址  order/pay/unorder/quick/callback
+        firstQuickPayVo.setP23_serverCallbackUrl(quickUnOrderUrl);
+        //非订单都是走信息
+        firstQuickPayVo.setP2_customerNumber(Constant.CUSTOMERNUM);
+        if (1 == heliDto.getQuickPayFlag()) {
+            //普通订单
+            OrderVo order = orderCommonMapper.getOrderByShopOrderId(heliDto.getShopOrderId());
+            orderId = order.getOrderNo() + "_" + order.getOrderId() + "_" + heliDto.getShopOrderId() + "_" + infoId + "_" + time;
+            //普通订单取传参
+            firstQuickPayVo.setP15_orderAmount(heliDto.getPayAmount());
+            //回调地址
+            firstQuickPayVo.setP23_serverCallbackUrl(quickPayUrl);
+            firstQuickPayVo.setP2_customerNumber(payOrderMapper.getSplitCodeByShopOrderId(heliDto.getShopOrderId()));
+        } else if (2 == heliDto.getQuickPayFlag()) {
+            //超级会员
+            VipRecordBo record = payOrderMapper.getVipPackageRecord(heliDto.getVipRecordId());
+            Double price = payOrderMapper.getVipPackagePriceById(record.getPackageId());
+            firstQuickPayVo.setP15_orderAmount(price.toString());
+            orderId = "VP_" + record.getPackageId() + "_" + record.getUserId() + "_" + heliDto.getVipRecordId() + "_" + infoId + "_" + time;
+        } else if (3 == heliDto.getQuickPayFlag()) {
+            //认证通会员
+            VipRecordBo record = payOrderMapper.getAuthVipRecord(heliDto.getVipRecordId());
+            Double price = payOrderMapper.getAuthVipPackagePrice(record.getPackageId());
+            firstQuickPayVo.setP15_orderAmount(price.toString());
+            orderId = "AVP_" + record.getPackageId() + "_" + record.getUserId() + "_" + heliDto.getVipRecordId() + "_" + infoId + "_" + time;
+        } else if (4 == heliDto.getQuickPayFlag()) {
+            Double couponPrice = payOrderMapper.getCouponPrice(heliDto.getCouponRecordId());
+            orderId = "CP_" + heliDto.getCouponId() + "_" + heliDto.getUserId() + "_" + heliDto.getCouponRecordId() + "_" + heliDto.getSource() + "_" + infoId + "_" + time;
+            firstQuickPayVo.setP15_orderAmount(couponPrice.toString());
+        }
+        firstQuickPayVo.setP4_orderId(orderId);
+        firstQuickPayVo.setP5_timestamp(time);
+        firstQuickPayVo.setP7_idCardType("IDCARD");
+        firstQuickPayVo.setP14_currency("CNY");
+        //名称
+        firstQuickPayVo.setP16_goodsName("采美订单");
+        firstQuickPayVo.setP18_terminalType("IMEI");
+        //终端唯一标识,如手机序列号
+        firstQuickPayVo.setP19_terminalId(UUID.randomUUID().toString());
+        //同步下发短信
+        firstQuickPayVo.setSendValidateCode("true");
+        firstQuickPayVo.setP20_orderIp(headers.getFirst("X-CLIENT-IP"));
+        firstQuickPayVo.setSignatureType("SM3WITHSM2");
+    }
 }

+ 24 - 15
src/main/java/com/caimei365/order/constant/Constant.java

@@ -3,47 +3,56 @@ package com.caimei365.order.constant;
 
 /**
  * 常量类
+ *
  * @author Administrator
  */
 public class Constant {
 
-
-
+    public static final String SIGNATURE_TYPE = "SM3WITHSM2";
     //专票 信息 测试佣金暂入信息  308785626@qq.com vip/二手暂入信息
     public static final String CUSTOMERNUM = "E1807059160";
     //信息的邮箱
-    public static final String XX_MAIL="308785626@qq.com";
+    public static final String XX_MAIL = "308785626@qq.com";
 
     //收款商编 网络   xun.zhang@caimei365.com
     public static final String CUSTOMERNUM2 = "E1807062884";
     //网络的邮箱
-    public static final String WL_MAIL="xun.zhang@caimei365.com";
+    public static final String WL_MAIL = "xun.zhang@caimei365.com";
 
     //普票 奥泰 测试私账暂进奥泰   caimei365@yeah.net
     public static final String CUSTOMERNUM3 = "E1807085606";
 
-    public static final String AT_MAIL="caimei365@yeah.net";
+    public static final String AT_MAIL = "caimei365@yeah.net";
 
     public static final String SPLIT = "&";
 
+    /**
+     * 快捷支付地址
+     */
+    public static final String REQUEST_URL_QUICKPAY = "http://quickpay.trx.helipay.com/trx/quickPayApi/interface.action";
+
     public static final String DOMAIN_NAME = "http://pay.trx.helipay.com/";
-    //网银地址http://pay.trx.helipay.com/trx/online/interface.action
-    public static final String YL="http://pay.trx.helipay.com/trx/online/interface.action";
-    //分账地址
-    public static final String FZ="http://pay.trx.helipay.com/trx/accountPay/interface.action";
+    /**
+     * 网银地址http://pay.trx.helipay.com/trx/online/interface.action
+     */
+    public static final String YL = "http://pay.trx.helipay.com/trx/online/interface.action";
+    /**
+     * 分账地址
+     */
+    public static final String FZ = "http://pay.trx.helipay.com/trx/accountPay/interface.action";
 
     //微信/支付宝扫码/小程序公众号支付
-    public static final String SAOMA="1iHnZaalUNAVcfcbKdh6n86Z0yUHtM6f";
+    public static final String SAOMA = "1iHnZaalUNAVcfcbKdh6n86Z0yUHtM6f";
     //网银
-    public static final String WANGYIN="CZiCbGrgFYQMldVkQnzbFQeQkn6mp25w";
+    public static final String WANGYIN = "CZiCbGrgFYQMldVkQnzbFQeQkn6mp25w";
     //虚拟账户支付
-    public static final String XUNI="8VmdRSXMIOfUo7aEq1iYs2XEWgGZpBQc";
+    public static final String XUNI = "8VmdRSXMIOfUo7aEq1iYs2XEWgGZpBQc";
     //分账
-    public static final String FENZHANG="2hATS0A4IoxdudGxNkGRNOt6aFSdOd8Q";
+    public static final String FENZHANG = "2hATS0A4IoxdudGxNkGRNOt6aFSdOd8Q";
     //公共产品
-    public static final String GONG="wrED4jYgKLQVsEwtgZ2eQmXrRgo7VHy4";
+    public static final String GONG = "wrED4jYgKLQVsEwtgZ2eQmXrRgo7VHy4";
     //结算
-    public static final String JIESUAN="fiweQU8igfuhBTcXLLDAQ3DScwIPEy2s";
+    public static final String JIESUAN = "fiweQU8igfuhBTcXLLDAQ3DScwIPEy2s";
     /**
      * 扫码接口地址
      */

+ 131 - 9
src/main/java/com/caimei365/order/controller/HeliPayApi.java

@@ -2,13 +2,11 @@ package com.caimei365.order.controller;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.model.dto.BankListDto;
 import com.caimei365.order.model.dto.HeliDto;
 import com.caimei365.order.model.dto.PayDto;
 import com.caimei365.order.model.dto.PayLinkDto;
-import com.caimei365.order.model.vo.AccountResVo;
-import com.caimei365.order.model.vo.NotifyResponseVo;
-import com.caimei365.order.model.vo.ShopOrderVo;
-import com.caimei365.order.model.vo.UnionResVo;
+import com.caimei365.order.model.vo.*;
 import com.caimei365.order.service.HeliPayService;
 import com.caimei365.order.service.PayOrderService;
 import io.swagger.annotations.Api;
@@ -44,6 +42,96 @@ public class HeliPayApi {
     private final HeliPayService heliPayService;
     private final PayOrderService payOrderService;
 
+    @ApiOperation("快捷支付解绑银行卡")
+    @ApiImplicitParam(required = true, name = "cardId", value = "银行卡绑定表Id")
+    @GetMapping("/quick/unbound/card")
+    public ResponseJson unboundCard(Integer cardId) {
+        if (null == cardId) {
+            return ResponseJson.error("绑定卡Id不能为空!");
+        }
+        return heliPayService.unBoundCard(cardId);
+    }
+
+    @ApiOperation("快捷支付银行信息")
+    @ApiImplicitParam(required = false, name = "cardType", value = "银行卡类型")
+    @GetMapping("/quick/bank/infos")
+    public ResponseJson<List<BankListDto>> quickBankCode(Integer cardType) {
+        return heliPayService.bankInfos(cardType);
+    }
+
+    @ApiOperation("免密绑卡银行信息")
+    @GetMapping("/quick/uncode/infos")
+    public ResponseJson<List<QuickBankVo>> unCodeInfos() {
+        return heliPayService.unCodeInfos();
+    }
+
+    @ApiOperation("免密一键绑卡")
+    @ApiImplicitParam(required = false, name = "cardType", value = "银行卡类型")
+    @PostMapping("/quick/bind/nocode")
+    public ResponseJson<String> quickBankCode(HeliDto heliDto) {
+        if (StringUtils.isBlank(heliDto.getBankCode())) {
+            return ResponseJson.error("银行编码不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getQuickPayUserName())) {
+            return ResponseJson.error("用户姓名不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getIdCard())) {
+            return ResponseJson.error("身份证号不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getQuickPayMobile())) {
+            return ResponseJson.error("手机号码不能为空!");
+        }
+        if (null == heliDto.getCardType()) {
+            return ResponseJson.error("银行卡类型不能为空!");
+        }
+        return heliPayService.bindCardNoCode(heliDto);
+    }
+
+
+    @ApiOperation("绑卡验证码校验")
+    @ApiImplicitParams({
+            @ApiImplicitParam(required = true, name = "flag", value = "验证码类型"),
+            @ApiImplicitParam(required = true, name = "bindCode", value = "验证码"),
+            @ApiImplicitParam(required = true, name = "orderId", value = "绑定单号"),
+            @ApiImplicitParam(required = false, name = "infoId", value = "记录Id"),
+            @ApiImplicitParam(required = false, name = "customer", value = "商户号")
+    })
+    @GetMapping("/quick/bind/code")
+    public ResponseJson bindCardCheck(Integer flag, String bindCode, String orderId, String infoId, String customer) {
+        if (null == flag) {
+            return ResponseJson.error("验证码类型不能为空!");
+        }
+        if (StringUtils.isBlank(bindCode)) {
+            return ResponseJson.error("验证码不能为空!");
+        }
+        if (StringUtils.isBlank(orderId)) {
+            return ResponseJson.error("订单Id不能为空!");
+        }
+        return heliPayService.bindByCode(flag, bindCode, orderId, infoId, customer);
+    }
+
+
+    @ApiOperation("快捷支付预绑卡")
+    @PostMapping("/quick/bind/card")
+    public ResponseJson<Map<String, String>> bindBankCard(HeliDto heliDto) {
+        if (null == heliDto.getUserId()) {
+            return ResponseJson.error("用户Id不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getQuickPayBankNumber())) {
+            return ResponseJson.error("绑定卡号不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getQuickPayUserName())) {
+            return ResponseJson.error("用户名不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getIdCard())) {
+            return ResponseJson.error("身份证号不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getQuickPayMobile())) {
+            return ResponseJson.error("银行预留手机号码不能为空!");
+        }
+        return heliPayService.bindBankCard(heliDto);
+    }
+
     @ApiOperation("获取子订单信息")
     @ApiImplicitParam(required = true, name = "orderId", value = "订单Id")
     @GetMapping("/shoporders")
@@ -160,7 +248,7 @@ public class HeliPayApi {
     /**
      * 判断此次支付是否完成
      *
-     * @param shopOrderId           子订单id
+     * @param shopOrderId       子订单id
      * @param paySuccessCounter 付款次数
      */
     @ApiOperation("判断此次支付是否完成(旧:/PayOrder/payWhetherSuccess)")
@@ -191,14 +279,14 @@ public class HeliPayApi {
             @ApiImplicitParam(required = false, name = "shopOrderId", value = "子订单Id")
     })
     @GetMapping("/result/json")
-    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId,Integer orderFlag,Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag, Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
         if (null == mbOrderId) {
             return ResponseJson.error("平台唯一流水号不能为空!", null);
         }
         if (null == orderFlag) {
             return ResponseJson.error("订单标识不能为空!", null);
         }
-        return heliPayService.getPayOrderResult(mbOrderId, orderFlag,shopOrderId);
+        return heliPayService.getPayOrderResult(mbOrderId, orderFlag, shopOrderId);
     }
 
     /**
@@ -213,15 +301,40 @@ public class HeliPayApi {
             @ApiImplicitParam(required = false, name = "shopOrderId", value = "子订单Id")
     })
     @GetMapping("/result/union")
-    public ResponseJson<JSONObject> getUnionResult(String mbOrderId,Integer orderFlag,Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+    public ResponseJson<JSONObject> getUnionResult(String mbOrderId, Integer orderFlag, Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
         if (null == mbOrderId) {
             return ResponseJson.error("平台唯一流水号不能为空!", null);
         }
         if (null == orderFlag) {
             return ResponseJson.error("订单标识不能为空!", null);
         }
-        return heliPayService.getUnionResult(mbOrderId, orderFlag,shopOrderId);
+        return heliPayService.getUnionResult(mbOrderId, orderFlag, shopOrderId);
+    }
+
+    @ApiOperation("合利宝快捷支付")
+    @PostMapping("/quick/pay")
+    public ResponseJson<Map<String, String>> quickPay(HeliDto heliDto, @RequestHeader HttpHeaders headers) {
+        if (null == heliDto.getUserId()) {
+            return ResponseJson.error("用户Id不能为空!");
+        }
+        if (null == heliDto.getQuickPayFlag()) {
+            return ResponseJson.error("支付类型不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getQuickPayBankNumber())) {
+            return ResponseJson.error("绑定卡号不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getQuickPayUserName())) {
+            return ResponseJson.error("用户名不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getIdCard())) {
+            return ResponseJson.error("身份证号不能为空!");
+        }
+        if (StringUtils.isBlank(heliDto.getQuickPayMobile())) {
+            return ResponseJson.error("银行预留手机号码不能为空!");
+        }
+        return heliPayService.quickPay(heliDto, headers);
     }
+
     /**
      * 合利宝pc支付宝二维码
      */
@@ -291,6 +404,15 @@ public class HeliPayApi {
         return heliPayService.paymentCallback(res);
     }
 
+    @ApiOperation("快捷支付异步通知回调")
+    @PostMapping("/quick/callback")
+    public String quickPayCallback(QuickPayConfirmPayResponseVo res) {
+        if (res == null) {
+            return "回调参数失败";
+        }
+        return heliPayService.quickPayCallback(res);
+    }
+
     @ApiOperation("网银支付异步通知回调")
     @PostMapping("/union/callback")
     public String unionCallback(UnionResVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException {

+ 11 - 3
src/main/java/com/caimei365/order/controller/HeliPayNonOrderApi.java

@@ -4,8 +4,8 @@ import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.HeliDto;
 import com.caimei365.order.model.dto.PayCouponDto;
-import com.caimei365.order.model.dto.PayVipDto;
 import com.caimei365.order.model.vo.NotifyResponseVo;
+import com.caimei365.order.model.vo.QuickPayConfirmPayResponseVo;
 import com.caimei365.order.model.vo.UnionResVo;
 import com.caimei365.order.service.HeliPayNonOrderService;
 import io.swagger.annotations.Api;
@@ -80,6 +80,15 @@ public class HeliPayNonOrderApi {
         return payNonOrderService.paySecondByAlipay(heliDto, headers);
     }
 
+    @ApiOperation("快捷支付非订单回调")
+    @PostMapping("/unorder/quick/callback")
+    public String quickPayCallback(QuickPayConfirmPayResponseVo res) {
+        if (null == res) {
+            return "回调参数失败";
+        }
+        return payNonOrderService.quickCallback(res);
+    }
+
     /**
      * 二手发布-支付回调
      */
@@ -239,7 +248,6 @@ public class HeliPayNonOrderApi {
     }
 
 
-
     /**
      * 二手发布-网银支付回调
      */
@@ -377,7 +385,7 @@ public class HeliPayNonOrderApi {
 
     @ApiOperation("开通认证通会员-网银线上支付")
     @PostMapping("/auth/vip/union")
-    public ResponseJson<String> payAuthVipByUnionPay(HeliDto heliDto, @RequestHeader HttpHeaders headers){
+    public ResponseJson<String> payAuthVipByUnionPay(HeliDto heliDto, @RequestHeader HttpHeaders headers) {
         if (StringUtils.isEmpty(heliDto.getPayType())) {
             return ResponseJson.error("支付类型不能为空", null);
         }

+ 24 - 0
src/main/java/com/caimei365/order/mapper/PayOrderMapper.java

@@ -255,4 +255,28 @@ public interface PayOrderMapper {
     String getSplitCodeByShopOrderId(Integer shopOrderId);
 
     void updateBySplitStatusByNo(String orderRequestNo);
+
+    QuickInfoVo findInfoByBankNumber(String quickPayBankCode);
+
+    void insertQuickPayInfo(QuickInfoVo quickInfoVo);
+
+    void updateQuickInfo(String bankCode, Integer bankType, Integer infoId);
+
+    void delQuickInfo(String infoId);
+
+    void insertBindId(String bindId, String customerNumber, String userId, Integer infoId);
+
+    List<QuickBankVo> findQuickBank(Integer cardType,String initial);
+
+    QuickInfoVo getQuickInfoById(Integer cardId);
+
+    void delQuickBindId(String quickBindId);
+
+    List<String> findQuickBankInitial(Integer cardType);
+
+    void updateQuickPayInfo(QuickInfoVo quickInfoVo);
+
+    List<QuickBankVo> findUnCodeBanks();
+
+    QuickInfoVo findInfoById(Integer infoId);
 }

+ 18 - 0
src/main/java/com/caimei365/order/model/dto/BankListDto.java

@@ -0,0 +1,18 @@
+package com.caimei365.order.model.dto;
+
+import com.caimei365.order.model.vo.BankCodeVo;
+import com.caimei365.order.model.vo.QuickBankVo;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author zzj
+ */
+@Data
+public class BankListDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String initial;
+    private List<QuickBankVo> banks;
+}

+ 26 - 2
src/main/java/com/caimei365/order/model/dto/HeliDto.java

@@ -50,7 +50,7 @@ public class HeliDto implements Serializable {
     private String userType;
 
 
-    @ApiModelProperty("支付类型 微信:WXEWM  支付宝:ZFBEWM 公众号:GZH 小程序:XCX 银联:YL")
+    @ApiModelProperty("支付类型 微信:WXEWM  支付宝:ZFBEWM 公众号:GZH 小程序:XCX 银联:YL 快捷:QUICK")
     private String payType;
 
     /**
@@ -85,9 +85,33 @@ public class HeliDto implements Serializable {
     @ApiModelProperty("购买记录id")
     private Integer couponRecordId;
     /**
-     *  1小程序 2网站
+     * 1小程序 2网站
      */
     @ApiModelProperty("领取渠道1小程序 2网站")
     private Integer source;
+
+    @ApiModelProperty("快捷支付用户姓名")
+    private String quickPayUserName;
+
+    @ApiModelProperty("快捷支付用户银行卡号/信用卡号")
+    private String quickPayBankNumber;
+
+    @ApiModelProperty("快捷支付银行卡绑定手机号")
+    private String quickPayMobile;
+
+    @ApiModelProperty("快捷支付信用卡过期时间,只包含年月 yy-MM")
+    private String quickPayBankExpireTime;
+
+    @ApiModelProperty("身份证号")
+    private String idCard;
+
+    @ApiModelProperty("信用卡安全码")
+    private String cvvCode;
+
+    @ApiModelProperty("快捷支付类型标记1订单2超级会员3认证通会员4优惠券")
+    private Integer quickPayFlag;
+
+    @ApiModelProperty("支付卡类型 1借记卡/2贷记卡")
+    private Integer cardType;
 }
 

+ 4 - 3
src/main/java/com/caimei365/order/model/enums/BizType.java

@@ -8,14 +8,15 @@ public enum BizType {
     // 企业网银  return "12";
     // 个人网银 "17";
 
-//    YL("YL", "AppPayPublic", "PUBLIC", "17"), //银联
-    B2B("B2B","","","12"),//企业网银
-    B2C("B2C","","","17"),//个人
+    //    YL("YL", "AppPayPublic", "PUBLIC", "17"), //银联
+    B2B("B2B", "", "", "12"),//企业网银
+    B2C("B2C", "", "", "17"),//个人
     XCX("XCX", "AppPayApplet", "APPLET", "15"),//小程序
     GZH("GZH", "AppPayPublic", "PUBLIC", "13"),//公众号
     ZFBEWM("ZFBEWM", "AppPay", "SCAN", "14"),//支付宝二维码
     //pc二维码跟公众号一样13
     WXEWM("WXEWM", "AppPay", "SCAN", "13"),//微信二维码
+    QUICK("QUICK", "QuickPayFirstPayPreOrder", "", "29")//快捷支付
     ;
 
     BizType(String type, String p1, String p4, String num) {

+ 4 - 0
src/main/java/com/caimei365/order/model/po/DiscernReceiptPo.java

@@ -70,4 +70,8 @@ public class DiscernReceiptPo implements Serializable {
      * 支付回调返回数据--[线上字段]
      */
     private String formData;
+    /**
+     * 快捷支付银行卡Id
+     */
+    private Integer infoId;
 }

+ 66 - 0
src/main/java/com/caimei365/order/model/vo/BankCardUnbindResponseVo.java

@@ -0,0 +1,66 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ * Created by heli50 on 2018-08-21.
+ */
+public class BankCardUnbindResponseVo {
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_retMsg;
+    private String rt4_customerNumber;
+    @SignExclude
+    private String sign;
+    @SignExclude
+    private String signatureType;
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 75 - 0
src/main/java/com/caimei365/order/model/vo/BankCardUnbindVo.java

@@ -0,0 +1,75 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ *  银行卡解绑参数
+ */
+public class BankCardUnbindVo {
+
+    private String P1_bizType;
+    private String P2_customerNumber;
+    private String P3_userId;
+    private String P4_bindId;
+    private String P5_orderId;
+    private String P6_timestamp;
+    @SignExclude
+    private String signatureType;
+
+    public String getP1_bizType() {
+        return P1_bizType;
+    }
+
+    public void setP1_bizType(String p1_bizType) {
+        P1_bizType = p1_bizType;
+    }
+
+    public String getP2_customerNumber() {
+        return P2_customerNumber;
+    }
+
+    public void setP2_customerNumber(String p2_customerNumber) {
+        P2_customerNumber = p2_customerNumber;
+    }
+
+    public String getP3_userId() {
+        return P3_userId;
+    }
+
+    public void setP3_userId(String p3_userId) {
+        P3_userId = p3_userId;
+    }
+
+    public String getP4_bindId() {
+        return P4_bindId;
+    }
+
+    public void setP4_bindId(String p4_bindId) {
+        P4_bindId = p4_bindId;
+    }
+
+    public String getP5_orderId() {
+        return P5_orderId;
+    }
+
+    public void setP5_orderId(String p5_orderId) {
+        P5_orderId = p5_orderId;
+    }
+
+    public String getP6_timestamp() {
+        return P6_timestamp;
+    }
+
+    public void setP6_timestamp(String p6_timestamp) {
+        P6_timestamp = p6_timestamp;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 125 - 0
src/main/java/com/caimei365/order/model/vo/BindCardPreOrderResponseVo.java

@@ -0,0 +1,125 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ *  鉴权绑卡返回值
+ */
+public class BindCardPreOrderResponseVo {
+
+    private String rt1_bizType;
+
+    private String rt2_retCode;
+
+    private String rt3_retMsg;
+
+    private String rt4_customerNumber;
+
+    private String rt5_userId;
+
+    private String rt6_orderId;
+
+    @SignExclude
+    private String smsStatus;
+
+    @SignExclude
+    private String smsMsg;
+
+    @SignExclude
+    private String smsConfirm;
+
+    @SignExclude
+    private String sign;
+
+    @SignExclude
+    private String signatureType;
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getRt5_userId() {
+        return rt5_userId;
+    }
+
+    public void setRt5_userId(String rt5_userId) {
+        this.rt5_userId = rt5_userId;
+    }
+
+    public String getRt6_orderId() {
+        return rt6_orderId;
+    }
+
+    public void setRt6_orderId(String rt6_orderId) {
+        this.rt6_orderId = rt6_orderId;
+    }
+
+    public String getSmsStatus() {
+        return smsStatus;
+    }
+
+    public void setSmsStatus(String smsStatus) {
+        this.smsStatus = smsStatus;
+    }
+
+    public String getSmsMsg() {
+        return smsMsg;
+    }
+
+    public void setSmsMsg(String smsMsg) {
+        this.smsMsg = smsMsg;
+    }
+
+    public String getSmsConfirm() {
+        return smsConfirm;
+    }
+
+    public void setSmsConfirm(String smsConfirm) {
+        this.smsConfirm = smsConfirm;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 76 - 0
src/main/java/com/caimei365/order/model/vo/BindCardQueryResponseVo.java

@@ -0,0 +1,76 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ * Created by heli50 on 2018-08-21.
+ */
+public class BindCardQueryResponseVo {
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_retMsg;
+    private String rt4_customerNumber;
+    private String rt5_bindCardList;
+    @SignExclude
+    private String sign;
+
+    @SignExclude
+    private String signatureType;
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getRt5_bindCardList() {
+        return rt5_bindCardList;
+    }
+
+    public void setRt5_bindCardList(String rt5_bindCardList) {
+        this.rt5_bindCardList = rt5_bindCardList;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 65 - 0
src/main/java/com/caimei365/order/model/vo/BindCardQueryVo.java

@@ -0,0 +1,65 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ * 查询绑定银行卡信息
+ */
+public class BindCardQueryVo {
+    private String P1_bizType;
+    private String P2_customerNumber;
+    private String P3_userId;
+    private String P4_bindId;
+    private String P5_timestamp;
+    @SignExclude
+    private String signatureType;
+
+    public String getP1_bizType() {
+        return P1_bizType;
+    }
+
+    public void setP1_bizType(String p1_bizType) {
+        P1_bizType = p1_bizType;
+    }
+
+    public String getP2_customerNumber() {
+        return P2_customerNumber;
+    }
+
+    public void setP2_customerNumber(String p2_customerNumber) {
+        P2_customerNumber = p2_customerNumber;
+    }
+
+    public String getP3_userId() {
+        return P3_userId;
+    }
+
+    public void setP3_userId(String p3_userId) {
+        P3_userId = p3_userId;
+    }
+
+    public String getP4_bindId() {
+        return P4_bindId;
+    }
+
+    public void setP4_bindId(String p4_bindId) {
+        P4_bindId = p4_bindId;
+    }
+
+    public String getP5_timestamp() {
+        return P5_timestamp;
+    }
+
+    public void setP5_timestamp(String p5_timestamp) {
+        P5_timestamp = p5_timestamp;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 128 - 0
src/main/java/com/caimei365/order/model/vo/ConfirmBindCardResponseVo.java

@@ -0,0 +1,128 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ *  验证码绑卡返回值
+ */
+public class ConfirmBindCardResponseVo {
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_retMsg;
+    private String rt4_customerNumber;
+    private String rt5_userId;
+    private String rt6_orderId;
+    private String rt7_bindStatus;
+    private String rt8_bankId;
+    private String rt9_cardAfterFour;
+    private String rt10_bindId;
+    private String rt11_serialNumber;
+    @SignExclude
+    private String sign;
+    @SignExclude
+    private String signatureType;
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getRt5_userId() {
+        return rt5_userId;
+    }
+
+    public void setRt5_userId(String rt5_userId) {
+        this.rt5_userId = rt5_userId;
+    }
+
+    public String getRt6_orderId() {
+        return rt6_orderId;
+    }
+
+    public void setRt6_orderId(String rt6_orderId) {
+        this.rt6_orderId = rt6_orderId;
+    }
+
+    public String getRt7_bindStatus() {
+        return rt7_bindStatus;
+    }
+
+    public void setRt7_bindStatus(String rt7_bindStatus) {
+        this.rt7_bindStatus = rt7_bindStatus;
+    }
+
+    public String getRt8_bankId() {
+        return rt8_bankId;
+    }
+
+    public void setRt8_bankId(String rt8_bankId) {
+        this.rt8_bankId = rt8_bankId;
+    }
+
+    public String getRt9_cardAfterFour() {
+        return rt9_cardAfterFour;
+    }
+
+    public void setRt9_cardAfterFour(String rt9_cardAfterFour) {
+        this.rt9_cardAfterFour = rt9_cardAfterFour;
+    }
+
+    public String getRt10_bindId() {
+        return rt10_bindId;
+    }
+
+    public void setRt10_bindId(String rt10_bindId) {
+        this.rt10_bindId = rt10_bindId;
+    }
+
+    public String getRt11_serialNumber() {
+        return rt11_serialNumber;
+    }
+
+    public void setRt11_serialNumber(String rt11_serialNumber) {
+        this.rt11_serialNumber = rt11_serialNumber;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 74 - 0
src/main/java/com/caimei365/order/model/vo/ConfirmBindCardVo.java

@@ -0,0 +1,74 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.FieldEncrypt;
+import com.caimei365.order.annotation.SignExclude;
+import lombok.ToString;
+
+/**
+ * 验证码绑卡接口参数
+ */
+@ToString
+public class ConfirmBindCardVo {
+    private String P1_bizType;
+
+    private String P2_customerNumber;
+
+    private String P3_orderId;
+
+    private String P4_timestamp;
+
+    @FieldEncrypt
+    private String P5_validateCode;
+
+    @SignExclude
+    private String signatureType;
+
+    public String getP1_bizType() {
+        return P1_bizType;
+    }
+
+    public void setP1_bizType(String p1_bizType) {
+        P1_bizType = p1_bizType;
+    }
+
+    public String getP2_customerNumber() {
+        return P2_customerNumber;
+    }
+
+    public void setP2_customerNumber(String p2_customerNumber) {
+        P2_customerNumber = p2_customerNumber;
+    }
+
+    public String getP3_orderId() {
+        return P3_orderId;
+    }
+
+    public void setP3_orderId(String p3_orderId) {
+        P3_orderId = p3_orderId;
+    }
+
+    public String getP4_timestamp() {
+        return P4_timestamp;
+    }
+
+    public void setP4_timestamp(String p4_timestamp) {
+        P4_timestamp = p4_timestamp;
+    }
+
+    public String getP5_validateCode() {
+        return P5_validateCode;
+    }
+
+    public void setP5_validateCode(String p5_validateCode) {
+        P5_validateCode = p5_validateCode;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 8 - 0
src/main/java/com/caimei365/order/model/vo/DiscernReceiptVo.java

@@ -73,4 +73,12 @@ public class DiscernReceiptVo implements Serializable {
      * 米花科技平台唯一流水号
      */
     private String mbOrderId;
+    /**
+     * 快捷支付银行卡信息Id
+     */
+    private Integer infoId;
+    /**
+     * 快捷支付页面展示支付方式
+     */
+    private String quickPayStr;
 }

+ 61 - 0
src/main/java/com/caimei365/order/model/vo/FirstPaySendValidateCodeVo.java

@@ -0,0 +1,61 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ *  手动发送验证码
+ */
+public class FirstPaySendValidateCodeVo {
+    private String P1_bizType;
+
+    private String P2_customerNumber;
+
+    private String P3_orderId;
+
+    private String P4_timestamp;
+
+
+    @SignExclude
+    private String signatureType;
+
+    public String getP1_bizType() {
+        return P1_bizType;
+    }
+
+    public void setP1_bizType(String p1_bizType) {
+        P1_bizType = p1_bizType;
+    }
+
+    public String getP2_customerNumber() {
+        return P2_customerNumber;
+    }
+
+    public void setP2_customerNumber(String p2_customerNumber) {
+        P2_customerNumber = p2_customerNumber;
+    }
+
+    public String getP3_orderId() {
+        return P3_orderId;
+    }
+
+    public void setP3_orderId(String p3_orderId) {
+        P3_orderId = p3_orderId;
+    }
+
+    public String getP4_timestamp() {
+        return P4_timestamp;
+    }
+
+    public void setP4_timestamp(String p4_timestamp) {
+        P4_timestamp = p4_timestamp;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 78 - 0
src/main/java/com/caimei365/order/model/vo/FirstQuickPayVo.java

@@ -0,0 +1,78 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.FieldEncrypt;
+import com.caimei365.order.annotation.SignExclude;
+import lombok.Data;
+
+/**
+ * Created by heli50 on 2017/4/14.
+ */
+@Data
+public class FirstQuickPayVo {
+    private String P1_bizType;
+
+    private String P2_customerNumber;
+
+    private String P3_userId;
+
+    private String P4_orderId;
+
+    private String P5_timestamp;
+
+    private String P6_payerName;
+
+    private String P7_idCardType;
+
+    @FieldEncrypt
+    private String P8_idCardNo;
+
+    @FieldEncrypt
+    private String P9_cardNo;
+
+    /**
+     * 当银行卡是信用卡时必输
+     * 信用卡有效期 年
+     */
+    @FieldEncrypt
+    private String P10_year;
+
+    /**
+     * 当银行卡是信用卡时必输
+     * 信用卡有效期 月
+     */
+    @FieldEncrypt
+    private String P11_month;
+
+    @FieldEncrypt
+    private String P12_cvv2;
+
+    @FieldEncrypt
+    private String P13_phone;
+
+    private String P14_currency;
+
+    private String P15_orderAmount;
+
+    private String P16_goodsName;
+
+    private String P17_goodsDesc;
+
+    private String P18_terminalType;
+
+    private String P19_terminalId;
+
+    private String P20_orderIp;
+
+    private String P21_period;
+
+    private String P22_periodUnit;
+
+    private String P23_serverCallbackUrl;
+
+    @SignExclude
+    private String sendValidateCode;
+
+    @SignExclude
+    private String signatureType;
+}

+ 141 - 0
src/main/java/com/caimei365/order/model/vo/OnceBindCardVo.java

@@ -0,0 +1,141 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.FieldEncrypt;
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ * @author zzj
+ * 一键绑卡发送参数
+ */
+public class OnceBindCardVo {
+    private String P1_bizType;
+    private String P2_customerNumber;
+    private String P3_userId;
+    private String P4_orderId;
+    private String P5_timestamp;
+    private String P6_payerName;
+    private String P7_idCardType;
+    @FieldEncrypt
+    private String P8_idCardNo;
+    @FieldEncrypt
+    private String P9_phone;
+    private String P10_bankId;
+    private String P11_onlineCardType;
+    private String P12_serverCallbackUrl;
+    private String P13_bankRdrctToMchUrl;
+    @SignExclude
+    private String signatureType;
+
+    public String getP1_bizType() {
+        return P1_bizType;
+    }
+
+    public void setP1_bizType(String p1_bizType) {
+        P1_bizType = p1_bizType;
+    }
+
+    public String getP2_customerNumber() {
+        return P2_customerNumber;
+    }
+
+    public void setP2_customerNumber(String p2_customerNumber) {
+        P2_customerNumber = p2_customerNumber;
+    }
+
+    public String getP3_userId() {
+        return P3_userId;
+    }
+
+    public void setP3_userId(String p3_userId) {
+        P3_userId = p3_userId;
+    }
+
+    public String getP4_orderId() {
+        return P4_orderId;
+    }
+
+    public void setP4_orderId(String p4_orderId) {
+        P4_orderId = p4_orderId;
+    }
+
+    public String getP5_timestamp() {
+        return P5_timestamp;
+    }
+
+    public void setP5_timestamp(String p5_timestamp) {
+        P5_timestamp = p5_timestamp;
+    }
+
+    public String getP6_payerName() {
+        return P6_payerName;
+    }
+
+    public void setP6_payerName(String p6_payerName) {
+        P6_payerName = p6_payerName;
+    }
+
+    public String getP7_idCardType() {
+        return P7_idCardType;
+    }
+
+    public void setP7_idCardType(String p7_idCardType) {
+        P7_idCardType = p7_idCardType;
+    }
+
+    public String getP8_idCardNo() {
+        return P8_idCardNo;
+    }
+
+    public void setP8_idCardNo(String p8_idCardNo) {
+        P8_idCardNo = p8_idCardNo;
+    }
+
+    public String getP9_phone() {
+        return P9_phone;
+    }
+
+    public void setP9_phone(String p9_phone) {
+        P9_phone = p9_phone;
+    }
+
+    public String getP10_bankId() {
+        return P10_bankId;
+    }
+
+    public void setP10_bankId(String p10_bankId) {
+        P10_bankId = p10_bankId;
+    }
+
+    public String getP11_onlineCardType() {
+        return P11_onlineCardType;
+    }
+
+    public void setP11_onlineCardType(String p11_onlineCardType) {
+        P11_onlineCardType = p11_onlineCardType;
+    }
+
+    public String getP12_serverCallbackUrl() {
+        return P12_serverCallbackUrl;
+    }
+
+    public void setP12_serverCallbackUrl(String p12_serverCallbackUrl) {
+        P12_serverCallbackUrl = p12_serverCallbackUrl;
+    }
+
+    public String getP13_bankRdrctToMchUrl() {
+        return P13_bankRdrctToMchUrl;
+    }
+
+    public void setP13_bankRdrctToMchUrl(String p13_bankRdrctToMchUrl) {
+        P13_bankRdrctToMchUrl = p13_bankRdrctToMchUrl;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 75 - 0
src/main/java/com/caimei365/order/model/vo/OnceBindResponseVo.java

@@ -0,0 +1,75 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ * @author zzj
+ * 一键绑卡返回参数
+ */
+public class OnceBindResponseVo {
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_retMsg;
+    private String rt4_customerNumber;
+    private String rt5_formData;
+    private String rt6_orderId;
+    @SignExclude
+    private String sign;
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getRt5_formData() {
+        return rt5_formData;
+    }
+
+    public void setRt5_formData(String rt5_formData) {
+        this.rt5_formData = rt5_formData;
+    }
+
+    public String getRt6_orderId() {
+        return rt6_orderId;
+    }
+
+    public void setRt6_orderId(String rt6_orderId) {
+        this.rt6_orderId = rt6_orderId;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+}

+ 28 - 0
src/main/java/com/caimei365/order/model/vo/QuickBankVo.java

@@ -0,0 +1,28 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zzj
+ */
+@Data
+public class QuickBankVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String bankCode;
+    /**
+     * 1借记卡/2贷记卡
+     */
+    private Integer cardType;
+    /**
+     * 银行名
+     */
+    private String bankName;
+    /**
+     * 银行名首字母
+     */
+    private String initial;
+
+    private String bankLogo;
+}

+ 31 - 0
src/main/java/com/caimei365/order/model/vo/QuickInfoVo.java

@@ -0,0 +1,31 @@
+package com.caimei365.order.model.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zzj
+ */
+@Data
+public class QuickInfoVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+    private Integer userId;
+    private String quickPayUserId;
+    private String quickPaybindId;
+    private String idCard;
+    private String bankNumber;
+    private String bankExpireTime;
+    private String bankCvvCode;
+    /**
+     * 用户绑定卡类型1借记卡2信用卡
+     */
+    private String bankType;
+    private String bindMobile;
+    private String bankUserName;
+    private String quickPayBankCode;
+    private String customer;
+    private String bankName;
+}

+ 180 - 0
src/main/java/com/caimei365/order/model/vo/QuickPayBindCardPreOrderVo.java

@@ -0,0 +1,180 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.FieldEncrypt;
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ * 合利宝鉴权绑卡预下单参数
+ */
+public class QuickPayBindCardPreOrderVo {
+    private String P1_bizType;
+
+    private String P2_customerNumber;
+
+    private String P3_userId;
+
+    private String P4_orderId;
+
+    private String P5_timestamp;
+
+    private String P6_payerName;
+
+    private String P7_idCardType;
+
+    @FieldEncrypt
+    private String P8_idCardNo;
+
+    @FieldEncrypt
+    private String P9_cardNo;
+
+    @FieldEncrypt
+    private String P10_year;
+
+    @FieldEncrypt
+    private String P11_month;
+
+    @FieldEncrypt
+    private String P12_cvv2;
+
+    @FieldEncrypt
+    private String P13_phone;
+
+    @SignExclude
+    private String sendValidateCode;
+
+    @SignExclude
+    private String protocolType;
+
+    @SignExclude
+    private String signatureType;
+
+    public String getP1_bizType() {
+        return P1_bizType;
+    }
+
+    public void setP1_bizType(String p1_bizType) {
+        P1_bizType = p1_bizType;
+    }
+
+    public String getP2_customerNumber() {
+        return P2_customerNumber;
+    }
+
+    public void setP2_customerNumber(String p2_customerNumber) {
+        P2_customerNumber = p2_customerNumber;
+    }
+
+    public String getP3_userId() {
+        return P3_userId;
+    }
+
+    public void setP3_userId(String p3_userId) {
+        P3_userId = p3_userId;
+    }
+
+    public String getP4_orderId() {
+        return P4_orderId;
+    }
+
+    public void setP4_orderId(String p4_orderId) {
+        P4_orderId = p4_orderId;
+    }
+
+    public String getP5_timestamp() {
+        return P5_timestamp;
+    }
+
+    public void setP5_timestamp(String p5_timestamp) {
+        P5_timestamp = p5_timestamp;
+    }
+
+    public String getP6_payerName() {
+        return P6_payerName;
+    }
+
+    public void setP6_payerName(String p6_payerName) {
+        P6_payerName = p6_payerName;
+    }
+
+    public String getP7_idCardType() {
+        return P7_idCardType;
+    }
+
+    public void setP7_idCardType(String p7_idCardType) {
+        P7_idCardType = p7_idCardType;
+    }
+
+    public String getP8_idCardNo() {
+        return P8_idCardNo;
+    }
+
+    public void setP8_idCardNo(String p8_idCardNo) {
+        P8_idCardNo = p8_idCardNo;
+    }
+
+    public String getP9_cardNo() {
+        return P9_cardNo;
+    }
+
+    public void setP9_cardNo(String p9_cardNo) {
+        P9_cardNo = p9_cardNo;
+    }
+
+    public String getP10_year() {
+        return P10_year;
+    }
+
+    public void setP10_year(String p10_year) {
+        P10_year = p10_year;
+    }
+
+    public String getP11_month() {
+        return P11_month;
+    }
+
+    public void setP11_month(String p11_month) {
+        P11_month = p11_month;
+    }
+
+    public String getP12_cvv2() {
+        return P12_cvv2;
+    }
+
+    public void setP12_cvv2(String p12_cvv2) {
+        P12_cvv2 = p12_cvv2;
+    }
+
+    public String getP13_phone() {
+        return P13_phone;
+    }
+
+    public void setP13_phone(String p13_phone) {
+        P13_phone = p13_phone;
+    }
+
+    public String getSendValidateCode() {
+        return sendValidateCode;
+    }
+
+    public void setSendValidateCode(String sendValidateCode) {
+        this.sendValidateCode = sendValidateCode;
+    }
+
+    public String getProtocolType() {
+        return protocolType;
+    }
+
+    public void setProtocolType(String protocolType) {
+        this.protocolType = protocolType;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+
+}

+ 155 - 0
src/main/java/com/caimei365/order/model/vo/QuickPayConfirmPayResponseVo.java

@@ -0,0 +1,155 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ * 首次支付预下单回调
+ */
+public class QuickPayConfirmPayResponseVo {
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_retMsg;
+    private String rt4_customerNumber;
+    private String rt5_orderId;
+    private String rt6_serialNumber;
+    private String rt7_completeDate;
+    private String rt8_orderAmount;
+    private String rt9_orderStatus;
+    private String rt10_bindId;
+    private String rt11_bankId;
+    private String rt12_onlineCardType;
+    private String rt13_cardAfterFour;
+    private String rt14_userId;
+    @SignExclude
+    private String sign;
+    @SignExclude
+    private String signatureType;
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getRt5_orderId() {
+        return rt5_orderId;
+    }
+
+    public void setRt5_orderId(String rt5_orderId) {
+        this.rt5_orderId = rt5_orderId;
+    }
+
+    public String getRt6_serialNumber() {
+        return rt6_serialNumber;
+    }
+
+    public void setRt6_serialNumber(String rt6_serialNumber) {
+        this.rt6_serialNumber = rt6_serialNumber;
+    }
+
+    public String getRt7_completeDate() {
+        return rt7_completeDate;
+    }
+
+    public void setRt7_completeDate(String rt7_completeDate) {
+        this.rt7_completeDate = rt7_completeDate;
+    }
+
+    public String getRt8_orderAmount() {
+        return rt8_orderAmount;
+    }
+
+    public void setRt8_orderAmount(String rt8_orderAmount) {
+        this.rt8_orderAmount = rt8_orderAmount;
+    }
+
+    public String getRt9_orderStatus() {
+        return rt9_orderStatus;
+    }
+
+    public void setRt9_orderStatus(String rt9_orderStatus) {
+        this.rt9_orderStatus = rt9_orderStatus;
+    }
+
+    public String getRt10_bindId() {
+        return rt10_bindId;
+    }
+
+    public void setRt10_bindId(String rt10_bindId) {
+        this.rt10_bindId = rt10_bindId;
+    }
+
+    public String getRt11_bankId() {
+        return rt11_bankId;
+    }
+
+    public void setRt11_bankId(String rt11_bankId) {
+        this.rt11_bankId = rt11_bankId;
+    }
+
+    public String getRt12_onlineCardType() {
+        return rt12_onlineCardType;
+    }
+
+    public void setRt12_onlineCardType(String rt12_onlineCardType) {
+        this.rt12_onlineCardType = rt12_onlineCardType;
+    }
+
+    public String getRt13_cardAfterFour() {
+        return rt13_cardAfterFour;
+    }
+
+    public void setRt13_cardAfterFour(String rt13_cardAfterFour) {
+        this.rt13_cardAfterFour = rt13_cardAfterFour;
+    }
+
+    public String getRt14_userId() {
+        return rt14_userId;
+    }
+
+    public void setRt14_userId(String rt14_userId) {
+        this.rt14_userId = rt14_userId;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 114 - 0
src/main/java/com/caimei365/order/model/vo/QuickPayCreateOrderResponseVo.java

@@ -0,0 +1,114 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ * Created by heli50 on 2017/4/14.
+ */
+public class QuickPayCreateOrderResponseVo {
+
+    private String rt1_bizType;
+
+    private String rt2_retCode;
+
+    private String rt3_retMsg;
+
+    private String rt4_customerNumber;
+
+    private String rt5_orderId;
+
+    @SignExclude
+    private String smsStatus;
+
+    @SignExclude
+    private String smsMsg;
+
+    @SignExclude
+    private String smsConfirm;
+
+    @SignExclude
+    private String sign;
+    @SignExclude
+    private String signatureType;
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getRt5_orderId() {
+        return rt5_orderId;
+    }
+
+    public void setRt5_orderId(String rt5_orderId) {
+        this.rt5_orderId = rt5_orderId;
+    }
+
+    public String getSmsStatus() {
+        return smsStatus;
+    }
+
+    public void setSmsStatus(String smsStatus) {
+        this.smsStatus = smsStatus;
+    }
+
+    public String getSmsMsg() {
+        return smsMsg;
+    }
+
+    public void setSmsMsg(String smsMsg) {
+        this.smsMsg = smsMsg;
+    }
+
+    public String getSmsConfirm() {
+        return smsConfirm;
+    }
+
+    public void setSmsConfirm(String smsConfirm) {
+        this.smsConfirm = smsConfirm;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 81 - 0
src/main/java/com/caimei365/order/model/vo/QuickPaySendValidateCodeResponseVo.java

@@ -0,0 +1,81 @@
+package com.caimei365.order.model.vo;
+
+
+import com.caimei365.order.annotation.SignExclude;
+
+/**
+ *  发送短信返回值
+ */
+public class QuickPaySendValidateCodeResponseVo {
+
+    private String rt1_bizType;
+
+    private String rt2_retCode;
+
+    private String rt3_retMsg;
+
+    private String rt4_customerNumber;
+
+    private String rt5_orderId;
+
+    @SignExclude
+    private String sign;
+
+    @SignExclude
+    private String signatureType;
+
+    public String getRt1_bizType() {
+        return rt1_bizType;
+    }
+
+    public void setRt1_bizType(String rt1_bizType) {
+        this.rt1_bizType = rt1_bizType;
+    }
+
+    public String getRt2_retCode() {
+        return rt2_retCode;
+    }
+
+    public void setRt2_retCode(String rt2_retCode) {
+        this.rt2_retCode = rt2_retCode;
+    }
+
+    public String getRt3_retMsg() {
+        return rt3_retMsg;
+    }
+
+    public void setRt3_retMsg(String rt3_retMsg) {
+        this.rt3_retMsg = rt3_retMsg;
+    }
+
+    public String getRt4_customerNumber() {
+        return rt4_customerNumber;
+    }
+
+    public void setRt4_customerNumber(String rt4_customerNumber) {
+        this.rt4_customerNumber = rt4_customerNumber;
+    }
+
+    public String getRt5_orderId() {
+        return rt5_orderId;
+    }
+
+    public void setRt5_orderId(String rt5_orderId) {
+        this.rt5_orderId = rt5_orderId;
+    }
+
+    public String getSign() {
+        return sign;
+    }
+
+    public void setSign(String sign) {
+        this.sign = sign;
+    }
+    public String getSignatureType() {
+        return signatureType;
+    }
+
+    public void setSignatureType(String signatureType) {
+        this.signatureType = signatureType;
+    }
+}

+ 34 - 0
src/main/java/com/caimei365/order/model/vo/QuickPayUserVo.java

@@ -0,0 +1,34 @@
+package com.caimei365.order.model.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author zzj
+ */
+@Data
+public class QuickPayUserVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty("采美userId")
+    private Integer userId;
+    @ApiModelProperty("快捷支付绑定采美唯一userId")
+    private String quickPayUserId;
+    @ApiModelProperty("快捷支付绑定合利宝唯一Id")
+    private String quickPaybindId;
+    @ApiModelProperty("用户身份证号")
+    private String idCard;
+    @ApiModelProperty("用户银行卡/信用卡号")
+    private String bankNumber;
+    @ApiModelProperty("信用卡过期时间")
+    private String bankExpireTime;
+    @ApiModelProperty("信用卡安全码")
+    private String bankCvvCode;
+    @ApiModelProperty("用户绑定卡类型1借记卡2信用卡")
+    private Integer bankType;
+    @ApiModelProperty("用户银行预留手机号")
+    private String bindMobile;
+    @ApiModelProperty("用户银行绑定姓名")
+    private String bankUserName;
+}

+ 27 - 16
src/main/java/com/caimei365/order/service/HeliPayNonOrderService.java

@@ -7,6 +7,7 @@ import com.caimei365.order.model.dto.PayCouponDto;
 import com.caimei365.order.model.dto.PaySecondDto;
 import com.caimei365.order.model.dto.PayVipDto;
 import com.caimei365.order.model.vo.NotifyResponseVo;
+import com.caimei365.order.model.vo.QuickPayConfirmPayResponseVo;
 import com.caimei365.order.model.vo.UnionResVo;
 import org.springframework.http.HttpHeaders;
 
@@ -21,22 +22,26 @@ public interface HeliPayNonOrderService {
     ResponseJson<JSONObject> payCouponByWeChat(HeliDto heliDto, HttpHeaders headers) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
 
     String couponCallback(NotifyResponseVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
+
     /**
      * 二手发布微信线上支付
+     *
      * @param heliDto {
-     *               productId      二手发布商品id
-     *               returnUrl     页面回调地址
-     *               code          微信小程序code
-     *               state         微信公众号state参数
-     * }
+     *                productId      二手发布商品id
+     *                returnUrl     页面回调地址
+     *                code          微信小程序code
+     *                state         微信公众号state参数
+     *                }
      */
     ResponseJson<JSONObject> paySecondByWeChat(HeliDto heliDto, HttpHeaders headers) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
+
     /**
      * 二手发布支付宝线上支付
+     *
      * @param heliDto {
-     *               productId      二手发布商品id
-     *               returnUrl     页面回调地址
-     * }
+     *                productId      二手发布商品id
+     *                returnUrl     页面回调地址
+     *                }
      */
     ResponseJson<JSONObject> paySecondByAlipay(HeliDto heliDto, HttpHeaders headers) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
 
@@ -47,20 +52,23 @@ public interface HeliPayNonOrderService {
 
     /**
      * 升级超级会员-微信线上支付
+     *
      * @param heliDto {
-     *               vipRecordId   会员购买记录Id
-     *               returnUrl     页面回调地址
-     *               code          微信小程序code
-     *               state         微信公众号state参数
-     * }
+     *                vipRecordId   会员购买记录Id
+     *                returnUrl     页面回调地址
+     *                code          微信小程序code
+     *                state         微信公众号state参数
+     *                }
      */
     ResponseJson<JSONObject> paySuperVipByWeChat(HeliDto heliDto, HttpHeaders headers) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
+
     /**
      * 升级超级会员-支付宝线上支付
+     *
      * @param heliDto {
-     *               vipRecordId   会员购买记录Id
-     *               returnUrl     页面回调地址
-     * }
+     *                vipRecordId   会员购买记录Id
+     *                returnUrl     页面回调地址
+     *                }
      */
     ResponseJson<JSONObject> paySuperVipByAlipay(HeliDto heliDto, HttpHeaders headers) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
 
@@ -77,6 +85,7 @@ public interface HeliPayNonOrderService {
      * 升级超级会员-网银支付回调
      */
     String unionVipCallback(UnionResVo data) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
+
     /**
      * 二手发布-网银支付回调
      */
@@ -123,4 +132,6 @@ public interface HeliPayNonOrderService {
     ResponseJson vipCheck(Integer recordId);
 
     ResponseJson<JSONObject> payCouponByBeans(HeliDto heliDto, HttpHeaders headers);
+
+    String quickCallback(QuickPayConfirmPayResponseVo res);
 }

+ 18 - 0
src/main/java/com/caimei365/order/service/HeliPayService.java

@@ -2,10 +2,12 @@ package com.caimei365.order.service;
 
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.model.dto.BankListDto;
 import com.caimei365.order.model.dto.HeliDto;
 import com.caimei365.order.model.dto.PayDto;
 import com.caimei365.order.model.vo.*;
 import org.springframework.http.HttpHeaders;
+import org.springframework.http.HttpRequest;
 
 import javax.servlet.http.HttpServletRequest;
 import java.beans.IntrospectionException;
@@ -52,4 +54,20 @@ public interface HeliPayService {
     ResponseJson<List<ShopOrderVo>> getShopOrders(Integer orderId);
 
     ResponseJson<JSONObject> getUnionResult(String mbOrderId, Integer orderFlag, Integer shopOrderId);
+
+    ResponseJson<Map<String, String>>  quickPay(HeliDto heliDto, HttpHeaders headers);
+
+    String quickPayCallback(QuickPayConfirmPayResponseVo res);
+
+    ResponseJson<Map<String,String>> bindBankCard(HeliDto heliDto);
+
+    ResponseJson bindByCode(Integer flag,String bindCode, String orderId,String infoId,String customer);
+
+    ResponseJson<List<BankListDto>> bankInfos(Integer cardType);
+
+    ResponseJson unBoundCard(Integer cardId);
+
+    ResponseJson<String> bindCardNoCode(HeliDto heliDto);
+
+    ResponseJson<List<QuickBankVo>> unCodeInfos();
 }

+ 124 - 229
src/main/java/com/caimei365/order/service/impl/HeliPayNonOrderServiceImpl.java

@@ -25,6 +25,7 @@ import com.caimei365.order.utils.MathUtil;
 import com.caimei365.order.utils.PayUtil;
 import com.caimei365.order.utils.helipay.Disguiser;
 import com.caimei365.order.utils.helipay.HttpClientService;
+import com.caimei365.order.utils.helipay.MessageHandle;
 import com.caimei365.order.utils.helipay.MyBeanUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
@@ -206,6 +207,12 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         } catch (NumberFormatException e) {
             log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>获取回调参数解析失败!");
         }
+        couponPayCheck(source, userId, couponId, recordId, payType, amount, payFormData, mbOrderId, orderRequestNo, null);
+        return "SUCCESS";
+    }
+
+    public void couponPayCheck(Integer source, Integer userId, Integer couponId, Integer recordId, Integer payType,
+                               Double amount, String payFormData, String mbOrderId, String orderRequestNo, Integer infoId) {
         //cm_coupon_club数据库修改
         CouponClubPo couponClubPo = new CouponClubPo();
         couponClubPo.setSource(source);
@@ -234,6 +241,9 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         discernReceipt.setReviewDate(curDateStr);
         discernReceipt.setUpdateDate(curDateStr);
         discernReceipt.setDelFlag(0);
+        if (null != infoId) {
+            discernReceipt.setInfoId(infoId);
+        }
         // 保存 收款记录
         baseMapper.insertDiscernReceipt(discernReceipt);
         log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",couponRecordId:" + recordId);
@@ -252,7 +262,6 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         log.info("【购买优惠券异步回调】>>>>>>>>>>>收款项和购买历史关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",couponRecordId:" + recordId);
         //修改分账付款状态
         payOrderMapper.updateSplitAccountByPay(mbOrderId);
-        return "SUCCESS";
     }
 
     /**
@@ -679,7 +688,7 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
      * @param res
      */
     @Override
-    public String paymentSuperVipCallback(NotifyResponseVo res) throws NoSuchAlgorithmException, InvalidKeySpecException, IntrospectionException, InvocationTargetException, IllegalAccessException {
+    public String paymentSuperVipCallback(NotifyResponseVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
         log.info("******************** 升级超级会员异步回调 start *******************");
         String sign = res.getSign();
         log.info("回调签名" + sign);
@@ -708,13 +717,13 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         // 附加数据,支付时若有传输则原样返回(vipId,userId,recordId,payType),下单时为空,则不返回该数据
         String attach = res.getRt8_desc();
         String[] split = attach.split(",");
-        int vipId = 0;
+        int packageId = 0;
         int userId = 0;
         int recordId = 0;
         int payType = 0;
         try {
             // 会员套餐Id
-            vipId = Integer.parseInt(split[0]);
+            packageId = Integer.parseInt(split[0]);
             // 用户Id
             userId = Integer.parseInt(split[1]);
             // 购买历史记录Id
@@ -724,6 +733,12 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         } catch (NumberFormatException e) {
             log.info("【升级超级会员异步回调】>>>>>>>>>>>>>>获取回调参数解析失败!");
         }
+        superVipStatusCheck(userId, packageId, payType, recordId, amount, payFormData, mbOrderId, orderRequestNo, null);
+        return "SUCCESS";
+    }
+
+    public void superVipStatusCheck(Integer userId, Integer packageId, Integer payType, Integer recordId,
+                                    Double amount, String payFormData, String mbOrderId, String orderRequestNo, Integer infoId) {
         //超级会员数据库修改
         UserVipPo userVip = new UserVipPo();
         UserVipPo dbUserVip = payOrderMapper.getUserVipInfo(userId);
@@ -739,7 +754,7 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         Calendar cal = Calendar.getInstance();
         cal.setTime(beginTime);
         // 超级会员套餐时长(月)
-        Integer mouth = payOrderMapper.getVipPackageDurationById(vipId);
+        Integer mouth = payOrderMapper.getVipPackageDurationById(packageId);
         cal.add(Calendar.MONTH, mouth);
         userVip.setEndTime(cal.getTime());
         userVip.setDelFlag(0);
@@ -782,6 +797,9 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         discernReceipt.setReviewDate(curDateStr);
         discernReceipt.setUpdateDate(curDateStr);
         discernReceipt.setDelFlag(0);
+        if (null != infoId) {
+            discernReceipt.setInfoId(infoId);
+        }
         // 保存 收款记录
         baseMapper.insertDiscernReceipt(discernReceipt);
         log.info("【升级超级会员异步回调】>>>>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",vipRecordId:" + recordId);
@@ -877,12 +895,11 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         if (smsPushFlag && StringUtils.isNotBlank(bindMobile)) {
             String shortLink = remoteCallService.getShortLink(8, 2, "https://www.caimei365.com/user/member.html?userId=" + userId);
             String content = "恭喜您成功开通采美平台超级会员,为期" + mouth + "个月,快戳采美网站链接www.caimei365.com/t/" + shortLink + "或微信搜索“采美采购商城”小程序登录采美平台畅享会员特权吧。关注公众号“采美365网”可获取更多优惠和精彩资讯。退订回T";
-            boolean sendSms = remoteCallService.getSendSms(3,2, bindMobile, content);
+            boolean sendSms = remoteCallService.getSendSms(3, 2, bindMobile, content);
             if (!sendSms) {
                 log.info("购买会员短信推送失败");
             }
         }
-        return "SUCCESS";
     }
 
     @Override
@@ -1064,93 +1081,7 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         } catch (NumberFormatException e) {
             log.info("【升级超级会员异步回调】>>>>>>>>>>>>>>获取回调参数解析失败!");
         }
-        //超级会员数据库修改
-        UserVipPo userVip = new UserVipPo();
-        UserVipPo dbUserVip = payOrderMapper.getUserVipInfo(userId);
-        Date beginTime = new Date();
-        if (null != dbUserVip && null != dbUserVip.getEndTime()) {
-            // 有效期内续费
-            beginTime = dbUserVip.getEndTime();
-            userVip.setId(dbUserVip.getId());
-        }
-        userVip.setUserId(userId);
-        userVip.setUpdateTime(new Date());
-        userVip.setBeginTime(beginTime);
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(beginTime);
-        // 超级会员套餐时长(月)
-        Integer mouth = payOrderMapper.getVipPackageDurationById(vipId);
-        cal.add(Calendar.MONTH, mouth);
-        userVip.setEndTime(cal.getTime());
-        userVip.setDelFlag(0);
-        if (null != userVip.getId()) {
-            // 更新会员信息
-            payOrderMapper.updateUserVipInfo(userVip);
-        } else {
-            // 新增会员信息
-            payOrderMapper.insertUserVipInfo(userVip);
-        }
-        // 修改会员历史记录支付状态
-        VipRecordBo record = payOrderMapper.getVipPackageRecord(recordId);
-        record.setPayStatus(1);
-        record.setBeginTime(beginTime);
-        record.setEndTime(cal.getTime());
-        record.setPayWay(1);
-        record.setPayType(payType);
-        record.setPayTime(new Date());
-        payOrderMapper.updateVipPackageRecord(record);
-        // 修改支付链接状态
-        OrderPayLinkVo orderPayLink = payOrderMapper.getVipPayLink(recordId, amount);
-        if (null != orderPayLink && (12 == payType || 17 == payType)) {
-            orderPayLink.setPayStatus(1);
-            payOrderMapper.updateOrderPayLinkStatus(orderPayLink);
-        }
-        Date date = new Date();
-        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
-        // 保存收款记录
-        DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
-        discernReceipt.setPayWay(1);
-        discernReceipt.setPayType(record.getPayType());
-        discernReceipt.setReceiptType(6);
-        discernReceipt.setReceiptStatus(3);
-        discernReceipt.setReceiptAmount(amount);
-        discernReceipt.setConfirmType(4);
-        discernReceipt.setRePayFlag(1);
-        discernReceipt.setFormData(payFormData);
-        discernReceipt.setReceiptDate(curDateStr);
-        discernReceipt.setConfirmDate(curDateStr);
-        discernReceipt.setReviewDate(curDateStr);
-        discernReceipt.setUpdateDate(curDateStr);
-        discernReceipt.setDelFlag(0);
-        // 保存 收款记录
-        baseMapper.insertDiscernReceipt(discernReceipt);
-        log.info("【升级超级会员异步回调】>>>>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",vipRecordId:" + recordId);
-        // 收款项和订单关系表
-        OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
-        relation.setReceiptId(discernReceipt.getId());
-        relation.setVipRecordId(recordId);
-        relation.setAssociateAmount(amount);
-        relation.setMbOrderId(mbOrderId);
-        relation.setOrderRequestNo(orderRequestNo);
-        relation.setSplitStatus(1);
-        relation.setRelationType(3);
-        relation.setDelFlag(0);
-        // 保存 收款项和订单关系
-        baseMapper.insertOrderReceiptRelation(relation);
-        log.info("【升级超级会员异步回调】>>>>>>>>>>>收款项和购买历史关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",vipRecordId:" + recordId);
-        //已支付推送
-        boolean smsPushFlag = !orderRequestNo.contains("BETA") && !orderRequestNo.contains("DEV");
-        String bindMobile = baseMapper.getBindMobileByUserId(userId);
-        if (smsPushFlag && StringUtils.isNotBlank(bindMobile)) {
-            String shortLink = remoteCallService.getShortLink(8, 2, "https://www.caimei365.com/user/member.html?userId=" + userId);
-            String content = "恭喜您成功开通采美平台超级会员,为期" + mouth + "个月,快戳采美网站链接www.caimei365.com/t/" + shortLink + "或微信搜索“采美采购商城”小程序登录采美平台畅享会员特权吧。关注公众号“采美365网”可获取更多优惠和精彩资讯。退订回T";
-            boolean sendSms = remoteCallService.getSendSms(3,2, bindMobile, content);
-            if (!sendSms) {
-                log.info("购买会员短信推送失败");
-            }
-        }
-        //修改分账付款状态
-        payOrderMapper.updateSplitAccount(mbOrderId, orderRequestNo);
+        superVipStatusCheck(userId, vipId, payType, recordId, amount, payFormData, mbOrderId, orderRequestNo, null);
         return "SUCCESS";
     }
 
@@ -1405,52 +1336,7 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         } catch (NumberFormatException e) {
             log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>获取回调参数解析失败!");
         }
-        //cm_coupon_club数据库修改
-        CouponClubPo couponClubPo = new CouponClubPo();
-        couponClubPo.setSource(source);
-        couponClubPo.setUserId(userId);
-        couponClubPo.setCouponId(couponId);
-        couponClubPo.setStatus("1");
-        couponClubPo.setDelFlag("0");
-        couponClubPo.setCreateDate(new Date());
-        orderClubMapper.insertCouponClub(couponClubPo);
-        // 改历史记录支付状态
-        payOrderMapper.updateCouponRecord(recordId);
-        Date date = new Date();
-        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
-        // 保存收款记录
-        DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
-        discernReceipt.setPayWay(1);
-        discernReceipt.setPayType(payType);
-        discernReceipt.setReceiptType(8);
-        discernReceipt.setReceiptStatus(3);
-        discernReceipt.setReceiptAmount(amount);
-        discernReceipt.setConfirmType(4);
-        discernReceipt.setRePayFlag(1);
-        discernReceipt.setFormData(payFormData);
-        discernReceipt.setReceiptDate(curDateStr);
-        discernReceipt.setConfirmDate(curDateStr);
-        discernReceipt.setReviewDate(curDateStr);
-        discernReceipt.setUpdateDate(curDateStr);
-        discernReceipt.setDelFlag(0);
-        // 保存 收款记录
-        baseMapper.insertDiscernReceipt(discernReceipt);
-        log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",couponRecordId:" + recordId);
-        // 收款项和订单关系表
-        OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
-        relation.setReceiptId(discernReceipt.getId());
-        relation.setCouponRecordId(recordId);
-        relation.setAssociateAmount(amount);
-        relation.setMbOrderId(mbOrderId);
-        relation.setOrderRequestNo(orderRequestNo);
-        relation.setSplitStatus(1);
-        relation.setRelationType(6);
-        relation.setDelFlag(0);
-        // 保存 收款项和订单关系
-        baseMapper.insertOrderReceiptRelation(relation);
-        log.info("【购买优惠券异步回调】>>>>>>>>>>>收款项和购买历史关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",couponRecordId:" + recordId);
-        //修改分账付款状态
-        payOrderMapper.updateSplitAccount(mbOrderId, orderRequestNo);
+        couponPayCheck(source, userId, couponId, recordId, payType, amount, payFormData, mbOrderId, orderRequestNo, null);
         return "SUCCESS";
     }
 
@@ -1732,6 +1618,12 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         } catch (NumberFormatException e) {
             log.info("【开通认证通会员异步回调】>>>>>>>>>>>>>>获取回调参数解析失败!");
         }
+        authVipStatusCheck(userId, vipId, recordId, payType, amount, payFormData, mbOrderId, orderRequestNo, null);
+        return "SUCCESS";
+    }
+
+    public void authVipStatusCheck(Integer userId, Integer vipId, Integer recordId, Integer payType, Double amount,
+                                   String payFormData, String mbOrderId, String orderRequestNo, Integer infoId) {
         //超级会员数据库修改
         UserVipPo authVip = new UserVipPo();
         UserVipPo dbAuthVip = payOrderMapper.getAuthVipInfo(userId);
@@ -1802,6 +1694,9 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         discernReceipt.setReviewDate(curDateStr);
         discernReceipt.setUpdateDate(curDateStr);
         discernReceipt.setDelFlag(0);
+        if (null != infoId) {
+            discernReceipt.setInfoId(infoId);
+        }
         // 保存 收款记录
         baseMapper.insertDiscernReceipt(discernReceipt);
         log.info("【开通认证通会员异步回调】>>>>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",vipRecordId:" + recordId);
@@ -1820,7 +1715,6 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         log.info("【开通认证通会员异步回调】>>>>>>>>>>>收款项和购买历史关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",vipRecordId:" + recordId);
         //修改分账付款状态
         payOrderMapper.updateSplitAccountByPay(mbOrderId);
-        return "SUCCESS";
     }
 
     @Override
@@ -1869,94 +1763,7 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         } catch (NumberFormatException e) {
             log.info("【开通认证通会员异步回调】>>>>>>>>>>>>>>获取回调参数解析失败!");
         }
-        //超级会员数据库修改
-        UserVipPo authVip = new UserVipPo();
-        UserVipPo dbAuthVip = payOrderMapper.getAuthVipInfo(userId);
-        Date beginTime = new Date();
-        if (null != dbAuthVip) {
-            authVip.setId(dbAuthVip.getId());
-            if (dbAuthVip.getEndTime().compareTo(beginTime) > 0) {
-                // 有效期内续费,用原结束时间作为开始时间来计算结束时间
-                beginTime = dbAuthVip.getEndTime();
-            }
-        }
-        authVip.setUserId(userId);
-        authVip.setBeginTime(beginTime);
-        authVip.setUpdateTime(new Date());
-        Calendar cal = Calendar.getInstance();
-        cal.setTime(beginTime);
-        // 查询认证通会员套餐信息
-        AuthVipPackagePo packagePo = payOrderMapper.getAuthVipPackageById(vipId);
-        cal.add(1 == packagePo.getUnit() ? Calendar.MONTH : Calendar.YEAR, packagePo.getDuration());
-        authVip.setEndTime(cal.getTime());
-        authVip.setDelFlag(0);
-        if (null != authVip.getId()) {
-            // 更新会员信息
-            payOrderMapper.updateAuthVipInfo(authVip);
-            if (authVip.getBeginTime().compareTo(beginTime) >= 0) {
-                // 删除原有角色关联
-                payOrderMapper.deleteAuthVipRoleRelation(userId);
-                // 会员过期重新分配角色
-                saveRoleRelation(userId, "1");
-            }
-        } else {
-            // 新增会员信息
-            payOrderMapper.insertAuthVipInfo(authVip);
-            // 删除原有角色关联
-            payOrderMapper.deleteAuthVipRoleRelation(userId);
-            // 分配角色
-            saveRoleRelation(userId, "1");
-        }
-        // 修改会员历史记录支付状态
-        VipRecordBo record = payOrderMapper.getAuthVipRecord(recordId);
-        record.setPayStatus(1);
-        record.setBeginTime(beginTime);
-        record.setEndTime(cal.getTime());
-        record.setPayWay(1);
-        record.setPayType(payType);
-        record.setPayTime(new Date());
-        payOrderMapper.updateAuthVipRecord(record);
-        // 修改支付链接状态
-        OrderPayLinkVo orderPayLink = payOrderMapper.getAuthVipPayLink(recordId, amount);
-        if (null != orderPayLink && (12 == payType || 17 == payType)) {
-            orderPayLink.setPayStatus(1);
-            payOrderMapper.updateOrderPayLinkStatus(orderPayLink);
-        }
-        Date date = new Date();
-        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
-        // 保存收款记录
-        DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
-        discernReceipt.setPayWay(1);
-        discernReceipt.setPayType(record.getPayType());
-        discernReceipt.setReceiptType(9);
-        discernReceipt.setReceiptStatus(3);
-        discernReceipt.setReceiptAmount(amount);
-        discernReceipt.setConfirmType(4);
-        discernReceipt.setRePayFlag(1);
-        discernReceipt.setFormData(payFormData);
-        discernReceipt.setReceiptDate(curDateStr);
-        discernReceipt.setConfirmDate(curDateStr);
-        discernReceipt.setReviewDate(curDateStr);
-        discernReceipt.setUpdateDate(curDateStr);
-        discernReceipt.setDelFlag(0);
-        // 保存 收款记录
-        baseMapper.insertDiscernReceipt(discernReceipt);
-        log.info("【开通认证通会员异步回调】>>>>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",vipRecordId:" + recordId);
-        // 收款项和订单关系表
-        OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
-        relation.setReceiptId(discernReceipt.getId());
-        relation.setAuthVipRecordId(recordId);
-        relation.setAssociateAmount(amount);
-        relation.setMbOrderId(mbOrderId);
-        relation.setOrderRequestNo(orderRequestNo);
-        relation.setSplitStatus(1);
-        relation.setRelationType(3);
-        relation.setDelFlag(0);
-        // 保存 收款项和订单关系
-        baseMapper.insertOrderReceiptRelation(relation);
-        log.info("【开通认证通会员异步回调】>>>>>>>>>>>收款项和购买历史关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",vipRecordId:" + recordId);
-        //修改分账付款状态
-        payOrderMapper.updateSplitAccountByPay(mbOrderId);
+        authVipStatusCheck(userId, vipId, recordId, payType, amount, payFormData, mbOrderId, orderRequestNo, null);
         return "SUCCESS";
     }
 
@@ -2020,6 +1827,94 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         return ResponseJson.success("抵扣成功!", null);
     }
 
+    @Override
+    public String quickCallback(QuickPayConfirmPayResponseVo res) {
+        try {
+            if (MessageHandle.checkSign(res)) {
+                if ("SUCCESS".equals(res.getRt9_orderStatus())) {
+                    log.info("快捷支付付款成功============================> res:" + res);
+                    /**
+                     * 验签通过 查看交易状态码是否成功,是则继续业务逻辑
+                     * 保存身份证,银行卡,姓名,银行编码, 合利宝绑定ip 若已经存在,则不保存
+                     */
+                    checkUnOrderStatus(res);
+                    return "SUCCESS";
+                } else {
+                    log.info("快捷支付付款状态异常============================> res:" + res);
+                }
+            } else {
+                log.info("快捷支付回调验签失败=========================> res:" + res);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private void checkUnOrderStatus(QuickPayConfirmPayResponseVo res) {
+        /**
+         *  超级会员
+         *  orderId = "VP" + "_" +record.getPackageId() + "_" + record.getUserId() + "_" + heliDto.getVipRecordId() + "_" + infoId + "_" + time;
+         *  认证通会员
+         *  orderId ="AVP" + "_" + record.getPackageId() + "_" + record.getUserId() + "_" + heliDto.getVipRecordId() + "_" + infoId + "_" + time;
+         *  优惠券
+         *  orderId ="CP" + "_" + heliDto.getCouponId() + "_" + heliDto.getUserId() + "_" + heliDto.getCouponRecordId()
+         *              + "_" + heliDto.getSource()  + "_" + infoId  + "_" + time;
+         */
+        String orderId = res.getRt5_orderId();
+        boolean vp = orderId.startsWith("VP");
+        boolean avp = orderId.startsWith("AVP");
+        boolean cp = orderId.startsWith("CP");
+        String mbOrderId = res.getRt5_orderId();
+        String orderRequestNo = res.getRt6_serialNumber();
+        Double amount = Double.valueOf(res.getRt8_orderAmount());
+        String formData = JSON.toJSONString(res);
+        Integer infoId = 0;
+        // 借记卡29,贷记卡30
+        Integer payType = "DEBIT".equals(res.getRt12_onlineCardType()) ? 29 : 30;
+        if (vp) {
+            /**
+             * Integer userId, Integer packageId, Integer payType, Integer recordId,
+             * Double amount, String payFormData, String mbOrderId, String orderRequestNo
+             */
+            String[] s = orderId.split("_");
+            Integer packageId = Integer.valueOf(s[1]);
+            Integer userId = Integer.valueOf(s[2]);
+            Integer recordId = Integer.valueOf(s[3]);
+            infoId = Integer.valueOf(s[4]);
+            superVipStatusCheck(userId, packageId, payType, recordId, amount, formData, mbOrderId, orderRequestNo, infoId);
+        } else if (avp) {
+            /**
+             * Integer userId, Integer vipId, Integer recordId, Integer payType, Double amount,
+             * String payFormData, String mbOrderId, String orderRequestNo
+             */
+            String[] s = orderId.split("_");
+            Integer packageId = Integer.valueOf(s[1]);
+            Integer userId = Integer.valueOf(s[2]);
+            Integer recordId = Integer.valueOf(s[3]);
+            infoId = Integer.valueOf(s[4]);
+            authVipStatusCheck(userId, packageId, recordId, payType, amount, formData, mbOrderId, orderRequestNo, infoId);
+        } else if (cp) {
+            /**
+             * Integer source, Integer userId, Integer couponId, Integer recordId, Integer payType,
+             * Double amount, String payFormData, String mbOrderId, String orderRequestNo
+             */
+            String[] s = orderId.split("_");
+            Integer userId = Integer.valueOf(s[2]);
+            Integer couponId = Integer.valueOf(s[1]);
+            Integer recordId = Integer.valueOf(s[3]);
+            Integer source = Integer.valueOf(s[4]);
+            infoId = Integer.valueOf(s[5]);
+            couponPayCheck(source, userId, couponId, recordId, payType, amount, formData, mbOrderId, orderRequestNo, infoId);
+        }
+        // quickInfo 信息填充
+        String bankCode = res.getRt11_bankId();
+        Integer bankType = "DEBIT".equals(res.getRt12_onlineCardType()) ? 1 : 2;
+        payOrderMapper.updateQuickInfo(bankCode, bankType, infoId);
+        String userId = res.getRt14_userId().substring(1);
+        payOrderMapper.insertBindId(res.getRt10_bindId(), res.getRt4_customerNumber(), userId, infoId);
+    }
+
     public void saveRoleRelation(Integer userId, String roleIds) {
         if (StringUtils.isNotEmpty(roleIds)) {
             // 设置用户角色

+ 491 - 23
src/main/java/com/caimei365/order/service/impl/HeliPayServiceImpl.java

@@ -11,6 +11,7 @@ import com.caimei365.order.mapper.OrderCommonMapper;
 import com.caimei365.order.mapper.PayOrderMapper;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.bo.PayParamBo;
+import com.caimei365.order.model.dto.BankListDto;
 import com.caimei365.order.model.dto.HeliDto;
 import com.caimei365.order.model.enums.AccountPayOrderType;
 import com.caimei365.order.model.enums.AppPayType;
@@ -22,13 +23,12 @@ import com.caimei365.order.service.HeliPayService;
 import com.caimei365.order.service.RemoteCallService;
 import com.caimei365.order.utils.ImageUtil;
 import com.caimei365.order.utils.MathUtil;
-import com.caimei365.order.utils.PayUtil;
 import com.caimei365.order.utils.helipay.Disguiser;
 import com.caimei365.order.utils.helipay.HttpClientService;
+import com.caimei365.order.utils.helipay.MessageHandle;
 import com.caimei365.order.utils.helipay.MyBeanUtils;
-import com.caimei365.order.utils.pay.RSAUtil;
+import com.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpStatus;
 import org.springframework.beans.BeanUtils;
@@ -36,8 +36,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.http.HttpHeaders;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
-import org.springframework.web.servlet.ModelAndView;
-import springfox.documentation.spring.web.json.Json;
 
 import javax.annotation.Resource;
 import java.beans.IntrospectionException;
@@ -45,8 +43,6 @@ import java.io.IOException;
 import java.lang.reflect.Field;
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
-import java.security.NoSuchAlgorithmException;
-import java.security.spec.InvalidKeySpecException;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -216,23 +212,66 @@ public class HeliPayServiceImpl implements HeliPayService {
         }
         // 订单状态 INIT:已接收 DOING:处理中 SUCCESS:成功 FAIL:失败 CLOSE:关闭 CANCEL:撤销
         String orderStatus = res.getRt4_status();
-        // 平台唯一流水号
-        String mbOrderId = res.getRt3_systemSerial();
-        // 商户唯一订单号
-        String orderRequestNo = res.getRt2_orderId();
-        // 本次支付金额,以元为单位
-        Double amount = Double.valueOf(res.getRt5_orderAmount());
         log.info("【支付异步回调】>>>>>>>>>>>>>>支付订单状态:" + orderStatus);
         if (!"SUCCESS".equals(orderStatus)) {
             return "支付失败";
         }
-        String[] split = res.getRt8_desc().split(",");
-        //0位置订单id
-        Integer orderId = Integer.valueOf(split[0]);
-        //1位置支付类型
-        String payType = split[1];
-        //2位置子订单id
-        Integer shopOrderId = Integer.valueOf(split[2]);
+        String s = checkOrderStatus(res, 1);
+        if ("SUCCESS".equals(s)) {
+            return "SUCCESS";
+        }
+        return null;
+    }
+
+    /**
+     * 1 其他支付,2快捷支付
+     *
+     * @param o
+     * @param status
+     * @return
+     */
+    public String checkOrderStatus(Object o, Integer status) {
+        // 平台唯一流水号
+        String mbOrderId = "";
+        String orderRequestNo = "";
+        Double amount = null;
+        Integer orderId = null;
+        String payType = "";
+        Integer shopOrderId = null;
+        Integer infoId = null;
+        if (1 == status) {
+            NotifyResponseVo res = (NotifyResponseVo) o;
+            mbOrderId = res.getRt3_systemSerial();
+            // 商户唯一订单号
+            orderRequestNo = res.getRt2_orderId();
+            // 本次支付金额,以元为单位
+            amount = Double.valueOf(res.getRt5_orderAmount());
+            String[] split = res.getRt8_desc().split(",");
+            //0位置订单id
+            orderId = Integer.valueOf(split[0]);
+            //1位置支付类型
+            payType = split[1];
+            //2位置子订单id
+            shopOrderId = Integer.valueOf(split[2]);
+        } else {
+            QuickPayConfirmPayResponseVo res = (QuickPayConfirmPayResponseVo) o;
+            orderRequestNo = res.getRt5_orderId();
+            mbOrderId = res.getRt6_serialNumber();
+            amount = Double.valueOf(res.getRt8_orderAmount());
+            String[] s = orderRequestNo.split("_");
+            //  orderId = order.getOrderNo() + "_" + order.getOrderId() + "_" + heliDto.getShopOrderId() + "_" + infoId;
+            orderId = Integer.valueOf(s[1]);
+            shopOrderId = Integer.valueOf(s[2]);
+            //infoId
+            infoId = Integer.valueOf(s[3]);
+            String bankCode = res.getRt11_bankId();
+            Integer bankType = "DEBIT".equals(res.getRt12_onlineCardType()) ? 1 : 2;
+            payOrderMapper.updateQuickInfo(bankCode, bankType, infoId);
+            String userId = res.getRt14_userId().substring(1);
+            // 快捷支付借记卡支付29,快捷支付贷记卡支付30
+            payType = 1 == bankType ? "29" : "30";
+            payOrderMapper.insertBindId(res.getRt10_bindId(), res.getRt4_customerNumber(), userId, infoId);
+        }
         // 订单信息
         OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
         ShopOrderVo shopOrder = orderCommonMapper.getShopOrderByOrderId(shopOrderId);
@@ -294,7 +333,6 @@ public class HeliPayServiceImpl implements HeliPayService {
         // 更新订单支付状态
         payOrderMapper.updateOrderStatus(order);
         // 支付记录
-        //todo sql的or条件子订单返佣????
         List<DiscernReceiptVo> shopOrderDiscernReceiptList = orderCommonMapper.getShopOrderDiscernReceipt(shopOrderId);
         double shopOrderReceiptAmount = 0d;
         if (null != shopOrderDiscernReceiptList && shopOrderDiscernReceiptList.size() > 0) {
@@ -319,12 +357,16 @@ public class HeliPayServiceImpl implements HeliPayService {
         discernReceipt.setReceiptAmount(amount);
         discernReceipt.setConfirmType(4);
         discernReceipt.setRePayFlag(1);
-        discernReceipt.setFormData(JSONObject.toJSONString(res));
+        discernReceipt.setFormData(JSONObject.toJSONString(o));
         discernReceipt.setReceiptDate(curDateStr);
         discernReceipt.setConfirmDate(curDateStr);
         discernReceipt.setReviewDate(curDateStr);
         discernReceipt.setUpdateDate(curDateStr);
         discernReceipt.setDelFlag(0);
+        if (2 == status) {
+            //快捷支付回调,存入支付银行卡信息infoId
+            discernReceipt.setInfoId(infoId);
+        }
         // 保存 收款记录
         baseMapper.insertDiscernReceipt(discernReceipt);
         log.info("【支付异步回调】>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",orderId:" + orderId);
@@ -1161,7 +1203,7 @@ public class HeliPayServiceImpl implements HeliPayService {
                     if (null != promotions) {
                         if (1 == promotions.getType() && 1 == promotions.getMode()) {
                             //单品优惠价的时候取当前sku的touchprice
-                            promotions.setTouchPrice(baseMapper.getTouchPriceBySku(orderProduct.getSkuId(),promotions.getId()));
+                            promotions.setTouchPrice(baseMapper.getTouchPriceBySku(orderProduct.getSkuId(), promotions.getId()));
                         }
                         if (taxFlag && Integer.valueOf(1).equals(promotions.getType()) && Integer.valueOf(1).equals(promotions.getMode())) {
                             promotions.setTouchPrice(MathUtil.add(promotions.getTouchPrice(), MathUtil.div(MathUtil.mul(promotions.getTouchPrice(), orderProduct.getTaxRate()), 100)).doubleValue());
@@ -1242,6 +1284,432 @@ public class HeliPayServiceImpl implements HeliPayService {
         return null;
     }
 
+    @Override
+    public ResponseJson<Map<String, String>> quickPay(HeliDto heliDto, HttpHeaders headers) {
+        FirstQuickPayVo firstQuickPayVo = new FirstQuickPayVo();
+        log.info("helidto------------" + heliDto);
+        heliPayUtil.setQuickValue(heliDto, firstQuickPayVo, headers);
+        if (Double.parseDouble(firstQuickPayVo.getP15_orderAmount()) <= 0.1) {
+            return ResponseJson.error("订单支付金额不能小于最低手续费!");
+        }
+        Map reqestMap = null;
+        try {
+            reqestMap = MessageHandle.getReqestMap(firstQuickPayVo);
+            log.info("首次支付下单请求参数:" + reqestMap);
+            Map<String, Object> resultMap = HttpClientService.getHttpResp(reqestMap, Constant.REQUEST_URL_QUICKPAY);
+            log.info("首次支付下单响应结果:" + resultMap);
+            String resultMsg = (String) resultMap.get("response");
+            if ((Integer) resultMap.get("statusCode") != org.apache.commons.httpclient.HttpStatus.SC_OK) {
+                //状态码不对请求失败
+                log.info("-----------------请求失败------------------");
+                return ResponseJson.error("请求失败");
+            }
+            if (!MessageHandle.isJSON(resultMsg)) {
+                //状态码不对请求失败
+                log.info("-----------------交易失败------------------");
+                return ResponseJson.error("交易失败");
+            }
+            QuickPayCreateOrderResponseVo responseVo = JSONObject.parseObject(resultMsg, QuickPayCreateOrderResponseVo.class);
+            if (!MessageHandle.checkSign(responseVo)) {
+                log.info("-----------------验签失败------------------");
+                return ResponseJson.error("验签失败");
+            }
+            if (!"0000".equals(responseVo.getRt2_retCode()) || "FAIL".equals(responseVo.getSmsStatus())) {
+                log.info("交易失败-------------->" + responseVo.getRt3_retMsg());
+                return ResponseJson.error(responseVo.getRt3_retMsg());
+            }
+
+//            /**
+//             * 手动发短信
+//             */
+//            FirstPaySendValidateCodeVo sendVo = new FirstPaySendValidateCodeVo();
+//            sendVo.setP1_bizType("FirstPaySendValidateCode");
+//            sendVo.setP2_customerNumber(firstQuickPayVo.getP2_customerNumber());
+//            sendVo.setP3_orderId(firstQuickPayVo.getP4_orderId());
+//            sendVo.setP4_timestamp(firstQuickPayVo.getP5_timestamp());
+//            sendVo.setSignatureType("SM3WITHSM2");
+//            Map req = MessageHandle.getReqestMap(sendVo);
+//            Map<String, Object> reqMap = HttpClientService.getHttpResp(req, Constant.REQUEST_URL_QUICKPAY);
+//            log.info("发送短信响应结果:" + reqMap);
+//            if ((Integer) resultMap.get("statusCode") != org.apache.commons.httpclient.HttpStatus.SC_OK) {
+//                log.info("发送短信请求失败!");
+//                return ResponseJson.error("发送短信请求失败!");
+//            }
+//            String reqMsg = (String) reqMap.get("response");
+//            QuickPaySendValidateCodeResponseVo respVo = JSONObject.parseObject(reqMsg, QuickPaySendValidateCodeResponseVo.class);
+//            if (!MessageHandle.checkSign(respVo)) {
+//                log.info("发送短信验签失败!");
+//                return ResponseJson.error("发送短信验签失败!");
+//            }
+//            if (!"0000".equals(respVo.getRt2_retCode())) {
+//                log.info("短信发送失败!");
+//                return ResponseJson.error("短信发送失败!");
+//            }
+
+
+            HashMap<String, String> map = new HashMap<>();
+            map.put("customer", responseVo.getRt4_customerNumber());
+            map.put("orderId", responseVo.getRt5_orderId());
+            return ResponseJson.success(map);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    @Override
+    public String quickPayCallback(QuickPayConfirmPayResponseVo res) {
+        try {
+            if (MessageHandle.checkSign(res)) {
+                if ("SUCCESS".equals(res.getRt9_orderStatus())) {
+                    log.info("快捷支付付款成功============================> res:" + res);
+                    /**
+                     * 验签通过 查看交易状态码是否成功,是则继续业务逻辑
+                     * 保存身份证,银行卡,姓名,银行编码, 合利宝绑定ip 若已经存在,则不保存
+                     */
+                    String s = checkOrderStatus(res, 2);
+                    if ("SUCCESS".equals(s)) {
+                        return "SUCCESS";
+                    }
+                } else {
+                    // 支付验证码校验失败删除银行卡信息
+                    log.info("快捷支付付款状态异常============================> res:" + res);
+                    delQuickInfo(res);
+                }
+            } else {
+                // 支付验证码校验失败删除银行卡信息
+                log.info("快捷支付回调验签失败=========================> res:" + res);
+                delQuickInfo(res);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    public void delQuickInfo(QuickPayConfirmPayResponseVo res) {
+        // 未成功删除cm_quickpay_info中预存的userInfo信息
+        String[] s = res.getRt5_orderId().split("_");
+        String infoId = s[3];
+        payOrderMapper.delQuickInfo(infoId);
+    }
+
+    @Override
+    public ResponseJson<Map<String, String>> bindBankCard(HeliDto heliDto) {
+        // 校验是否已绑
+        QuickInfoVo infoByBankNumber = payOrderMapper.findInfoByBankNumber(heliDto.getQuickPayBankNumber());
+        if (null != infoByBankNumber && null != infoByBankNumber.getId()) {
+            return ResponseJson.error("卡已绑定!");
+        }
+        log.info("helidto-------------" + heliDto);
+        QuickPayBindCardPreOrderVo confirmBindCardVo = new QuickPayBindCardPreOrderVo();
+        String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+        String orderId = "bd_" + heliDto.getUserId() + "_" + time;
+        confirmBindCardVo.setP1_bizType("QuickPayBindCardPreOrder");
+        //一次请求只能绑定一个e商户,暂定绑定网络,有支付请求走预下单直接绑定
+        confirmBindCardVo.setP2_customerNumber(CUSTOMERNUM2);
+        confirmBindCardVo.setP3_userId("U" + heliDto.getUserId());
+        confirmBindCardVo.setP4_orderId(orderId);
+        confirmBindCardVo.setP5_timestamp(time);
+        confirmBindCardVo.setP6_payerName(heliDto.getQuickPayUserName());
+        confirmBindCardVo.setP7_idCardType("IDCARD");
+        confirmBindCardVo.setP8_idCardNo(heliDto.getIdCard());
+        confirmBindCardVo.setP9_cardNo(heliDto.getQuickPayBankNumber());
+        if (StringUtils.isNotBlank(heliDto.getQuickPayBankExpireTime())) {
+            String[] split = heliDto.getQuickPayBankExpireTime().split("-");
+            confirmBindCardVo.setP10_year(split[0]);
+            confirmBindCardVo.setP11_month(split[1]);
+            confirmBindCardVo.setP12_cvv2(heliDto.getCvvCode());
+        }
+        confirmBindCardVo.setP13_phone(heliDto.getQuickPayMobile());
+        confirmBindCardVo.setProtocolType("protocol");
+        confirmBindCardVo.setSendValidateCode("true");
+        confirmBindCardVo.setSignatureType("SM3WITHSM2");
+        QuickInfoVo quick = new QuickInfoVo();
+        Map reqestMap = null;
+        Map<String, String> map = new HashMap<>();
+        try {
+            reqestMap = MessageHandle.getReqestMap(confirmBindCardVo);
+            Map<String, Object> resultMap = HttpClientService.getHttpResp(reqestMap, Constant.REQUEST_URL_QUICKPAY);
+            log.info("响应结果:" + resultMap);
+            if ((Integer) resultMap.get("statusCode") != org.apache.commons.httpclient.HttpStatus.SC_OK) {
+                log.info("请求失败--------------------");
+                return ResponseJson.error("请求失败!");
+            }
+            String resultMsg = (String) resultMap.get("response");
+            BindCardPreOrderResponseVo responseVo = JSONObject.parseObject(resultMsg, BindCardPreOrderResponseVo.class);
+            if (!MessageHandle.checkSign(responseVo)) {
+                log.info("验签失败");
+                return ResponseJson.error("验签失败!");
+            }
+            if (!"0000".equals(responseVo.getRt2_retCode())) {
+                log.info("短信发送失败------------------------");
+                return ResponseJson.error("短信发送失败!");
+            }
+            //绑定成功,存卡
+            quick.setBankNumber(heliDto.getQuickPayBankNumber());
+            quick.setBindMobile(heliDto.getQuickPayMobile());
+            quick.setUserId(heliDto.getUserId());
+            quick.setQuickPayUserId("U" + heliDto.getUserId());
+            quick.setIdCard(heliDto.getIdCard());
+            quick.setBankUserName(heliDto.getQuickPayUserName());
+            if (null != heliDto.getQuickPayBankExpireTime()) {
+                quick.setBankCvvCode(heliDto.getCvvCode());
+                quick.setBankExpireTime(heliDto.getQuickPayBankExpireTime());
+            }
+            payOrderMapper.insertQuickPayInfo(quick);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        map.put("orderId", orderId);
+        map.put("infoId", quick.getId().toString());
+        return ResponseJson.success(map);
+    }
+
+    @Override
+    public ResponseJson bindByCode(Integer flag, String bindCode, String orderId, String infoId, String customer) {
+        ConfirmBindCardVo confirmBindCardVo = new ConfirmBindCardVo();
+        Object response = new Object();
+        //绑卡ConfirmBindCard  首次支付FirstPayConfirmPay  flag 1绑卡2付款
+        if (1 == flag) {
+            confirmBindCardVo.setP1_bizType("ConfirmBindCard");
+            confirmBindCardVo.setP2_customerNumber(CUSTOMERNUM2);
+        } else {
+            confirmBindCardVo.setP1_bizType("FirstPayConfirmPay");
+            confirmBindCardVo.setP2_customerNumber(CUSTOMERNUM);
+        }
+        if (StringUtils.isNotBlank(customer)) {
+            //下单商户号随动
+            confirmBindCardVo.setP2_customerNumber(customer);
+        }
+        confirmBindCardVo.setP3_orderId(orderId);
+        confirmBindCardVo.setP4_timestamp(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
+        confirmBindCardVo.setP5_validateCode(bindCode);
+        confirmBindCardVo.setSignatureType("SM3WITHSM2");
+        Map reqestMap = null;
+        try {
+            log.info("验证码发送参数---------------------" + confirmBindCardVo);
+            reqestMap = MessageHandle.getReqestMap(confirmBindCardVo);
+            Map<String, Object> resultMap = HttpClientService.getHttpResp(reqestMap, Constant.REQUEST_URL_QUICKPAY);
+            log.info("响应结果:" + resultMap);
+            if ((Integer) resultMap.get("statusCode") != org.apache.commons.httpclient.HttpStatus.SC_OK) {
+                log.info("--------------请求失败----------------");
+                //失败删除info
+                payOrderMapper.delQuickInfo(infoId);
+                return ResponseJson.error("请求失败");
+            }
+            String resultMsg = (String) resultMap.get("response");
+            if (MessageHandle.isJSON(resultMsg)) {
+                //失败删除info
+                payOrderMapper.delQuickInfo(infoId);
+                log.info("-------------------验证码校验失败!------------------");
+                return ResponseJson.error("验证码校验失败!");
+            }
+            if (1 == flag) {
+                response = JSONObject.parseObject(resultMsg, ConfirmBindCardResponseVo.class);
+            } else {
+                response = JSONObject.parseObject(resultMsg, QuickPayConfirmPayResponseVo.class);
+            }
+            if (!MessageHandle.checkSign(response)) {
+                //失败删除info
+                payOrderMapper.delQuickInfo(infoId);
+                log.info("------------验签失败---------------");
+                return ResponseJson.error("验签失败!");
+            }
+            if (1 == flag) {
+                ConfirmBindCardResponseVo res = (ConfirmBindCardResponseVo) response;
+                // 8015短信验证码错误或已过期
+                if ("8015".equals(res.getRt2_retCode())) {
+                    return ResponseJson.error(-2, res.getRt3_retMsg());
+                } else if (!"0000".equals(res.getRt2_retCode())) {
+                    //失败删除info
+                    payOrderMapper.delQuickInfo(infoId);
+                    log.info("------------绑定失败---------------");
+                    return ResponseJson.error("绑定失败!");
+                }
+                /**
+                 *  绑卡接口返回值无银行卡类型 需要查询绑卡信息
+                 */
+                BindCardQueryVo bindCardQueryVo = new BindCardQueryVo();
+                bindCardQueryVo.setP1_bizType("BankCardbindList");
+                bindCardQueryVo.setP2_customerNumber(confirmBindCardVo.getP2_customerNumber());
+                bindCardQueryVo.setP3_userId(res.getRt5_userId());
+                bindCardQueryVo.setP4_bindId(res.getRt10_bindId());
+                bindCardQueryVo.setP5_timestamp(new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()));
+                bindCardQueryVo.setSignatureType("SM3WITHSM2");
+                BindCardQueryResponseVo bindCardInfo = getBindCardInfo(bindCardQueryVo);
+                ObjectMapper objectMapper = new ObjectMapper();
+                List<Map<String, String>> objectList = objectMapper.readValue(bindCardInfo.getRt5_bindCardList(), List.class);
+                AtomicReference<String> cartType = new AtomicReference<>("");
+                objectList.forEach(o -> cartType.set(o.get("cardType")));
+                Integer bankType = "DEBIT".equals(cartType.get()) ? 1 : 2;
+                log.info("cartType---------" + cartType.get().toString());
+                /**
+                 *  绑卡修改剩余信息
+                 */
+                payOrderMapper.updateQuickInfo(res.getRt8_bankId(), bankType, Integer.valueOf(infoId));
+                payOrderMapper.insertBindId(res.getRt10_bindId(), res.getRt4_customerNumber(), res.getRt5_userId().substring(1), Integer.valueOf(infoId));
+            } else {
+                QuickPayConfirmPayResponseVo res = (QuickPayConfirmPayResponseVo) response;
+                String[] s = res.getRt5_orderId().split("_");
+                boolean vp = orderId.startsWith("VP");
+                boolean avp = orderId.startsWith("AVP");
+                boolean cp = orderId.startsWith("CP");
+                if (vp || avp) {
+                    infoId = s[4];
+                } else if (cp) {
+                    infoId = s[5];
+                } else {
+                    infoId = s[3];
+                }
+                // 8015短信验证码错误或已过期
+                if ("8015".equals(res.getRt2_retCode())) {
+                    payOrderMapper.delQuickInfo(infoId);
+                    log.info("------------下单支付验证码错误或过期---------------");
+                    return ResponseJson.error(-2, res.getRt3_retMsg());
+                } else if (!"0000".equals(res.getRt2_retCode())) {
+                    payOrderMapper.delQuickInfo(infoId);
+                    // 下单支付在回调中修改绑卡信息
+                    log.info("------------下单支付验证码校验失败---------------");
+                    return ResponseJson.error(res.getRt3_retMsg());
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ResponseJson.success();
+    }
+
+    public BindCardQueryResponseVo getBindCardInfo(BindCardQueryVo bindCardQueryVo) {
+        try {
+            Map reqestMap = MessageHandle.getReqestMap(bindCardQueryVo);
+            Map<String, Object> resultMap = HttpClientService.getHttpResp(reqestMap, Constant.REQUEST_URL_QUICKPAY);
+            log.info("响应结果:" + resultMap);
+            if ((Integer) resultMap.get("statusCode") != org.apache.commons.httpclient.HttpStatus.SC_OK) {
+                log.info("请求失败");
+            }
+            String resultMsg = (String) resultMap.get("response");
+            BindCardQueryResponseVo responseVo = JSONObject.parseObject(resultMsg, BindCardQueryResponseVo.class);
+            if (!MessageHandle.checkSign(responseVo)) {
+                log.info("验签失败");
+            }
+            return responseVo;
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.info("交易异常:" + e.getMessage());
+        }
+        return null;
+    }
+
+    @Override
+    public ResponseJson<List<BankListDto>> bankInfos(Integer cardType) {
+        List<String> ins = payOrderMapper.findQuickBankInitial(cardType);
+        List<BankListDto> bankList = new ArrayList<>();
+        ins.forEach(i -> {
+            BankListDto bankListDto = new BankListDto();
+            bankListDto.setInitial(i);
+            bankListDto.setBanks(payOrderMapper.findQuickBank(cardType, i));
+            bankList.add(bankListDto);
+        });
+        return ResponseJson.success(bankList);
+    }
+
+    @Override
+    public ResponseJson unBoundCard(Integer cardId) {
+//        BankCardUnbindVo unbind = new BankCardUnbindVo();
+        QuickInfoVo info = payOrderMapper.getQuickInfoById(cardId);
+        if (null == info) {
+            return ResponseJson.error("当前卡不存在!");
+        }
+//        String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+//        unbind.setP1_bizType("BankCardUnbind");
+//        unbind.setP2_customerNumber(info.getCustomer());
+//        unbind.setP3_userId(info.getQuickPayUserId());
+//        unbind.setP4_bindId(info.getQuickPaybindId());
+//        unbind.setP5_orderId("ub_" + time + cardId);
+//        unbind.setP6_timestamp(time);
+//        unbind.setSignatureType("SM3WITHSM2");
+//        try {
+//            Map reqestMap = MessageHandle.getReqestMap(unbind);
+//            Map<String, Object> resultMap = HttpClientService.getHttpResp(reqestMap, REQUEST_URL_QUICKPAY);
+//            log.info("响应结果:" + resultMap);
+//            if ((Integer) resultMap.get("statusCode") != org.apache.commons.httpclient.HttpStatus.SC_OK) {
+//                log.info("----------------解绑银行卡请求失败-----------------");
+//                return ResponseJson.error("请求失败!");
+//            }
+//            String resultMsg = (String) resultMap.get("response");
+//            BankCardUnbindResponseVo responseVo = JSONObject.parseObject(resultMsg, BankCardUnbindResponseVo.class);
+//            if (!MessageHandle.checkSign(responseVo)) {
+//                log.info("------------------------解绑银行卡验签失败-------------------");
+//                return ResponseJson.error("解绑银行卡验签失败!");
+//            }
+//            if (!"0000".equals(responseVo.getRt2_retCode())) {
+//                log.info("-----------------银行卡解绑失败---------------------");
+//                return ResponseJson.error("银行卡解绑失败!");
+//            }
+        // 解绑成功 cm_quickpay_info置为删除
+        payOrderMapper.delQuickInfo(cardId.toString());
+//            payOrderMapper.delQuickBindId(info.getQuickPaybindId());
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//            log.info("交易异常:" + e.getMessage());
+//        }
+        return ResponseJson.success("解绑成功");
+    }
+
+    @Override
+    public ResponseJson<String> bindCardNoCode(HeliDto heliDto) {
+        OnceBindCardVo once = new OnceBindCardVo();
+        once.setP1_bizType("QuickBindCard");
+        once.setP2_customerNumber("E1807062884");
+        once.setP3_userId("U" + heliDto.getUserId());
+        String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+        once.setP4_orderId("bind_" + time + "_" + heliDto.getUserId());
+        once.setP5_timestamp(time);
+        once.setP6_payerName(heliDto.getQuickPayUserName());
+        once.setP7_idCardType("IDCARD");
+        once.setP8_idCardNo(heliDto.getIdCard());
+        once.setP9_phone(heliDto.getQuickPayMobile());
+        once.setP10_bankId(heliDto.getBankCode());
+        String cardType = 1 == heliDto.getCardType() ? "DEBIT" : "CREDIT";
+        once.setP11_onlineCardType(cardType);
+        once.setP12_serverCallbackUrl("http://localhost:8080/manager/text");
+        once.setP13_bankRdrctToMchUrl("www.caimei365.com");
+        once.setSignatureType("MD5WITHRSA");
+        Map reqestMap = null;
+        String html = "";
+        try {
+            reqestMap = MessageHandle.getReqestMap(once);
+            log.info("请求参数:" + reqestMap);
+            Map<String, Object> resultMap = HttpClientService.getHttpResp(reqestMap, REQUEST_URL_QUICKPAY);
+            log.info("响应结果:" + resultMap);
+            if ((Integer) resultMap.get("statusCode") != org.apache.commons.httpclient.HttpStatus.SC_OK) {
+                log.info("请求失败");
+            }
+            String resultMsg = (String) resultMap.get("response");
+            OnceBindResponseVo responseVo = JSONObject.parseObject(resultMsg, OnceBindResponseVo.class);
+            if (!MessageHandle.checkSign(responseVo)) {
+                log.info("验签失败");
+            }
+            if (!"0000".equals(responseVo.getRt2_retCode())) {
+                log.info(responseVo.getRt3_retMsg());
+            }
+            html = responseVo.getRt5_formData();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ResponseJson.success(html);
+    }
+
+    @Override
+    public ResponseJson<List<QuickBankVo>> unCodeInfos() {
+        /**
+         * 快捷支付免密绑卡支持银行
+         */
+        List<QuickBankVo> banks = payOrderMapper.findUnCodeBanks();
+        return ResponseJson.success(banks);
+    }
+
     public static <T> T postForm(Map<String, String> params, String url, String sign, Class<T> clazz) {
         FormBody.Builder builder = new FormBody.Builder();
         for (Map.Entry<String, String> entry : params.entrySet()) {

+ 20 - 8
src/main/java/com/caimei365/order/service/impl/OrderClubServiceImpl.java

@@ -5,10 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.components.OrderCommonService;
 import com.caimei365.order.components.ProductService;
 import com.caimei365.order.components.WeChatService;
-import com.caimei365.order.mapper.AddressMapper;
-import com.caimei365.order.mapper.BaseMapper;
-import com.caimei365.order.mapper.OrderClubMapper;
-import com.caimei365.order.mapper.OrderCommonMapper;
+import com.caimei365.order.mapper.*;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.enums.OrderStatus;
 import com.caimei365.order.model.po.*;
@@ -64,6 +61,8 @@ public class OrderClubServiceImpl implements OrderClubService {
     private OrderCommonService orderCommonService;
     @Resource
     private WeChatService weChatService;
+    @Resource
+    private PayOrderMapper payOrderMapper;
 
     /**
      * 获取各状态订单数量
@@ -257,6 +256,19 @@ public class OrderClubServiceImpl implements OrderClubService {
         Double availableMoney = baseMapper.getAbleUserMoney(userId);
         // 付款金额
         List<DiscernReceiptVo> discernReceiptList = orderCommonService.getDiscernReceiptAndSetOrder(order);
+        if (null != discernReceiptList && discernReceiptList.size() > 0) {
+            discernReceiptList.forEach(d -> {
+                if (29 == d.getPayType() || 30 == d.getPayType()) {
+                    //快捷支付借记卡支付29,快捷支付贷记卡支付30
+                    Integer infoId = d.getInfoId();
+                    QuickInfoVo v = payOrderMapper.findInfoById(infoId);
+                    String cardType = "1".equals(v.getBankType()) ? "借记卡" : "信用卡";
+                    String substring = v.getBankNumber().substring(v.getBankNumber().length() - 4);
+                    String cardStr = v.getBankName() + cardType + "(" + substring + ")";
+                    d.setQuickPayStr(cardStr);
+                }
+            });
+        }
         // 退款记录
         List<ReturnedPurchaseVo> returnedPurchaseList = orderClubMapper.getReturnedPurchaseList(order.getOrderId());
         if (!returnedPurchaseList.isEmpty()) {
@@ -486,13 +498,13 @@ public class OrderClubServiceImpl implements OrderClubService {
     /**
      * 机构取消订单
      *
-     * @param orderId 订单Id
-     * @param userIdentity  用户身份 1协销 其他用户
-     * @param remark  备注(订单取消原因)
+     * @param orderId      订单Id
+     * @param userIdentity 用户身份 1协销 其他用户
+     * @param remark       备注(订单取消原因)
      */
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public ResponseJson<Void> cancelMainOrder(Integer orderId,Integer userIdentity, String remark) {
+    public ResponseJson<Void> cancelMainOrder(Integer orderId, Integer userIdentity, String remark) {
         OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
         boolean cancelFlag = (null != order && (OrderStatus.UNCONFIRMED.getCode() == order.getStatus() || OrderStatus.UNRECEIVED_AND_UNSHIPPED.getCode() == order.getStatus()));
         if (!cancelFlag) {

+ 11 - 2
src/main/java/com/caimei365/order/service/impl/PayOrderServiceImpl.java

@@ -704,6 +704,15 @@ public class PayOrderServiceImpl implements PayOrderService {
                 if (null != discernReceipt.getPayType()) {
                     discernReceipt.setPayTypeStr(ReceivablesType.getReceivablesType(discernReceipt.getPayType()));
                 }
+                if (29 == discernReceipt.getPayType() || 30 == discernReceipt.getPayType()) {
+                    //快捷支付借记卡支付29,快捷支付贷记卡支付30
+                    Integer infoId = discernReceipt.getInfoId();
+                    QuickInfoVo v = payOrderMapper.findInfoById(infoId);
+                    String cardType = "1".equals(v.getBankType()) ? "借记卡" : "信用卡";
+                    String substring = v.getBankNumber().substring(v.getBankNumber().length() - 4);
+                    String cardStr = v.getBankName() + cardType + "(" + substring + ")";
+                    discernReceipt.setQuickPayStr(cardStr);
+                }
             });
             if (offlineFlag.get()) {
                 return ResponseJson.error("已经线下支付过,只能线下支付!", null);
@@ -764,8 +773,8 @@ public class PayOrderServiceImpl implements PayOrderService {
 //            B2BpayFlag = 1;
 //        }
         Map<String, Object> map = new HashMap<>();
-        if(onlinePay!=1){
-            map.put("onlinePayWays",orderCommonMapper.findOnlinePayWays(shopOrderId));
+        if (onlinePay != 1) {
+            map.put("onlinePayWays", orderCommonMapper.findOnlinePayWays(shopOrderId));
         }
 //        map.put("B2BpayFlag", B2BpayFlag);
         map.put("userName", userName);

+ 7 - 3
src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java

@@ -1226,6 +1226,7 @@ public class SubmitServiceImpl implements SubmitService {
                         onlinePay.set(false);
                     } else {
                         double WXCharge = MathUtil.mul(realPay, 0.0065, 2).doubleValue();
+                        double QuickCharge = MathUtil.mul(realPay, 0.006, 2).doubleValue();
                         double AliCharge = MathUtil.mul(realPay, 0.0025, 2).doubleValue();
                         double B2CCharge = MathUtil.mul(realPay, 0.002, 2).doubleValue();
                         //佣金和手续费比较,佣金>手续费则可以走当前支付渠道
@@ -1235,9 +1236,10 @@ public class SubmitServiceImpl implements SubmitService {
                         payWays += bro >= AliCharge ? ",2" : "";
                         payWays += bro >= B2CCharge ? ",3" : "";
                         payWays += bro >= 10 ? ",4" : "";
+                        payWays += bro >= QuickCharge ? ",5" : "";
                         //小于所有的情况下线下补手续费,开放所有渠道
                         if ("".equals(payWays)) {
-                            payWays = "1,2,3,4";
+                            payWays = "1,2,3,4,5";
                         }
                         shopOrderList.get(i).setOnlinePayWays(payWays);
                     }
@@ -1257,6 +1259,7 @@ public class SubmitServiceImpl implements SubmitService {
                         onlinePay.set(false);
                     } else {
                         double WXCharge = MathUtil.mul(realPay, 0.0065, 2).doubleValue();
+                        double QuickCharge = MathUtil.mul(realPay, 0.006, 2).doubleValue();
                         double AliCharge = MathUtil.mul(realPay, 0.0025, 2).doubleValue();
                         double B2CCharge = MathUtil.mul(realPay, 0.002, 2).doubleValue();
                         //佣金和手续费比较,佣金>手续费则可以走当前支付渠道
@@ -1266,9 +1269,10 @@ public class SubmitServiceImpl implements SubmitService {
                         payWays += bro >= AliCharge ? ",2" : "";
                         payWays += bro >= B2CCharge ? ",3" : "";
                         payWays += bro >= 10 ? ",4" : "";
+                        payWays += bro >= QuickCharge ? ",5" : "";
                         //小于所有的情况下线下补手续费,开放所有渠道
                         if ("".equals(payWays)) {
-                            payWays = "1,2,3,4";
+                            payWays = "1,2,3,4,5";
                         }
                         so.setOnlinePayWays(payWays);
                     }
@@ -1630,7 +1634,7 @@ public class SubmitServiceImpl implements SubmitService {
                             return ResponseJson.error(-5, "采购金额过小,将扣除500采美豆,建议您使用微信扫描以下二维码,进入采美旗下“呵呵商城”小程序购买小额商品。");
                         }
                     }
-                    log.info("订单提交状态:"+orderParamBo.getOrderMiniType());
+                    log.info("订单提交状态:" + orderParamBo.getOrderMiniType());
                     UserBeansHistoryPo beansHistory = new UserBeansHistoryPo();
                     beansHistory.setUserId(mainOrder.getUserId());
                     beansHistory.setOrderId(mainOrder.getOrderId());

+ 73 - 0
src/main/java/com/caimei365/order/utils/helipay/HeliPayCertConfig.java

@@ -0,0 +1,73 @@
+package com.caimei365.order.utils.helipay;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Security;
+
+
+public class HeliPayCertConfig {
+
+    /**
+     * 证书存储路径
+     */
+    private static final String CERT_PATH = "key\\dev\\";
+    //private static final String CERT_PATH = "D:\\certs\\key\\dev\\";
+
+    /**
+     * 商户SM2证书私钥路径
+     */
+    private static final String MERCHANT_PRIVATE_KEY_PATH = CERT_PATH + "C1800000002_dev.pfx";
+
+    /**
+     * 商户SM2证书私钥密码
+     */
+    private static final String MERCHANT_PRIVATE_KEY_PWD = "123456";
+
+    /**
+     *  商户SM2证书私钥字符串
+     */
+    private static final PrivateKey merchantPrivateKey;
+
+
+    /**
+     *  合利宝SM2证书公钥路径
+     */
+    private static final String HELIPAY_PUBLIC_KEY_PATH = CERT_PATH + "helipay_pub_dev.cer";//取决支付系统加载的合利宝私钥配对
+
+    //加密机公钥证书
+    //private static final String HELIPAY_PUBLIC_KEY_PATH = "D:\\certs\\hsm\\helipay-hsm.cer";
+
+    /**
+     * 合利宝SM2证书公钥对象
+     */
+    private static final PublicKey helipayPublicKey;
+
+    static {
+        if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {
+            Security.addProvider(new BouncyCastleProvider());
+        }
+
+        try {
+            merchantPrivateKey = HeliPayCertUtils.getPrivateKeyByPfx("/mnt/newdatadrive/keys/C1806995267_2303010060964109_privateKey.pfx","cm20230327");
+        } catch (Exception e) {
+            throw new RuntimeException("获取SM2证书私钥字符串异常:"+e.getMessage(),e) ;
+        }
+
+        try {
+            helipayPublicKey = HeliPayCertUtils.getPublicKey("/mnt/newdatadrive/keys/helipayPublicKey.cer");
+        } catch (Exception e) {
+            throw new RuntimeException("加载合利宝SM2证书公钥异常异常:"+e.getMessage(),e) ;
+        }
+    }
+
+    public static PrivateKey getMerchantPrivateKey() {
+        return merchantPrivateKey;
+    }
+
+
+    public static PublicKey getHelipayPublicKey() {
+        return helipayPublicKey;
+    }
+}

+ 81 - 0
src/main/java/com/caimei365/order/utils/helipay/HeliPayCertUtils.java

@@ -0,0 +1,81 @@
+package com.caimei365.order.utils.helipay;
+
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.io.ByteArrayInputStream;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.*;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.util.Enumeration;
+
+/**
+ * 合利宝证书工具类
+ */
+public abstract class HeliPayCertUtils {
+
+    private HeliPayCertUtils() {}
+
+    public static PublicKey getPublicKey(String certFilePath) throws CertificateException, IOException, NoSuchProviderException {
+        return getX509Certificate(certFilePath).getPublicKey();
+    }
+
+    /**
+     * 获取证书
+     * @param certFilePath
+     * @return
+     * @throws CertificateException
+     * @throws NoSuchProviderException
+     * @throws IOException
+     */
+    public static X509Certificate getX509Certificate(String certFilePath) throws CertificateException,
+            NoSuchProviderException, IOException {
+        CertificateFactory cf = CertificateFactory.getInstance("X.509", BouncyCastleProvider.PROVIDER_NAME);
+        byte[] readAllBytes = Files.readAllBytes(Paths.get(certFilePath));
+        String fileContent = new String(readAllBytes);
+        if("-----BEGIN CERTIFICATE-----".indexOf(fileContent) < 0){
+            fileContent = "-----BEGIN CERTIFICATE-----\n" + fileContent  +
+                    "\n-----END CERTIFICATE-----";
+        }
+        InputStream is = new ByteArrayInputStream(fileContent.getBytes());
+        return (X509Certificate) cf.generateCertificate(is);
+    }
+
+    public static PrivateKey getPrivateKeyByPfx(String pfxPath, String pfxPassword) {
+        try {
+            KeyStore ks = KeyStore.getInstance("PKCS12",getProvider());
+            FileInputStream fis = new FileInputStream(pfxPath);
+            // If the keystore password is empty(""), then we have to set
+            // to null, otherwise it won't work!!!
+            char[] nPassword = null;
+            if ((pfxPassword == null) || pfxPassword.trim().equals("")) {
+                nPassword = null;
+            } else {
+                nPassword = pfxPassword.toCharArray();
+            }
+            ks.load(fis, nPassword);
+            fis.close();
+            Enumeration enumas = ks.aliases();
+            String keyAlias = null;
+            if (enumas.hasMoreElements())// we are readin just one certificate.
+            {
+                keyAlias = (String) enumas.nextElement();
+            }
+            PrivateKey prikey = (PrivateKey) ks.getKey(keyAlias, nPassword);
+            return prikey;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    private static Provider getProvider() {
+        return Security.getProvider(BouncyCastleProvider.PROVIDER_NAME);
+    }
+
+}

+ 128 - 0
src/main/java/com/caimei365/order/utils/helipay/MessageHandle.java

@@ -0,0 +1,128 @@
+package com.caimei365.order.utils.helipay;
+
+
+import com.alibaba.fastjson.JSONException;
+import com.alibaba.fastjson.JSONObject;
+import com.caimei365.order.annotation.FieldEncrypt;
+import com.caimei365.order.annotation.SignExclude;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+
+public class MessageHandle {
+
+	private static Logger log = LoggerFactory.getLogger(MessageHandle.class);
+
+	private static final String ENCRYPTION_KEY = "encryptionKey";
+
+	private static final String SPLIT = "&";
+
+	private static final String SIGN = "sign";
+
+	public static boolean isJSON(String test) {
+		try {
+			JSONObject.parseObject(test);
+		} catch (JSONException ex) {
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * 获取map
+	 */
+	public static Map getReqestMap(Object bean) throws Exception {
+
+		Map retMap = new HashMap();
+
+		boolean isEncrypt = false;
+		String sm4Key = SM4Utils.generateRandomKey();
+		StringBuilder sb = new StringBuilder();
+
+		Class clazz = bean.getClass();
+		Field[] fields = clazz.getDeclaredFields();
+		for (Field field : fields) {
+			field.setAccessible(true);
+			String key = field.toString().substring(field.toString().lastIndexOf(".") + 1);
+			String value = (String) field.get(bean);
+			if (value == null) {
+				value = "";
+			}
+			//查看是否有需要SM4加密字段的注解,有则加密
+			//这部分是将需要SM4加密的字段先进行加密
+			if (field.isAnnotationPresent(FieldEncrypt.class) && StringUtils.isNotEmpty(value)) {
+				isEncrypt = true;
+				value = SM4Utils.encryptBase64(value , sm4Key);
+			}
+
+			//字段没有@SignExclude注解的拼签名串
+			//这部分是把需要参与签名的字段拼成一个待签名的字符串
+			if (!field.isAnnotationPresent(SignExclude.class)) {
+				sb.append(SPLIT);
+				sb.append(value);
+			}
+
+			retMap.put(key, value);
+		}
+
+		//请求参数中有需要加密的字段,使用合利宝的公钥的对SM4密钥KEY进行加密处理
+		if (isEncrypt) {
+			String encrytionKey = SM2Utils.encryptToBase64(HeliPayCertConfig.getHelipayPublicKey(), sm4Key);
+			retMap.put(ENCRYPTION_KEY, encrytionKey);
+		}
+
+		log.info("原签名串:" + sb.toString());
+		//使用商户的私钥进行签名
+		String sign = SM2Utils.sign(HeliPayCertConfig.getMerchantPrivateKey(), sb.toString());
+		retMap.put(SIGN, sign);
+		log.info("签名sign:" + sign);
+		return retMap;
+	}
+
+
+	public static boolean checkSign(Object bean) throws Exception {
+
+		boolean flag = false;
+		StringBuilder sb = new StringBuilder();
+
+		Class clazz = bean.getClass();
+		Field[] fields = clazz.getDeclaredFields();
+		String sign = "";
+		for (Field field : fields) {
+			field.setAccessible(true);
+			String key = field.toString().substring(field.toString().lastIndexOf(".") + 1);
+			String value = (String) field.get(bean);
+			if (value == null) {
+				value = "";
+			}
+
+			if (SIGN.equals(key)) {
+				sign = value;
+			}
+
+			//字段没有@SignExclude注解的拼签名串
+			//这部分是把需要参与签名的字段拼成一个待签名的字符串
+			if (!field.isAnnotationPresent(SignExclude.class)) {
+				sb.append(SPLIT);
+				sb.append(value);
+			}
+
+		}
+		log.info("response验签原签名串:" + sb.toString());
+
+		//使用合利宝的公钥进行验签
+		flag = SM2Utils.verify(HeliPayCertConfig.getHelipayPublicKey(), sb.toString(), sign);
+		if (flag) {
+			log.info("验签成功");
+		} else {
+			log.info("验签失败");
+		}
+		return flag;
+
+	}
+}

+ 94 - 0
src/main/java/com/caimei365/order/utils/helipay/SM2Utils.java

@@ -0,0 +1,94 @@
+package com.caimei365.order.utils.helipay;
+
+import cn.hutool.crypto.asymmetric.SM2;
+import org.apache.commons.lang3.StringUtils;
+import org.bouncycastle.crypto.engines.SM2Engine;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.nio.charset.StandardCharsets;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.util.Base64;
+import java.util.Objects;
+
+/**
+ * 国密SM2算法工具类
+ * @description:
+ * @since:
+ */
+public class SM2Utils {
+
+    private static Logger logger = LoggerFactory.getLogger(SM2Utils.class);
+
+    private SM2Utils(){}
+
+    public static String sign(PrivateKey privateKey, String data) {
+        return sign(privateKey, data.getBytes(StandardCharsets.UTF_8), null);
+    }
+
+    public static String sign(PrivateKey privateKey, String data, byte[] id) {
+        return sign(privateKey, data.getBytes(StandardCharsets.UTF_8), id);
+    }
+
+    public static String sign(PrivateKey privateKey, byte[] data, byte[] id) {
+        SM2 sm2 = new SM2(privateKey, null);
+        return Base64.getEncoder().encodeToString(sm2.sign(data, id));
+    }
+
+    public static boolean verify(PublicKey publicKey, String plainText, String signText) {
+        Objects.requireNonNull(plainText, "plainText required");
+        Objects.requireNonNull(signText, "signText required");
+        return verify(publicKey, plainText.getBytes(StandardCharsets.UTF_8), Base64.getDecoder().decode(signText), null);
+    }
+
+    private static boolean verify(PublicKey publicKey, byte[] plainData, byte[] signature, byte[] id) {
+        SM2 sm2 = new SM2(null, publicKey);
+        return sm2.verify(plainData, signature, id);
+    }
+
+    public static String encryptToBase64(PublicKey publicKey, String plainText){
+        byte[] cipherData = encrypt(publicKey, plainText.getBytes(StandardCharsets.UTF_8));
+        return Base64.getEncoder().encodeToString(cipherData);
+    }
+
+    private static byte[] encrypt(PublicKey publicKey, byte[] message) {
+        SM2 sm2 = new SM2(null, publicKey);
+        sm2.setMode(SM2Engine.Mode.C1C3C2);
+        return sm2.encrypt(message);
+    }
+
+    public static String decryptBase64Message(PrivateKey privateKey,String cipherText){
+        byte[] base64Data = Base64.getDecoder().decode(cipherText);
+        byte[] bytes = decrypt(privateKey, base64Data);
+        return StringUtils.toEncodedString(bytes, StandardCharsets.UTF_8);
+    }
+
+    private static byte[] decrypt(PrivateKey privateKey, byte[] message) {
+        SM2 sm2 = new SM2(privateKey, null);
+        sm2.setMode(SM2Engine.Mode.C1C3C2);
+        return sm2.decrypt(message);
+    }
+
+    public static void main(String[] args)  {
+
+//        String plainText = "待签名串abc=123";
+//        // ===============  签名、验签 =================
+//
+//        String signText = sign(HeliPayCertConfig.getMerchantPrivateKey(), plainText);
+//        System.out.println("signText length:"+signText.length());
+//        System.out.println("signText:"+signText);
+//
+//        boolean b = verify(HeliPayCertConfig.getMerchantPublicKey(),plainText, signText);
+//        System.out.println("verify:"+b);
+//
+//        // ===============  加密、解密 =================
+//
+//        String cipherText = encryptToBase64(HeliPayCertConfig.getMerchantPublicKey(), plainText);
+//        System.out.println("cipherText:"+cipherText);
+//        System.out.println("cipherText length:"+cipherText.length());
+//
+//        String sourceText = decryptBase64Message(HeliPayCertConfig.getMerchantPrivateKey(), cipherText);
+//        System.out.println("sourceText:"+sourceText);
+    }
+}

+ 100 - 0
src/main/java/com/caimei365/order/utils/helipay/SM4Utils.java

@@ -0,0 +1,100 @@
+package com.caimei365.order.utils.helipay;
+
+import cn.hutool.crypto.symmetric.SM4;
+
+import javax.crypto.SecretKey;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.Random;
+
+
+/**
+ * SM4对称加密工具类
+ */
+public class SM4Utils {
+
+    private static final int DEFAULT_KEY_LENGTH = 16;
+
+    private static final String ALL_CHAR = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
+
+    private static final String ENCRYPTION_ALGORITHM = "SM4";
+
+    private static final String MODE_CBC ="CBC";
+
+    private static final String PKCS7PADDING = "PKCS7Padding";
+
+    private static final IvParameterSpec sm4IvSpec = new IvParameterSpec(Base64.getDecoder().decode(
+            "AQ4Zvt54xKn9QaW86ZzWdg=="));
+
+    private SM4Utils(){}
+
+    public static String generateRandomKey(){
+        StringBuffer sb = new StringBuffer();
+        Random random = new Random();
+        for (int i = 0; i < DEFAULT_KEY_LENGTH; i++) {
+            sb.append(ALL_CHAR.charAt(random.nextInt(ALL_CHAR.length())));
+        }
+        return sb.toString();
+    }
+
+    public static String decryptBase64(String message,String sm4Key){
+        return sm4DecryptBase64(message, toSecretKeySpec(sm4Key));
+    }
+
+    public static String encryptBase64(String message,String sm4Key){
+        return sm4EncryptBase64(message, toSecretKeySpec(sm4Key));
+    }
+
+    public static SecretKeySpec toSecretKeySpec(String sm4Key) {
+        return new SecretKeySpec(sm4Key.getBytes(StandardCharsets.UTF_8), ENCRYPTION_ALGORITHM);
+    }
+
+    public static String sm4DecryptBase64(String message, SecretKeySpec keySpec) {
+        byte[] bytes = Base64.getDecoder().decode(message);
+        byte[] decrypted = SM4Utils.decrypt(keySpec, sm4IvSpec, bytes);
+        return new String(decrypted, StandardCharsets.UTF_8);
+    }
+
+    public static String sm4EncryptBase64(String message, SecretKeySpec keySpec) {
+        return encryptBase64(keySpec, sm4IvSpec, message.getBytes(StandardCharsets.UTF_8));
+    }
+
+
+    public static String encryptBase64(SecretKey key, IvParameterSpec iv, byte[] data) {
+        byte[] bytes = encrypt(key, iv, data);
+        return Base64.getEncoder().encodeToString(bytes);
+    }
+
+    public static byte[] encrypt(SecretKey key, IvParameterSpec iv, byte[] data) {
+        SM4 sm4 = new SM4(MODE_CBC, PKCS7PADDING, key, iv);
+        return sm4.encrypt(data);
+    }
+
+    public static byte[] decrypt(SecretKey key, IvParameterSpec iv, byte[] data) {
+        SM4 sm4 = new SM4(MODE_CBC, PKCS7PADDING, key, iv);
+        return sm4.decrypt(data);
+    }
+
+
+    public static void main(String[] args) {
+//        Stopwatch stopwatch = Stopwatch.createStarted();
+//        String sm4Key = generateRandomKey();
+//        System.out.println("执行时长1:"+stopwatch.elapsed(TimeUnit.MILLISECONDS));
+//        String content ="12345678";
+//        System.out.println("content length:"+content.length());
+//        SecretKeySpec encryptSecretKey = toSecretKeySpec(sm4Key);
+//        System.out.println("执行时长2:"+stopwatch.elapsed(TimeUnit.MILLISECONDS));
+//        String sm4EncryptBase64 = sm4EncryptBase64(content,encryptSecretKey);
+//        System.out.println("执行时长3:"+stopwatch.elapsed(TimeUnit.MILLISECONDS));
+//        System.out.println("sm4EncryptBase64:"+sm4EncryptBase64);
+//        String encryptSm4Key = SM2Utils.encryptToBase64(HeliPayCertConfig.getMerchantPublicKey(),sm4Key);
+//        System.out.println("执行时长4:"+stopwatch.elapsed(TimeUnit.MILLISECONDS));
+//        String decryptSm4Key = SM2Utils.decryptBase64Message(HeliPayCertConfig.getMerchantPrivateKey(),encryptSm4Key);
+//        System.out.println("执行时长5:"+stopwatch.elapsed(TimeUnit.MILLISECONDS));
+//        String sm4DecryptBase64 = decryptBase64(sm4EncryptBase64,decryptSm4Key);
+//        System.out.println("执行时长6:"+stopwatch.elapsed(TimeUnit.MILLISECONDS));
+//        System.out.println("sm4DecryptBase64:"+sm4DecryptBase64);
+    }
+}

+ 11 - 7
src/main/resources/mapper/BaseMapper.xml

@@ -52,7 +52,9 @@
         WHERE id = #{id}
     </update>
     <select id="firstClubTypeById" resultType="java.lang.String">
-        select firstClubType from club where clubID = #{clubId}
+        select firstClubType
+        from club
+        where clubID = #{clubId}
     </select>
     <select id="machineTypeByID" resultType="java.lang.String">
         SELECT p.machineType FROM product p LEFT JOIN cm_sku cs ON p.productID = cs.productId
@@ -143,7 +145,7 @@
                pr.discount,
                pr.seen
         FROM cm_promotions pr
-        LEFT JOIN cm_promotions_product prp ON pr.id = prp.promotionsId
+                 LEFT JOIN cm_promotions_product prp ON pr.id = prp.promotionsId
         WHERE prp.productId = #{productId}
           and pr.delFlag = 0
           and pr.type in (1, 2)
@@ -279,9 +281,11 @@
     <insert id="insertDiscernReceipt" keyColumn="id" keyProperty="id"
             parameterType="com.caimei365.order.model.po.DiscernReceiptPo" useGeneratedKeys="true">
         INSERT INTO cm_discern_receipt (payWay, payType, receiptType, receiptStatus, receiptAmount, confirmType,
-                                        receiptDate, confirmDate, reviewDate, updateDate, delFlag, rePayFlag, formData)
+                                        receiptDate, confirmDate, reviewDate, updateDate, delFlag, rePayFlag, formData,
+                                        quickInfoId)
         VALUES (#{payWay}, #{payType}, #{receiptType}, #{receiptStatus}, #{receiptAmount}, #{confirmType},
-                #{receiptDate}, #{confirmDate}, #{reviewDate}, #{updateDate}, #{delFlag}, #{rePayFlag}, #{formData})
+                #{receiptDate}, #{confirmDate}, #{reviewDate}, #{updateDate}, #{delFlag}, #{rePayFlag}, #{formData},
+                #{infoId})
     </insert>
     <insert id="insertOrderReceiptRelation" keyColumn="id" keyProperty="id"
             parameterType="com.caimei365.order.model.po.OrderReceiptRelationPo" useGeneratedKeys="true">
@@ -396,14 +400,14 @@
     <select id="getSvipSku" resultType="com.caimei365.order.model.dto.VipSkuPriceDto">
         select priceType, discount, discountPrice, csps.productId, skuId
         from cm_svip_product_sku csps
-        left join cm_svip_product csp on csps.productId=csp.productId
+                 left join cm_svip_product csp on csps.productId = csp.productId
         where skuId = #{skuId}
-        and csp.status=0
+          and csp.status = 0
     </select>
     <select id="getTouchPriceBySku" resultType="java.lang.Double">
         select touchPrice
         from cm_promotion_sku
         where skuId = #{skuId}
-        and promotionId=#{promotionId}
+          and promotionId = #{promotionId}
     </select>
 </mapper>

+ 2 - 0
src/main/resources/mapper/OrderCommonMapper.xml

@@ -133,6 +133,7 @@
                cdr.reviewDate,
                cdr.updateDate,
                cdr.delFlag,
+               cdr.quickInfoId as infoId,
                cror.associateAmount
         FROM cm_receipt_order_relation cror
                  LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
@@ -610,6 +611,7 @@
                cdr.reviewDate,
                cdr.updateDate,
                cdr.delFlag,
+               cdr.quickInfoId as infoId,
                cror.associateAmount
         FROM cm_receipt_order_relation cror
                  LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id

+ 340 - 125
src/main/resources/mapper/PayOrderMapper.xml

@@ -37,33 +37,57 @@
         WHERE userID = #{userId}
     </update>
     <delete id="deleteAuthVipRoleRelation">
-        DELETE FROM auth_role_user WHERE user_id = #{userId}
+        DELETE
+        FROM auth_role_user
+        WHERE user_id = #{userId}
     </delete>
-    <insert id="insertOrderPayLink" keyColumn="id" keyProperty="id"  parameterType="com.caimei365.order.model.vo.OrderPayLinkVo" useGeneratedKeys="true">
+    <delete id="delQuickBindId">
+        delete
+        from cm_quickpay_bindcardinfo
+        where quickBindId = #{quickBindId}
+    </delete>
+    <update id="delQuickInfo">
+        update cm_quickpay_info
+        set delFlag = 1
+        where id = #{infoId}
+    </update>
+    <insert id="insertOrderPayLink" keyColumn="id" keyProperty="id"
+            parameterType="com.caimei365.order.model.vo.OrderPayLinkVo" useGeneratedKeys="true">
         INSERT INTO cm_order_pay_link (orderId, vipRecordId, authVipRecordId, vipMonth, linkLogo, unpaidAmount,
                                        generateTime, effectiveTime, payStatus, payType, delFlag, shopOrderId)
         VALUES (#{orderId}, #{vipRecordId}, #{authVipRecordId}, #{vipMonth}, #{linkLogo}, #{unpaidAmount},
                 #{generateTime}, #{effectiveTime}, #{payStatus}, #{payType}, #{delFlag}, #{shopOrderId})
     </insert>
-    <insert id="insertSplitAccount" keyColumn="id" keyProperty="id"  parameterType="com.caimei365.order.model.po.SplitAccountPo" useGeneratedKeys="true">
-        INSERT INTO cm_split_account (orderId, productId, orderProductId, shopId, couponRecordId,vipRecordId, authVipRecordId, type, subUserNo, splitAccount,
-                                        mbOrderId, orderRequestNo,payStatus, productType, splitTime)
-        VALUES (#{orderId}, #{productId}, #{orderProductId}, #{shopId},#{couponRecordId},#{vipRecordId}, #{authVipRecordId}, #{type}, #{subUserNo}, #{splitAccount},
+    <insert id="insertSplitAccount" keyColumn="id" keyProperty="id"
+            parameterType="com.caimei365.order.model.po.SplitAccountPo" useGeneratedKeys="true">
+        INSERT INTO cm_split_account (orderId, productId, orderProductId, shopId, couponRecordId, vipRecordId,
+                                      authVipRecordId, type, subUserNo, splitAccount,
+                                      mbOrderId, orderRequestNo, payStatus, productType, splitTime)
+        VALUES (#{orderId}, #{productId}, #{orderProductId}, #{shopId}, #{couponRecordId}, #{vipRecordId},
+                #{authVipRecordId}, #{type}, #{subUserNo}, #{splitAccount},
                 #{mbOrderId}, #{orderRequestNo}, #{payStatus}, #{productType}, NOW());
     </insert>
-    <insert id="insertPayShop" keyColumn="id" keyProperty="id" parameterType="com.caimei365.order.model.po.PayShopPo" useGeneratedKeys="true">
+    <insert id="insertPayShop" keyColumn="id" keyProperty="id" parameterType="com.caimei365.order.model.po.PayShopPo"
+            useGeneratedKeys="true">
         INSERT INTO cm_pay_shop (shopID, name, bankAccountName, bankAccount, bankName, type, totalAmount, balancePayFee,
-                                 transferPayFee, payType, wipePayment, wipeRemarks, wipeRemarkImages, wipeTime, applicant,
+                                 transferPayFee, payType, wipePayment, wipeRemarks, wipeRemarkImages, wipeTime,
+                                 applicant,
                                  applyTime, reviewer, reviewTime, payTime, status, reason, delFlag)
-        VALUES (#{shopId}, #{name}, #{bankAccountName}, #{bankAccount}, #{bankName}, #{type}, #{totalAmount}, #{balancePayFee},
-                #{transferPayFee}, #{payType}, #{wipePayment}, #{wipeRemarks}, #{wipeRemarkImages}, #{wipeTime}, #{applicant},
+        VALUES (#{shopId}, #{name}, #{bankAccountName}, #{bankAccount}, #{bankName}, #{type}, #{totalAmount},
+                #{balancePayFee},
+                #{transferPayFee}, #{payType}, #{wipePayment}, #{wipeRemarks}, #{wipeRemarkImages}, #{wipeTime},
+                #{applicant},
                 #{applyTime}, #{reviewer}, #{reviewTime}, #{payTime}, #{status}, #{reason}, #{delFlag})
     </insert>
-    <insert id="insertPayShopRecord" keyColumn="id" keyProperty="id" parameterType="com.caimei365.order.model.po.PayShopRecordPo" useGeneratedKeys="true">
-        INSERT INTO cm_pay_shop_record (shopID, shopOrderID, shopOrderNo, payAmount, wipePayment, payType, payTime, payShopID, status, delFlag)
-        VALUES (#{shopId}, #{shopOrderId}, #{shopOrderNo}, #{payAmount}, #{wipePayment}, #{payType}, #{payTime}, #{payShopId}, #{status}, #{delFlag})
+    <insert id="insertPayShopRecord" keyColumn="id" keyProperty="id"
+            parameterType="com.caimei365.order.model.po.PayShopRecordPo" useGeneratedKeys="true">
+        INSERT INTO cm_pay_shop_record (shopID, shopOrderID, shopOrderNo, payAmount, wipePayment, payType, payTime,
+                                        payShopID, status, delFlag)
+        VALUES (#{shopId}, #{shopOrderId}, #{shopOrderNo}, #{payAmount}, #{wipePayment}, #{payType}, #{payTime},
+                #{payShopId}, #{status}, #{delFlag})
     </insert>
-    <insert id="insertUserVipInfo" keyColumn="id" keyProperty="id" parameterType="com.caimei365.order.model.po.UserVipPo">
+    <insert id="insertUserVipInfo" keyColumn="id" keyProperty="id"
+            parameterType="com.caimei365.order.model.po.UserVipPo">
         INSERT INTO cm_svip_user(userId, beginTime, endTime, delFlag, updateTime)
         VALUES (#{userId}, #{beginTime}, #{endTime}, #{delFlag}, #{updateTime})
     </insert>
@@ -71,55 +95,102 @@
         INSERT INTO auth_vip_user(authUserId, beginTime, endTime, delFlag, updateTime)
         VALUES (#{userId}, #{beginTime}, #{endTime}, #{delFlag}, #{updateTime})
     </insert>
-    <insert id="insertCouponRecord" keyColumn="id" keyProperty="id" parameterType="com.caimei365.order.model.po.CouponRecordPo" useGeneratedKeys="true">
-        INSERT INTO cm_coupon_buyrecord (couponId, userId) VALUES (#{couponId},#{userId})
+    <insert id="insertCouponRecord" keyColumn="id" keyProperty="id"
+            parameterType="com.caimei365.order.model.po.CouponRecordPo" useGeneratedKeys="true">
+        INSERT INTO cm_coupon_buyrecord (couponId, userId)
+        VALUES (#{couponId}, #{userId})
     </insert>
     <insert id="insertAuthVipRoleRelation">
-        INSERT INTO auth_role_user(user_id, role_id) VALUES(#{userId}, #{roleId})
+        INSERT INTO auth_role_user(user_id, role_id)
+        VALUES (#{userId}, #{roleId})
+    </insert>
+    <insert id="insertQuickPayInfo" keyColumn="id" keyProperty="id" useGeneratedKeys="true"
+            parameterType="com.caimei365.order.model.vo.QuickInfoVo">
+        insert into cm_quickpay_info(userId, quickPayUserId, idCard, bankNumber, bankExpireTime,
+                                     bankCvvCode, bankType, bindMobile, bankUserName, quickPayBankCode, delFlag)
+        values (#{userId}, #{quickPayUserId}, #{idCard}, #{bankNumber}, #{bankExpireTime},
+                #{bankCvvCode}, #{bankType}, #{bindMobile}, #{bankUserName}, #{quickPayBankCode}, 1)
+    </insert>
+    <insert id="insertBindId">
+        insert into cm_quickpay_bindcardinfo(quickbindid, bindcustomer, userid, quickinfoid)
+        select #{bindId}, #{customerNumber}, #{userId}, #{infoId}
+        from DUAL
+        where NOT EXISTS(SELECT id FROM cm_quickpay_bindcardinfo WHERE quickBindId = #{bindId})
     </insert>
     <update id="updateUserVipInfo">
-        UPDATE cm_svip_user set userId=#{userId}, beginTime=#{beginTime}, endTime=#{endTime}, delFlag=#{delFlag}, updateTime=#{updateTime}
+        UPDATE cm_svip_user
+        set userId=#{userId},
+            beginTime=#{beginTime},
+            endTime=#{endTime},
+            delFlag=#{delFlag},
+            updateTime=#{updateTime}
         WHERE userId = #{userId}
     </update>
     <update id="updateVipPackageRecord">
-        UPDATE cm_svip_history set payStatus=#{payStatus},payWay=#{payWay},payType=#{payType},beginTime=#{beginTime},endTime=#{endTime},payTime=#{payTime}
+        UPDATE cm_svip_history
+        set payStatus=#{payStatus},
+            payWay=#{payWay},
+            payType=#{payType},
+            beginTime=#{beginTime},
+            endTime=#{endTime},
+            payTime=#{payTime}
         WHERE id = #{id}
     </update>
     <update id="updateOrderPayLink">
-        UPDATE cm_order_pay_link SET
-            orderId = #{orderId}, vipRecordId = #{vipRecordId}, authVipRecordId = #{authVipRecordId}, vipMonth = #{vipMonth}, linkLogo = #{linkLogo}, unpaidAmount = #{unpaidAmount}, generateTime = #{generateTime},
-            effectiveTime = #{effectiveTime}, payStatus = #{payStatus}, payType = #{payType}, delFlag = #{delFlag} , shopOrderId = #{shopOrderId}
+        UPDATE cm_order_pay_link
+        SET orderId         = #{orderId},
+            vipRecordId     = #{vipRecordId},
+            authVipRecordId = #{authVipRecordId},
+            vipMonth        = #{vipMonth},
+            linkLogo        = #{linkLogo},
+            unpaidAmount    = #{unpaidAmount},
+            generateTime    = #{generateTime},
+            effectiveTime   = #{effectiveTime},
+            payStatus       = #{payStatus},
+            payType         = #{payType},
+            delFlag         = #{delFlag},
+            shopOrderId     = #{shopOrderId}
         WHERE id = #{id}
     </update>
     <update id="updateOrderPayLinkStatus">
-        UPDATE cm_order_pay_link SET payStatus = #{payStatus}
+        UPDATE cm_order_pay_link
+        SET payStatus = #{payStatus}
         WHERE id = #{id}
     </update>
     <update id="updateSeconHandDetail">
         UPDATE cm_second_hand_detail
-        SET payType = #{payType}, payAmount = #{payAmount}, payFormData = #{payFormData}, payStatus = '2',payDate = NOW()
+        SET payType     = #{payType},
+            payAmount   = #{payAmount},
+            payFormData = #{payFormData},
+            payStatus   = '2',
+            payDate     = NOW()
         WHERE productID = #{productId}
     </update>
     <update id="updateSplitAccountByPay">
-        UPDATE cm_split_account SET payStatus = '1' WHERE mbOrderId = #{mbOrderId}
+        UPDATE cm_split_account
+        SET payStatus = '1'
+        WHERE mbOrderId = #{mbOrderId}
     </update>
     <update id="updateBySplitStatus">
-        UPDATE cm_receipt_order_relation SET splitStatus = 1 WHERE mbOrderId = #{mbOrderId}
+        UPDATE cm_receipt_order_relation
+        SET splitStatus = 1
+        WHERE mbOrderId = #{mbOrderId}
     </update>
     <update id="updateShopOrderByPayStatus">
-        UPDATE cm_shop_order SET
-        payStatus = #{payStatus}, payedShopAmount = #{paidShop}
+        UPDATE cm_shop_order
+        SET payStatus       = #{payStatus},
+            payedShopAmount = #{paidShop}
         WHERE shopOrderID = #{shopOrderId}
     </update>
     <update id="updateOrderByPayStatus">
-        UPDATE cm_order SET
-        payStatus = #{payStatus}
+        UPDATE cm_order
+        SET payStatus = #{payStatus}
         WHERE orderID = #{orderId}
     </update>
     <update id="updateUserMoney">
         UPDATE USER
         SET userMoney     = #{userMoney},
-        ableUserMoney = #{ableUserMoney}
+            ableUserMoney = #{ableUserMoney}
         WHERE userID = #{userId}
     </update>
     <update id="updateCouponRecord">
@@ -128,11 +199,22 @@
         where id = #{recordId}
     </update>
     <update id="updateAuthVipInfo">
-        UPDATE auth_vip_user set authUserId=#{userId}, beginTime=#{beginTime}, endTime=#{endTime}, delFlag=#{delFlag}, updateTime=#{updateTime}
+        UPDATE auth_vip_user
+        set authUserId=#{userId},
+            beginTime=#{beginTime},
+            endTime=#{endTime},
+            delFlag=#{delFlag},
+            updateTime=#{updateTime}
         WHERE authUserId = #{userId}
     </update>
     <update id="updateAuthVipRecord">
-        UPDATE auth_vip_history set payStatus=#{payStatus},payWay=#{payWay},payType=#{payType},beginTime=#{beginTime},endTime=#{endTime},payTime=#{payTime}
+        UPDATE auth_vip_history
+        set payStatus=#{payStatus},
+            payWay=#{payWay},
+            payType=#{payType},
+            beginTime=#{beginTime},
+            endTime=#{endTime},
+            payTime=#{payTime}
         WHERE id = #{id}
     </update>
     <update id="updateSplitAccount">
@@ -142,33 +224,57 @@
         WHERE orderRequestNo = #{orderRequestNo}
     </update>
     <update id="updateShopOrder">
-        UPDATE cm_shop_order SET
-        receiptStatus = #{receiptStatus}, receiptAmount = #{receiptAmount},paySuccessCounter =#{paySuccessCounter}
+        UPDATE cm_shop_order
+        SET receiptStatus     = #{receiptStatus},
+            receiptAmount     = #{receiptAmount},
+            paySuccessCounter =#{paySuccessCounter}
         WHERE shopOrderID = #{shopOrderId}
     </update>
     <update id="updateBySplitStatusByNo">
-        UPDATE cm_receipt_order_relation SET splitStatus = 1 WHERE orderRequestNo = #{orderRequestNo}
+        UPDATE cm_receipt_order_relation
+        SET splitStatus = 1
+        WHERE orderRequestNo = #{orderRequestNo}
+    </update>
+    <update id="updateQuickInfo">
+        update cm_quickpay_info
+        set bankType         = #{bankType},
+            quickPayBankCode = #{bankCode},
+            delflag          = 0
+        where id = #{infoId}
+    </update>
+    <update id="updateQuickPayInfo">
+        update cm_quickpay_info
+        set bankExpireTime = #{bankExpireTime},
+            bankCvvCode    = #{bankCvvCode},
+            bindMobile     = #{bindMobile},
+            bankUserName   = #{bankUserName},
+            idCard         = #{idCard}
+        where id = #{id}
     </update>
     <select id="getPayOnLineSwitch" resultType="java.lang.Integer">
-        SELECT STATUS FROM cm_pay_online_switch WHERE id=1
+        SELECT STATUS
+        FROM cm_pay_online_switch
+        WHERE id = 1
     </select>
     <select id="getRefundCount" resultType="java.lang.Integer">
         SELECT COUNT(*)
         FROM cm_returned_purchase
-        WHERE orderID = #{orderId} AND STATUS = '1' AND delFlag = '0'
+        WHERE orderID = #{orderId}
+          AND STATUS = '1'
+          AND delFlag = '0'
     </select>
     <select id="getOrderPayLink" resultType="com.caimei365.order.model.vo.OrderPayLinkVo">
         SELECT
-            id,
-            orderId,
-            vipRecordId,
-            linkLogo,
-            unpaidAmount,
-            generateTime,
-            effectiveTime,
-            payStatus,
-            payType,
-            delFlag
+        id,
+        orderId,
+        vipRecordId,
+        linkLogo,
+        unpaidAmount,
+        generateTime,
+        effectiveTime,
+        payStatus,
+        payType,
+        delFlag
         FROM
         cm_order_pay_link
         WHERE shopOrderId = #{orderId}
@@ -200,110 +306,134 @@
         ORDER BY id DESC LIMIT 1
     </select>
     <select id="getPayLinkByLinkLogo" resultType="com.caimei365.order.model.vo.OrderPayLinkVo">
-        SELECT
-            id,
-            shopOrderId,
-            orderId,
-            vipRecordId,
-            authVipRecordId,
-            vipMonth,
-            linkLogo,
-            unpaidAmount,
-            generateTime,
-            effectiveTime,
-            payStatus,
-            payType,
-            delFlag
-        FROM
-        cm_order_pay_link
+        SELECT id,
+               shopOrderId,
+               orderId,
+               vipRecordId,
+               authVipRecordId,
+               vipMonth,
+               linkLogo,
+               unpaidAmount,
+               generateTime,
+               effectiveTime,
+               payStatus,
+               payType,
+               delFlag
+        FROM cm_order_pay_link
         WHERE linkLogo = #{linkLogo}
-        AND delFlag = '0'
+          AND delFlag = '0'
     </select>
     <select id="getOrderPromotionsId" resultType="java.lang.Integer">
-        SELECT id FROM cm_promotions_order WHERE orderId = #{orderId} LIMIT 1
+        SELECT id
+        FROM cm_promotions_order
+        WHERE orderId = #{orderId}
+        LIMIT 1
     </select>
     <select id="getDbPaySuccessCounter" resultType="java.lang.Integer">
-        SELECT ifnull(paySuccessCounter,0) FROM cm_shop_order
-        WHERE shopOrderID = #{shopOrderId} AND delFlag = '0'
+        SELECT ifnull(paySuccessCounter, 0)
+        FROM cm_shop_order
+        WHERE shopOrderID = #{shopOrderId}
+          AND delFlag = '0'
     </select>
 
     <select id="getOpenidListByPermission" resultType="java.lang.String">
-        SELECT openid FROM `wechat_user` WHERE unionId= #{unionid}
+        SELECT openid
+        FROM `wechat_user`
+        WHERE unionId = #{unionid}
     </select>
 
     <select id="getSplitAccountList" resultType="com.caimei365.order.model.po.SplitAccountPo">
-        SELECT
-            id,
-            orderId,
-            productId,
-            orderProductId,
-            shopId,
-            type,
-            subUserNo,
-            SUM(splitAccount) AS splitAccount,
-            mbOrderId,
-            orderRequestNo,
-            payStatus,
-            productType
+        SELECT id,
+               orderId,
+               productId,
+               orderProductId,
+               shopId,
+               type,
+               subUserNo,
+               SUM(splitAccount) AS splitAccount,
+               mbOrderId,
+               orderRequestNo,
+               payStatus,
+               productType
         FROM cm_split_account
-        WHERE type = 4 AND payStatus = 1 AND splitAccount > 0
-        AND mbOrderId = #{mbOrderId}
+        WHERE type = 4
+          AND payStatus = 1
+          AND splitAccount > 0
+          AND mbOrderId = #{mbOrderId}
         GROUP BY shopId
     </select>
     <select id="getPaidShopAmount" resultType="java.lang.Double">
         SELECT SUM(payAmount)
         FROM cm_pay_shop_record
-        WHERE STATUS = 1 AND delFlag = 0 AND shopOrderID = #{shopOrderId}
+        WHERE STATUS = 1
+          AND delFlag = 0
+          AND shopOrderID = #{shopOrderId}
     </select>
     <select id="getUndividedPaidReceipt" resultType="com.caimei365.order.model.po.OrderReceiptRelationPo">
-        SELECT
-            cror.id,
-            cror.relationType,
-            cror.receiptId,
-            cror.associateAmount,
-            cror.orderId,
-            cror.delFlag,
-            cror.mbOrderId,
-            cror.orderRequestNo,
-            cror.splitStatus,
-            cdr.payType
+        SELECT cror.id,
+               cror.relationType,
+               cror.receiptId,
+               cror.associateAmount,
+               cror.orderId,
+               cror.delFlag,
+               cror.mbOrderId,
+               cror.orderRequestNo,
+               cror.splitStatus,
+               cdr.payType
         FROM cm_receipt_order_relation cror
-        LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
-        LEFT JOIN cm_order co ON cror.orderID = co.orderID
-        WHERE cror.relationType = 2 AND cror.delFlag = 0 AND cror.mbOrderId IS NOT NULL AND cror.splitStatus = 0
-        AND cdr.payWay = 1 AND cdr.receiptDate <![CDATA[  <=  ]]> #{currentTime}
-        AND co.organizeID = 0 AND co.orderType != 2 AND co.refundType != 2
+                 LEFT JOIN cm_discern_receipt cdr ON cror.receiptID = cdr.id
+                 LEFT JOIN cm_order co ON cror.orderID = co.orderID
+        WHERE cror.relationType = 2
+          AND cror.delFlag = 0
+          AND cror.mbOrderId IS NOT NULL
+          AND cror.splitStatus = 0
+          AND cdr.payWay = 1
+          AND cdr.receiptDate <![CDATA[  <=  ]]> #{currentTime}
+          AND co.organizeID = 0
+          AND co.orderType != 2
+          AND co.refundType != 2
     </select>
     <select id="getOrderProductPaidAmount" resultType="java.lang.Double">
         SELECT SUM(splitAccount)
         FROM cm_split_account
         WHERE orderProductId = #{orderProductId}
-        AND payStatus = 1 AND productType = 1
+          AND payStatus = 1
+          AND productType = 1
     </select>
     <select id="getShopCommercialCode" resultType="java.lang.String">
-        SELECT commercialCode FROM cm_shop_splitcode WHERE shopID = #{shopId}
+        SELECT commercialCode
+        FROM cm_shop_splitcode
+        WHERE shopID = #{shopId}
         limit 1
     </select>
     <select id="getPaidShipping" resultType="java.lang.Double">
         SELECT SUM(splitAccount)
         FROM cm_split_account
         WHERE orderId = #{orderId}
-        AND shopId = #{shopId}
-        AND productType = 2 AND payStatus = 1
+          AND shopId = #{shopId}
+          AND productType = 2
+          AND payStatus = 1
     </select>
     <select id="getVipPackagePriceById" resultType="java.lang.Double">
-        SELECT price FROM cm_svip_package WHERE id = #{id};
+        SELECT price
+        FROM cm_svip_package
+        WHERE id = #{id};
     </select>
     <select id="getVipPackageDurationById" resultType="java.lang.Integer">
-        SELECT duration FROM cm_svip_package WHERE id = #{id};
+        SELECT duration
+        FROM cm_svip_package
+        WHERE id = #{id};
     </select>
     <select id="getVipPackageRecord" resultType="com.caimei365.order.model.bo.VipRecordBo">
-        SELECT id, userId, packageId, price, payStatus FROM cm_svip_history WHERE id = #{id};
+        SELECT id, userId, packageId, price, payStatus
+        FROM cm_svip_history
+        WHERE id = #{id};
     </select>
     <select id="getUserVipInfo" resultType="com.caimei365.order.model.po.UserVipPo">
-        SELECT id,userId, beginTime, endTime, updateTime, delFlag
+        SELECT id, userId, beginTime, endTime, updateTime, delFlag
         FROM cm_svip_user
-        WHERE userId = #{#userId} and endTime > now()
+        WHERE userId = #{#userId}
+          and endTime > now()
     </select>
     <select id="findBankCode" resultType="com.caimei365.order.model.vo.BankCodeVo">
         select id, bankName, B2C, B2B, bankLogo, delFlag
@@ -311,39 +441,49 @@
     </select>
     <select id="getCouponPrice" resultType="java.lang.Double">
         SELECT cc.moneyCouponPrice
-        FROM  cm_coupon cc
-        LEFT JOIN cm_coupon_buyrecord ccb ON cc.id=ccb.couponId
+        FROM cm_coupon cc
+                 LEFT JOIN cm_coupon_buyrecord ccb ON cc.id = ccb.couponId
         WHERE ccb.id = #{recordId}
     </select>
     <select id="findPayStatus" resultType="java.lang.Integer">
-        select payStatus from cm_coupon_buyrecord where id = #{recordId}
+        select payStatus
+        from cm_coupon_buyrecord
+        where id = #{recordId}
     </select>
     <select id="findClubType" resultType="java.lang.Integer">
-        SELECT firstClubType FROM club WHERE userId = #{userId}
+        SELECT firstClubType
+        FROM club
+        WHERE userId = #{userId}
     </select>
     <select id="findCouponOrder" resultType="com.caimei365.order.model.vo.CouponCheckVo">
-        SELECT cop.num,co.userId,cop.orderId,cop.productId
+        SELECT cop.num, co.userId, cop.orderId, cop.productId
         FROM cm_order_product cop
-        LEFT JOIN cm_order co ON cop.orderId = co.orderId
-        LEFT JOIN cm_coupon_buyrecord ccb ON ccb.orderId = co.orderId
-        WHERE cop.productId IN (7619,7620)
+                 LEFT JOIN cm_order co ON cop.orderId = co.orderId
+                 LEFT JOIN cm_coupon_buyrecord ccb ON ccb.orderId = co.orderId
+        WHERE cop.productId IN (7619, 7620)
           AND co.receiptStatus = 3
           AND co.delflag = 0
           AND cop.orderId NOT IN (SELECT orderId FROM cm_coupon_buyrecord WHERE orderId IS NOT NULL)
     </select>
     <select id="getAuthVipRecord" resultType="com.caimei365.order.model.bo.VipRecordBo">
-        SELECT id, authUserId as userId, packageId, price, payStatus FROM auth_vip_history WHERE id = #{authVipRecordId};
+        SELECT id, authUserId as userId, packageId, price, payStatus
+        FROM auth_vip_history
+        WHERE id = #{authVipRecordId};
     </select>
     <select id="getAuthVipPackagePrice" resultType="java.lang.Double">
-        SELECT price FROM auth_vip_package WHERE id = #{packageId};
+        SELECT price
+        FROM auth_vip_package
+        WHERE id = #{packageId};
     </select>
     <select id="getAuthVipInfo" resultType="com.caimei365.order.model.po.UserVipPo">
-        SELECT id,authUserId as userId, beginTime, endTime, updateTime, delFlag
+        SELECT id, authUserId as userId, beginTime, endTime, updateTime, delFlag
         FROM auth_vip_user
         WHERE authUserId = #{#userId}
     </select>
     <select id="getAuthVipPackageById" resultType="com.caimei365.order.model.po.AuthVipPackagePo">
-        select duration,unit,price from auth_vip_package where id =#{vipId}
+        select duration, unit, price
+        from auth_vip_package
+        where id = #{vipId}
     </select>
     <select id="getAuthVipPayLink" resultType="com.caimei365.order.model.vo.OrderPayLinkVo">
         SELECT
@@ -367,10 +507,14 @@
         ORDER BY id DESC LIMIT 1
     </select>
     <select id="findShopOrderSplitCode" resultType="java.lang.String">
-        select splitCode from cm_shop_order where shopOrderID = #{shopOrderId}
+        select splitCode
+        from cm_shop_order
+        where shopOrderID = #{shopOrderId}
     </select>
     <select id="getOrderId" resultType="java.lang.Integer">
-        select orderId from cm_shop_order where shopOrderID = #{shopOrderId}
+        select orderId
+        from cm_shop_order
+        where shopOrderID = #{shopOrderId}
     </select>
     <select id="findB2BBankCode" resultType="com.caimei365.order.model.vo.BankCodeVo">
         select id, bankName, B2B, bankLogo, delFlag
@@ -387,6 +531,77 @@
           and delFlag = 0
     </select>
     <select id="getSplitCodeByShopOrderId" resultType="java.lang.String">
-        select splitCode from cm_shop_order where shopOrderID = #{shopOrderId}
+        select splitCode
+        from cm_shop_order
+        where shopOrderID = #{shopOrderId}
+    </select>
+    <select id="findInfoByBankNumber" resultType="com.caimei365.order.model.vo.QuickInfoVo">
+        select id,
+               userId,
+               quickPayUserId,
+               idCard,
+               bankNumber,
+               bankExpireTime,
+               bankCvvCode,
+               bankType,
+               bindMobile,
+               bankUserName,
+               quickPayBankCode
+        from cm_quickpay_info
+        where bankNumber = #{quickPayBankCode}
+          and delflag = 0
+    </select>
+    <select id="findQuickBank" resultType="com.caimei365.order.model.vo.QuickBankVo">
+        SELECT bankCode, cardType, bankName, initial, bankLogo
+        FROM cm_quickpay_bankcode
+        <where>
+            <if test="cardType !=null">
+                AND cardType = #{cardType}
+            </if>
+            <if test="initial !=null and initial!= ''">
+                AND initial = #{initial}
+            </if>
+        </where>
+        ORDER BY initial ASC
+    </select>
+    <select id="getQuickInfoById" resultType="com.caimei365.order.model.vo.QuickInfoVo">
+        SELECT cqi.userid,
+               quickpayuserId,
+               idcard,
+               banknumber,
+               bankExpireTime,
+               bankCvvCode,
+               bankType,
+               bindMobile,
+               bankUserName,
+               quickPayBankCode
+#                ,cqb.quickBindId  as quickPaybindId,
+#                cqb.bindCustomer as customer
+        FROM cm_quickpay_info cqi
+#         LEFT JOIN cm_quickpay_bindcardinfo cqb ON cqi.userId = cqb.userId
+        WHERE cqi.id = #{cardId}
+          AND delflag = 0
+        limit 1
+    </select>
+    <select id="findQuickBankInitial" resultType="java.lang.String">
+        SELECT DISTINCT initial
+        FROM cm_quickpay_bankcode
+        <where>
+            <if test="cardType !=null">
+                AND cardType = #{cardType}
+            </if>
+        </where>
+        ORDER BY initial ASC
+    </select>
+    <select id="findUnCodeBanks" resultType="com.caimei365.order.model.vo.QuickBankVo">
+        select bankCode, cardType, bankName
+        from cm_quick_uncode_banks
+    </select>
+    <select id="findInfoById" resultType="com.caimei365.order.model.vo.QuickInfoVo">
+        select bankNumber, bankType, cqb.bankName
+        from cm_quickpay_info cqi
+                 left join cm_quickpay_bankcode cqb on cqi.quickPayBankCode = cqb.bankCode
+        where cqi.id = #{infoId}
+        limit 1
     </select>
 </mapper>