Ver Fonte

快捷支付bugfix

zhijiezhao há 2 anos atrás
pai
commit
826821a0f5

+ 28 - 13
src/main/java/com/caimei365/order/controller/HeliPayApi.java

@@ -2,6 +2,7 @@ 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;
@@ -54,31 +55,33 @@ public class HeliPayApi {
     @ApiOperation("快捷支付银行信息")
     @ApiImplicitParam(required = false, name = "cardType", value = "银行卡类型")
     @GetMapping("/quick/bank/infos")
-    public ResponseJson<List<QuickBankVo>> quickBankCode(Integer cardType) {
+    public ResponseJson<List<BankListDto>> quickBankCode(Integer cardType) {
         return heliPayService.bankInfos(cardType);
     }
 
 
-    @ApiOperation("验证码绑卡")
+    @ApiOperation("绑卡验证码校验")
     @ApiImplicitParams({
             @ApiImplicitParam(required = true, name = "bindCode", value = "验证码"),
-            @ApiImplicitParam(required = true, name = "orderId", value = "绑定单号")
+            @ApiImplicitParam(required = false, name = "orderId", value = "绑定单号"),
+            @ApiImplicitParam(required = false, name = "infoId", value = "记录Id"),
+            @ApiImplicitParam(required = false, name = "customer", value = "商户号"),
     })
     @GetMapping("/quick/bind/code")
-    public ResponseJson bindCardCheck(String bindCode, String orderId) {
+    public ResponseJson bindCardCheck(String bindCode, String orderId, String infoId,String customer) {
         if (null == bindCode) {
             return ResponseJson.error("验证码不能为空!");
         }
-        if (StringUtils.isBlank(orderId)) {
-            return ResponseJson.error("绑定单号不能为空!");
-        }
-        return heliPayService.bindByCode(bindCode, orderId);
+        return heliPayService.bindByCode(bindCode, orderId, infoId,customer);
     }
 
 
     @ApiOperation("快捷支付预绑卡")
     @PostMapping("/quick/bind/card")
-    public ResponseJson bindBankCard(HeliDto heliDto) {
+    public ResponseJson<Map<String, String>> bindBankCard(HeliDto heliDto) {
+        if (null == heliDto.getUserId()) {
+            return ResponseJson.error("用户Id不能为空!");
+        }
         if (StringUtils.isBlank(heliDto.getQuickPayBankNumber())) {
             return ResponseJson.error("绑定卡号不能为空!");
         }
@@ -275,12 +278,24 @@ public class HeliPayApi {
 
     @ApiOperation("合利宝快捷支付")
     @PostMapping("/quick/pay")
-    public ResponseJson quickPay(HeliDto heliDto, @RequestHeader HttpHeaders headers) {
+    public ResponseJson<Map<String, String>> quickPay(HeliDto heliDto, @RequestHeader HttpHeaders headers) {
+        if (null == heliDto.getUserId()) {
+            return ResponseJson.error("用户Id不能为空!");
+        }
         if (StringUtils.isBlank(heliDto.getPayType())) {
-            return ResponseJson.error("支付类型不能为空!", null);
+            return ResponseJson.error("支付类型不能为空!");
         }
-        if (null == heliDto.getShopOrderId()) {
-            return ResponseJson.error("子订单Id不能为空!", null);
+        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);
     }

+ 3 - 1
src/main/java/com/caimei365/order/mapper/PayOrderMapper.java

@@ -266,9 +266,11 @@ public interface PayOrderMapper {
 
     void insertBindId(String bindId, String customerNumber, String userId, Integer infoId);
 
-    List<QuickBankVo> findQuickBank(Integer cardType);
+    List<QuickBankVo> findQuickBank(Integer cardType,String initial);
 
     QuickInfoVo getQuickInfoById(Integer cardId);
 
     void delQuickBindId(String quickBindId);
+
+    List<String> findQuickBankInitial(Integer cardType);
 }

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

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

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

@@ -2,6 +2,7 @@ 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.*;
@@ -54,15 +55,15 @@ public interface HeliPayService {
 
     ResponseJson<JSONObject> getUnionResult(String mbOrderId, Integer orderFlag, Integer shopOrderId);
 
-    ResponseJson quickPay(HeliDto heliDto, HttpHeaders headers);
+    ResponseJson<Map<String, String>>  quickPay(HeliDto heliDto, HttpHeaders headers);
 
     String quickPayCallback(QuickPayConfirmPayResponseVo res);
 
-    ResponseJson bindBankCard(HeliDto heliDto);
+    ResponseJson<Map<String,String>> bindBankCard(HeliDto heliDto);
 
-    ResponseJson bindByCode(String bindCode, String orderId);
+    ResponseJson bindByCode(String bindCode, String orderId,String infoId,String customer);
 
-    ResponseJson<List<QuickBankVo>> bankInfos(Integer cardType);
+    ResponseJson<List<BankListDto>> bankInfos(Integer cardType);
 
     ResponseJson unBoundCard(Integer cardId);
 }

+ 71 - 12
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;
@@ -1278,7 +1279,7 @@ public class HeliPayServiceImpl implements HeliPayService {
     }
 
     @Override
-    public ResponseJson quickPay(HeliDto heliDto, HttpHeaders headers) {
+    public ResponseJson<Map<String, String>> quickPay(HeliDto heliDto, HttpHeaders headers) {
         FirstQuickPayVo firstQuickPayVo = new FirstQuickPayVo();
         heliPayUtil.setQuickValue(heliDto, firstQuickPayVo, headers);
         Map reqestMap = null;
@@ -1302,7 +1303,9 @@ public class HeliPayServiceImpl implements HeliPayService {
                 log.info("交易失败-------------->" + responseVo.getRt3_retMsg());
                 return ResponseJson.error(responseVo.getRt3_retMsg());
             }
-            return ResponseJson.success();
+            HashMap<String, String> map = new HashMap<>();
+            map.put("customer", responseVo.getRt4_customerNumber());
+            return ResponseJson.success(map);
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -1345,7 +1348,8 @@ public class HeliPayServiceImpl implements HeliPayService {
     }
 
     @Override
-    public ResponseJson bindBankCard(HeliDto heliDto) {
+    public ResponseJson<Map<String, String>> bindBankCard(HeliDto heliDto) {
+        log.info("helidto-------------" + heliDto);
         QuickPayBindCardPreOrderVo confirmBindCardVo = new QuickPayBindCardPreOrderVo();
         String time = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
         String orderId = "bd_" + heliDto.getUserId() + "_" + time;
@@ -1359,11 +1363,20 @@ public class HeliPayServiceImpl implements HeliPayService {
         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 quickInfoVo = 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);
@@ -1372,28 +1385,52 @@ public class HeliPayServiceImpl implements HeliPayService {
                 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 (!"SUCCESS".equals(responseVo.getSmsMsg())) {
+            if (!"0000".equals(responseVo.getRt2_retCode())) {
                 log.info("短信发送失败------------------------");
                 return ResponseJson.error("短信发送失败!");
             }
+            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());
+                if (null != heliDto.getQuickPayBankExpireTime()) {
+                    quickInfoVo.setBankCvvCode(heliDto.getCvvCode());
+                    quickInfoVo.setBankExpireTime(heliDto.getQuickPayBankExpireTime());
+                }
+                payOrderMapper.insertQuickPayInfo(quickInfoVo);
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
-        return ResponseJson.success(orderId);
+        map.put("orderId", orderId);
+        map.put("infoId", quickInfoVo.getId().toString());
+        return ResponseJson.success(map);
     }
 
     @Override
-    public ResponseJson bindByCode(String bindCode, String orderId) {
+    public ResponseJson bindByCode(String bindCode, String orderId, String infoId, String customer) {
         ConfirmBindCardVo confirmBindCardVo = new ConfirmBindCardVo();
         confirmBindCardVo.setP1_bizType("ConfirmBindCard");
         confirmBindCardVo.setP2_customerNumber(Constant.CUSTOMERNUM2);
+        if (StringUtils.isNotBlank(customer)) {
+            //下单
+            confirmBindCardVo.setP2_customerNumber(customer);
+        }
         confirmBindCardVo.setP3_orderId(orderId);
         String[] s = orderId.split("_");
         confirmBindCardVo.setP4_timestamp(s[2]);
@@ -1405,18 +1442,32 @@ public class HeliPayServiceImpl implements HeliPayService {
             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("请求失败");
+                log.info("--------------请求失败----------------");
+                //失败删除info
+                payOrderMapper.delQuickInfo(infoId);
                 return ResponseJson.error("请求失败");
             }
             String resultMsg = (String) resultMap.get("response");
             ConfirmBindCardResponseVo responseVo = JSONObject.parseObject(resultMsg, ConfirmBindCardResponseVo.class);
             if (!MessageHandle.checkSign(responseVo)) {
+                //失败删除info
+                payOrderMapper.delQuickInfo(infoId);
+                log.info("------------验签失败---------------");
                 return ResponseJson.error("验签失败!");
             }
-            if (!"SUCCESS".equals(responseVo.getRt7_bindStatus())) {
+            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));
+            }
         } catch (Exception e) {
             e.printStackTrace();
         }
@@ -1424,8 +1475,16 @@ public class HeliPayServiceImpl implements HeliPayService {
     }
 
     @Override
-    public ResponseJson<List<QuickBankVo>> bankInfos(Integer cardType) {
-        return ResponseJson.success(payOrderMapper.findQuickBank(cardType));
+    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

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

@@ -764,8 +764,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);

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

@@ -50,13 +50,13 @@ public class HeliPayCertConfig {
         }
 
         try {
-            merchantPrivateKey = HeliPayCertUtils.getPrivateKeyByPfx("C:\\Users\\Administrator\\Desktop\\tmpCerts\\C1806995267_2303010060964109_privateKey.pfx","cm20230327");
+            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("C:\\Users\\Administrator\\Desktop\\tmpCerts\\helipayPublicKey.cer");
+            helipayPublicKey = HeliPayCertUtils.getPublicKey("/mnt/newdatadrive/keys/helipayPublicKey.cer");
         } catch (Exception e) {
             throw new RuntimeException("加载合利宝SM2证书公钥异常异常:"+e.getMessage(),e) ;
         }

+ 18 - 1
src/main/resources/mapper/PayOrderMapper.xml

@@ -544,7 +544,14 @@
     <select id="findQuickBank" resultType="com.caimei365.order.model.vo.QuickBankVo">
         SELECT bankCode, cardType, bankName, initial
         FROM cm_quickpay_bankcode
-        where cardType = #{cardType}
+        <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">
@@ -566,4 +573,14 @@
           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>
 </mapper>