浏览代码

快捷支付bugfix

zhijiezhao 2 年之前
父节点
当前提交
43b5b089d4

+ 21 - 14
src/main/java/com/caimei365/order/components/HeliPayUtil.java

@@ -8,6 +8,7 @@ import com.caimei365.order.model.dto.HeliDto;
 import com.caimei365.order.model.enums.BizType;
 import com.caimei365.order.model.vo.*;
 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;
@@ -338,21 +339,27 @@ public class HeliPayUtil {
         if (null != info && null != info.getId()) {
             infoId = info.getId();
         } else {
-            QuickInfoVo quickInfoVo = new QuickInfoVo();
-            quickInfoVo.setBankNumber(heliDto.getQuickPayBankNumber());
-            quickInfoVo.setBindMobile(heliDto.getQuickPayMobile());
-            quickInfoVo.setUserId(heliDto.getUserId());
-            quickInfoVo.setQuickPayUserId("U" + heliDto.getUserId());
-            quickInfoVo.setIdCard(heliDto.getIdCard());
-            quickInfoVo.setBankUserName(heliDto.getQuickPayUserName());
+            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()) {
-                quickInfoVo.setBankCvvCode(heliDto.getCvvCode());
-                quickInfoVo.setBankExpireTime(heliDto.getQuickPayBankExpireTime());
+                quick.setBankCvvCode(heliDto.getCvvCode());
+                quick.setBankExpireTime(heliDto.getQuickPayBankExpireTime());
             }
-            payOrderMapper.insertQuickPayInfo(quickInfoVo);
-            infoId = quickInfoVo.getId();
+            if (null == quickInfoVo) {
+                payOrderMapper.insertQuickPayInfo(quick);
+            } else {
+                quick.setId(quickInfoVo.getId());
+                payOrderMapper.updateQuickPayInfo(quick);
+            }
+            infoId = quick.getId();
         }
-        firstQuickPayVo.setP1_bizType(BizType.getP1ByType(heliDto.getPayType()));
+        firstQuickPayVo.setP1_bizType("QuickPayFirstPayPreOrder");
         // 首次下单接口统一视为未绑卡处理
         firstQuickPayVo.setP3_userId("U" + heliDto.getUserId());
         //姓名
@@ -364,7 +371,7 @@ public class HeliPayUtil {
         //银行绑定手机号
         firstQuickPayVo.setP13_phone(heliDto.getQuickPayMobile());
         //信用卡有效期年,月,cvv2 选择信用卡时必填,否则不填
-        if (null != heliDto.getQuickPayBankExpireTime()) {
+        if (StringUtils.isNotBlank(heliDto.getQuickPayBankExpireTime())) {
             String[] split = heliDto.getQuickPayBankExpireTime().split("-");
             firstQuickPayVo.setP10_year(split[0]);
             firstQuickPayVo.setP11_month(split[1]);
@@ -377,7 +384,7 @@ public class HeliPayUtil {
          *  QuickPayFlag快捷支付类型标记1订单2超级会员3认证通会员4优惠券
          */
         String orderId = "";
-        String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
+        String time = new SimpleDateFormat("MMddHHmmssSSS").format(new Date());
         //非订单统一回调地址  order/pay/unorder/quick/callback
         firstQuickPayVo.setP23_serverCallbackUrl(quickUnOrderUrl);
         //非订单都是走信息

+ 41 - 6
src/main/java/com/caimei365/order/controller/HeliPayApi.java

@@ -59,20 +59,55 @@ public class HeliPayApi {
         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 = false, name = "orderId", value = "绑定单号"),
+            @ApiImplicitParam(required = true, name = "orderId", value = "绑定单号"),
             @ApiImplicitParam(required = false, name = "infoId", value = "记录Id"),
-            @ApiImplicitParam(required = false, name = "customer", value = "商户号"),
+            @ApiImplicitParam(required = false, name = "customer", value = "商户号")
     })
     @GetMapping("/quick/bind/code")
-    public ResponseJson bindCardCheck(String bindCode, String orderId, String infoId,String customer) {
-        if (null == bindCode) {
+    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("验证码不能为空!");
         }
-        return heliPayService.bindByCode(bindCode, orderId, infoId,customer);
+        if (StringUtils.isBlank(orderId)) {
+            return ResponseJson.error("订单Id不能为空!");
+        }
+        return heliPayService.bindByCode(flag, bindCode, orderId, infoId, customer);
     }
 
 
@@ -282,7 +317,7 @@ public class HeliPayApi {
         if (null == heliDto.getUserId()) {
             return ResponseJson.error("用户Id不能为空!");
         }
-        if (StringUtils.isBlank(heliDto.getPayType())) {
+        if (null == heliDto.getQuickPayFlag()) {
             return ResponseJson.error("支付类型不能为空!");
         }
         if (StringUtils.isBlank(heliDto.getQuickPayBankNumber())) {

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

@@ -273,4 +273,8 @@ public interface PayOrderMapper {
     void delQuickBindId(String quickBindId);
 
     List<String> findQuickBankInitial(Integer cardType);
+
+    void updateQuickPayInfo(QuickInfoVo quickInfoVo);
+
+    List<QuickBankVo> findUnCodeBanks();
 }

+ 3 - 0
src/main/java/com/caimei365/order/model/dto/HeliDto.java

@@ -110,5 +110,8 @@ public class HeliDto implements Serializable {
 
     @ApiModelProperty("快捷支付类型标记1订单2超级会员3认证通会员4优惠券")
     private Integer quickPayFlag;
+
+    @ApiModelProperty("支付卡类型 1借记卡/2贷记卡")
+    private Integer cardType;
 }
 

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

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

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

@@ -3,10 +3,12 @@ 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;
 

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

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

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

+ 5 - 1
src/main/java/com/caimei365/order/service/HeliPayService.java

@@ -61,9 +61,13 @@ public interface HeliPayService {
 
     ResponseJson<Map<String,String>> bindBankCard(HeliDto heliDto);
 
-    ResponseJson bindByCode(String bindCode, String orderId,String infoId,String customer);
+    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();
 }

+ 205 - 57
src/main/java/com/caimei365/order/service/impl/HeliPayServiceImpl.java

@@ -27,6 +27,7 @@ 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.fasterxml.jackson.databind.ObjectMapper;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.http.HttpStatus;
@@ -264,11 +265,9 @@ public class HeliPayServiceImpl implements HeliPayService {
             Integer 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);
             // 快捷支付借记卡支付28,快捷支付贷记卡支付29
             payType = 1 == bankType ? "28" : "29";
-            payOrderMapper.insertBindId(res.getRt10_bindId(), res.getRt4_customerNumber(), userId, infoId);
         }
         // 订单信息
         OrderVo order = orderCommonMapper.getOrderByOrderId(orderId);
@@ -1281,6 +1280,7 @@ public class HeliPayServiceImpl implements HeliPayService {
     @Override
     public ResponseJson<Map<String, String>> quickPay(HeliDto heliDto, HttpHeaders headers) {
         FirstQuickPayVo firstQuickPayVo = new FirstQuickPayVo();
+        log.info("helidto------------" + heliDto);
         heliPayUtil.setQuickValue(heliDto, firstQuickPayVo, headers);
         Map reqestMap = null;
         try {
@@ -1303,8 +1303,38 @@ public class HeliPayServiceImpl implements HeliPayService {
                 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();
@@ -1354,7 +1384,7 @@ public class HeliPayServiceImpl implements HeliPayService {
         String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
         String orderId = "bd_" + heliDto.getUserId() + "_" + time;
         confirmBindCardVo.setP1_bizType("QuickPayBindCardPreOrder");
-        //todo 一次请求只能绑定一个e商户,暂定绑定网络,有支付请求走预下单直接绑定
+        //一次请求只能绑定一个e商户,暂定绑定网络,有支付请求走预下单直接绑定
         confirmBindCardVo.setP2_customerNumber(CUSTOMERNUM2);
         confirmBindCardVo.setP3_userId("U" + heliDto.getUserId());
         confirmBindCardVo.setP4_orderId(orderId);
@@ -1373,8 +1403,7 @@ public class HeliPayServiceImpl implements HeliPayService {
         confirmBindCardVo.setProtocolType("protocol");
         confirmBindCardVo.setSendValidateCode("true");
         confirmBindCardVo.setSignatureType("SM3WITHSM2");
-
-        QuickInfoVo quickInfoVo = new QuickInfoVo();
+        QuickInfoVo quick = new QuickInfoVo();
         Map reqestMap = null;
         Map<String, String> map = new HashMap<>();
         try {
@@ -1395,49 +1424,56 @@ public class HeliPayServiceImpl implements HeliPayService {
                 log.info("短信发送失败------------------------");
                 return ResponseJson.error("短信发送失败!");
             }
-            quickInfoVo = payOrderMapper.findInfoByBankNumber(heliDto.getQuickPayBankNumber());
+            QuickInfoVo quickInfoVo = payOrderMapper.findInfoByBankNumber(heliDto.getQuickPayBankNumber());
             if (null != quickInfoVo && null != quickInfoVo.getId()) {
                 map.put("orderId", orderId);
                 map.put("infoId", quickInfoVo.getId().toString());
                 return ResponseJson.success(map);
             } else {
                 //绑定成功,存卡
-                quickInfoVo.setBankNumber(heliDto.getQuickPayBankNumber());
-                quickInfoVo.setBindMobile(heliDto.getQuickPayMobile());
-                quickInfoVo.setUserId(heliDto.getUserId());
-                quickInfoVo.setQuickPayUserId("U" + heliDto.getUserId());
-                quickInfoVo.setIdCard(heliDto.getIdCard());
-                quickInfoVo.setBankUserName(heliDto.getQuickPayUserName());
+                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()) {
-                    quickInfoVo.setBankCvvCode(heliDto.getCvvCode());
-                    quickInfoVo.setBankExpireTime(heliDto.getQuickPayBankExpireTime());
+                    quick.setBankCvvCode(heliDto.getCvvCode());
+                    quick.setBankExpireTime(heliDto.getQuickPayBankExpireTime());
                 }
-                payOrderMapper.insertQuickPayInfo(quickInfoVo);
+                payOrderMapper.insertQuickPayInfo(quick);
             }
         } catch (Exception e) {
             e.printStackTrace();
         }
         map.put("orderId", orderId);
-        map.put("infoId", quickInfoVo.getId().toString());
+        map.put("infoId", quick.getId().toString());
         return ResponseJson.success(map);
     }
 
     @Override
-    public ResponseJson bindByCode(String bindCode, String orderId, String infoId, String customer) {
+    public ResponseJson bindByCode(Integer flag, String bindCode, String orderId, String infoId, String customer) {
         ConfirmBindCardVo confirmBindCardVo = new ConfirmBindCardVo();
-        confirmBindCardVo.setP1_bizType("ConfirmBindCard");
-        confirmBindCardVo.setP2_customerNumber(Constant.CUSTOMERNUM2);
+        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);
-        String[] s = orderId.split("_");
-        confirmBindCardVo.setP4_timestamp(s[2]);
+        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);
@@ -1448,25 +1484,60 @@ public class HeliPayServiceImpl implements HeliPayService {
                 return ResponseJson.error("请求失败");
             }
             String resultMsg = (String) resultMap.get("response");
-            ConfirmBindCardResponseVo responseVo = JSONObject.parseObject(resultMsg, ConfirmBindCardResponseVo.class);
-            if (!MessageHandle.checkSign(responseVo)) {
+            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 (!"0000".equals(responseVo.getRt2_retCode())) {
-                //失败删除info
-                payOrderMapper.delQuickInfo(infoId);
-                log.info("------------绑定失败---------------");
-                return ResponseJson.error("绑定失败!");
-            }
-            if (StringUtils.isNotBlank(infoId)) {
-                /** 绑定成功 保存合利宝bindId
-                 *  传infoId是绑卡,传customer是付款
-                 **/
-                payOrderMapper.updateQuickInfo(responseVo.getRt8_bankId(), null, Integer.valueOf(infoId));
-                payOrderMapper.insertBindId(responseVo.getRt10_bindId(), responseVo.getRt4_customerNumber(), responseVo.getRt5_userId().substring(1), Integer.valueOf(infoId));
+            if (1 == flag) {
+                ConfirmBindCardResponseVo res = (ConfirmBindCardResponseVo) response;
+                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;
+                if (!"0000".equals(res.getRt2_retCode())) {
+                    //失败删除info
+                    payOrderMapper.delQuickInfo(infoId);
+                    log.info("------------绑定失败---------------");
+                    return ResponseJson.error(res.getRt3_retMsg());
+                }
+                String bankCode = res.getRt11_bankId();
+                Integer bankType = "DEBIT".equals(res.getRt12_onlineCardType()) ? 1 : 2;
+                payOrderMapper.updateQuickInfo(bankCode, bankType, Integer.valueOf(infoId));
+                String userId = res.getRt14_userId().substring(1);
+                payOrderMapper.insertBindId(res.getRt10_bindId(), res.getRt4_customerNumber(), userId, Integer.valueOf(infoId));
             }
         } catch (Exception e) {
             e.printStackTrace();
@@ -1474,6 +1545,27 @@ public class HeliPayServiceImpl implements HeliPayService {
         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);
@@ -1489,42 +1581,98 @@ public class HeliPayServiceImpl implements HeliPayService {
 
     @Override
     public ResponseJson unBoundCard(Integer cardId) {
-        BankCardUnbindVo unbind = new BankCardUnbindVo();
+//        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());
-        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");
+        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 {
-            Map reqestMap = MessageHandle.getReqestMap(unbind);
+            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("----------------解绑银行卡请求失败-----------------");
-                return ResponseJson.error("请求失败!");
+                log.info("请求失败");
             }
             String resultMsg = (String) resultMap.get("response");
-            ConfirmBindCardResponseVo responseVo = JSONObject.parseObject(resultMsg, ConfirmBindCardResponseVo.class);
+            OnceBindResponseVo responseVo = JSONObject.parseObject(resultMsg, OnceBindResponseVo.class);
             if (!MessageHandle.checkSign(responseVo)) {
-                log.info("------------------------解绑银行卡验签失败-------------------");
-                return ResponseJson.error("解绑银行卡验签失败!");
+                log.info("验签失败");
             }
             if (!"0000".equals(responseVo.getRt2_retCode())) {
-                log.info("-----------------银行卡解绑失败---------------------");
-                return ResponseJson.error("银行卡解绑失败!");
+                log.info(responseVo.getRt3_retMsg());
             }
-            // 解绑成功 cm_quickpay_info置为删除
-            payOrderMapper.delQuickInfo(cardId.toString());
-            payOrderMapper.delQuickBindId(info.getQuickPaybindId());
+            html = responseVo.getRt5_formData();
         } catch (Exception e) {
             e.printStackTrace();
-            log.info("交易异常:" + e.getMessage());
         }
-        return null;
+        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) {

+ 21 - 7
src/main/resources/mapper/PayOrderMapper.xml

@@ -107,9 +107,9 @@
     <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)
+                                     bankCvvCode, bankType, bindMobile, bankUserName, quickPayBankCode, delFlag)
         values (#{userId}, #{quickPayUserId}, #{idCard}, #{bankNumber}, #{bankExpireTime},
-                #{bankCvvCode}, #{bankType}, #{bindMobile}, #{bankUserName}, #{quickPayBankCode})
+                #{bankCvvCode}, #{bankType}, #{bindMobile}, #{bankUserName}, #{quickPayBankCode}, 1)
     </insert>
     <insert id="insertBindId">
         insert into cm_quickpay_bindcardinfo(quickbindid, bindcustomer, userid, quickinfoid)
@@ -238,9 +238,19 @@
     <update id="updateQuickInfo">
         update cm_quickpay_info
         set bankType         = #{bankType},
-            quickPayBankCode = #{bankCode}
+            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
@@ -564,11 +574,11 @@
                bankType,
                bindMobile,
                bankUserName,
-               quickPayBankCode,
-               cqb.quickBindId  as quickPaybindId,
-               cqb.bindCustomer as customer
+               quickPayBankCode
+#                ,cqb.quickBindId  as quickPaybindId,
+#                cqb.bindCustomer as customer
         FROM cm_quickpay_info cqi
-                 LEFT JOIN cm_quickpay_bindcardinfo cqb ON cqi.id = cqb.quickInfoId
+#         LEFT JOIN cm_quickpay_bindcardinfo cqb ON cqi.userId = cqb.userId
         WHERE cqi.id = #{cardId}
           AND delflag = 0
         limit 1
@@ -583,4 +593,8 @@
         </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>
 </mapper>