Browse Source

快捷支付

zhijiezhao 2 years ago
parent
commit
575e217d98

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

@@ -370,10 +370,10 @@ public class HeliPayUtil {
         firstQuickPayVo.setP9_cardNo(heliDto.getQuickPayBankNumber());
         //银行绑定手机号
         firstQuickPayVo.setP13_phone(heliDto.getQuickPayMobile());
-        //信用卡有效期年,月,cvv2 选择信用卡时必填,否则不填
+        //信用卡有效期年,月,cvv2 选择信用卡时必填,否则不填  传参为2023-04,字符串截取年份
         if (StringUtils.isNotBlank(heliDto.getQuickPayBankExpireTime())) {
             String[] split = heliDto.getQuickPayBankExpireTime().split("-");
-            firstQuickPayVo.setP10_year(split[0]);
+            firstQuickPayVo.setP10_year(split[0].substring(2));
             firstQuickPayVo.setP11_month(split[1]);
             firstQuickPayVo.setP12_cvv2(heliDto.getCvvCode());
         }
@@ -392,7 +392,7 @@ public class HeliPayUtil {
         if (1 == heliDto.getQuickPayFlag()) {
             //普通订单
             OrderVo order = orderCommonMapper.getOrderByShopOrderId(heliDto.getShopOrderId());
-            orderId = order.getOrderNo() + "_" + order.getOrderId() + "_" + heliDto.getShopOrderId() + "_" + infoId;
+            orderId = order.getOrderNo() + "_" + order.getOrderId() + "_" + heliDto.getShopOrderId() + "_" + infoId + "_" + time;
             //普通订单取传参
             firstQuickPayVo.setP15_orderAmount(heliDto.getPayAmount());
             //回调地址

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

@@ -277,4 +277,6 @@ public interface PayOrderMapper {
     void updateQuickPayInfo(QuickInfoVo quickInfoVo);
 
     List<QuickBankVo> findUnCodeBanks();
+
+    QuickInfoVo findInfoById(Integer infoId);
 }

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

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

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

@@ -23,4 +23,6 @@ public class QuickBankVo implements Serializable {
      * 银行名首字母
      */
     private String initial;
+
+    private String bankLogo;
 }

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

@@ -27,4 +27,5 @@ public class QuickInfoVo implements Serializable {
     private String bankUserName;
     private String quickPayBankCode;
     private String customer;
+    private String bankName;
 }

+ 36 - 29
src/main/java/com/caimei365/order/service/impl/HeliPayServiceImpl.java

@@ -238,6 +238,7 @@ public class HeliPayServiceImpl implements HeliPayService {
         Integer orderId = null;
         String payType = "";
         Integer shopOrderId = null;
+        Integer infoId = null;
         if (1 == status) {
             NotifyResponseVo res = (NotifyResponseVo) o;
             mbOrderId = res.getRt3_systemSerial();
@@ -262,12 +263,14 @@ public class HeliPayServiceImpl implements HeliPayService {
             orderId = Integer.valueOf(s[1]);
             shopOrderId = Integer.valueOf(s[2]);
             //infoId
-            Integer infoId = Integer.valueOf(s[3]);
+            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);
@@ -360,6 +363,10 @@ public class HeliPayServiceImpl implements HeliPayService {
         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);
@@ -1357,10 +1364,12 @@ public class HeliPayServiceImpl implements HeliPayService {
                         return "SUCCESS";
                     }
                 } else {
+                    // 支付验证码校验失败删除银行卡信息
                     log.info("快捷支付付款状态异常============================> res:" + res);
                     delQuickInfo(res);
                 }
             } else {
+                // 支付验证码校验失败删除银行卡信息
                 log.info("快捷支付回调验签失败=========================> res:" + res);
                 delQuickInfo(res);
             }
@@ -1379,6 +1388,11 @@ public class HeliPayServiceImpl implements HeliPayService {
 
     @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());
@@ -1424,25 +1438,18 @@ public class HeliPayServiceImpl implements HeliPayService {
                 log.info("短信发送失败------------------------");
                 return ResponseJson.error("短信发送失败!");
             }
-            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 {
-                //绑定成功,存卡
-                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);
+            //绑定成功,存卡
+            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();
         }
@@ -1497,7 +1504,10 @@ public class HeliPayServiceImpl implements HeliPayService {
             }
             if (1 == flag) {
                 ConfirmBindCardResponseVo res = (ConfirmBindCardResponseVo) response;
-                if (!"0000".equals(res.getRt2_retCode())) {
+                // 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("------------绑定失败---------------");
@@ -1527,17 +1537,14 @@ public class HeliPayServiceImpl implements HeliPayService {
                 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("------------绑定失败---------------");
+                // 8015短信验证码错误或已过期
+                if ("8015".equals(res.getRt2_retCode())) {
+                    return ResponseJson.error(-2, res.getRt3_retMsg());
+                } else if (!"0000".equals(res.getRt2_retCode())) {
+                    // 下单支付在回调中修改绑卡信息
+                    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();

+ 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 ("28".equals(d.getPayType()) || "29".equals(d.getPayType())) {
+                    //快捷支付借记卡支付28,快捷支付贷记卡支付29
+                    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) {

+ 9 - 0
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 (28 == discernReceipt.getPayType() || 29 == discernReceipt.getPayType()) {
+                    //快捷支付借记卡支付28,快捷支付贷记卡支付29
+                    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);

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

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

@@ -610,6 +610,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

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

@@ -552,7 +552,7 @@
           and delflag = 0
     </select>
     <select id="findQuickBank" resultType="com.caimei365.order.model.vo.QuickBankVo">
-        SELECT bankCode, cardType, bankName, initial
+        SELECT bankCode, cardType, bankName, initial, bankLogo
         FROM cm_quickpay_bankcode
         <where>
             <if test="cardType !=null">
@@ -597,4 +597,11 @@
         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>