Authored by tanling

支付方式增加花呗和花呗分期

  1 +package com.yohoufo.dal.order;
  2 +
  3 +
  4 +import com.yohoufo.dal.order.model.OrdersPayHbfq;
  5 +
  6 +public interface OrdersPayHbfqMapper {
  7 + int deleteByPrimaryKey(String fqTradeNo);
  8 +
  9 + int insert(OrdersPayHbfq record);
  10 +
  11 + int insertSelective(OrdersPayHbfq record);
  12 +
  13 + OrdersPayHbfq selectByPrimaryKey(String fqTradeNo);
  14 +
  15 + int updateByPrimaryKeySelective(OrdersPayHbfq record);
  16 +
  17 + int updateByPrimaryKey(OrdersPayHbfq record);
  18 +
  19 + int insertOnDuplicateUpdate(OrdersPayHbfq record);
  20 +}
  1 +package com.yohoufo.dal.order.model;
  2 +
  3 +public class OrdersPayHbfq {
  4 + private String fqTradeNo;
  5 +
  6 + private String payOrderCode;
  7 +
  8 + private Integer uid;
  9 +
  10 + private Integer createTime;
  11 +
  12 + private Integer updateTime;
  13 +
  14 + public String getFqTradeNo() {
  15 + return fqTradeNo;
  16 + }
  17 +
  18 + public void setFqTradeNo(String fqTradeNo) {
  19 + this.fqTradeNo = fqTradeNo == null ? null : fqTradeNo.trim();
  20 + }
  21 +
  22 + public String getPayOrderCode() {
  23 + return payOrderCode;
  24 + }
  25 +
  26 + public void setPayOrderCode(String payOrderCode) {
  27 + this.payOrderCode = payOrderCode == null ? null : payOrderCode.trim();
  28 + }
  29 +
  30 + public Integer getUid() {
  31 + return uid;
  32 + }
  33 +
  34 + public void setUid(Integer uid) {
  35 + this.uid = uid;
  36 + }
  37 +
  38 + public Integer getCreateTime() {
  39 + return createTime;
  40 + }
  41 +
  42 + public void setCreateTime(Integer createTime) {
  43 + this.createTime = createTime;
  44 + }
  45 +
  46 + public Integer getUpdateTime() {
  47 + return updateTime;
  48 + }
  49 +
  50 + public void setUpdateTime(Integer updateTime) {
  51 + this.updateTime = updateTime;
  52 + }
  53 +}
  1 +<?xml version="1.0" encoding="UTF-8" ?>
  2 +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3 +<mapper namespace="com.yohoufo.dal.order.OrdersPayHbfqMapper" >
  4 + <resultMap id="BaseResultMap" type="com.yohoufo.dal.order.model.OrdersPayHbfq" >
  5 + <id column="fq_trade_no" property="fqTradeNo" jdbcType="VARCHAR" />
  6 + <result column="pay_order_code" property="payOrderCode" jdbcType="VARCHAR" />
  7 + <result column="uid" property="uid" jdbcType="INTEGER" />
  8 + <result column="create_time" property="createTime" jdbcType="INTEGER" />
  9 + <result column="update_time" property="updateTime" jdbcType="INTEGER" />
  10 + </resultMap>
  11 + <sql id="Base_Column_List" >
  12 + fq_trade_no, pay_order_code, uid, create_time, update_time
  13 + </sql>
  14 +
  15 + <insert id="insertOnDuplicateUpdate" parameterType="com.yoho.yhorder.dal.model.OrdersPayHbfq" >
  16 + insert into orders_pay_hbfq (fq_trade_no, pay_order_code, uid, create_time)
  17 + values(#{fqTradeNo,jdbcType=VARCHAR}, #{payOrderCode,jdbcType=VARCHAR}, #{uid,jdbcType=INTEGER}, UNIX_TIMESTAMP())
  18 + on duplicate key update update_time = UNIX_TIMESTAMP()
  19 + </insert>
  20 +
  21 + <select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.String" >
  22 + select
  23 + <include refid="Base_Column_List" />
  24 + from orders_pay_hbfq
  25 + where fq_trade_no = #{fqTradeNo,jdbcType=VARCHAR}
  26 + </select>
  27 + <delete id="deleteByPrimaryKey" parameterType="java.lang.String" >
  28 + delete from orders_pay_hbfq
  29 + where fq_trade_no = #{fqTradeNo,jdbcType=VARCHAR}
  30 + </delete>
  31 + <insert id="insert" parameterType="com.yohoufo.dal.order.model.OrdersPayHbfq" >
  32 + insert into orders_pay_hbfq (fq_trade_no, pay_order_code, uid,
  33 + create_time, update_time)
  34 + values (#{fqTradeNo,jdbcType=VARCHAR}, #{payOrderCode,jdbcType=VARCHAR}, #{uid,jdbcType=INTEGER},
  35 + #{createTime,jdbcType=INTEGER}, #{updateTime,jdbcType=INTEGER})
  36 + </insert>
  37 + <insert id="insertSelective" parameterType="com.yohoufo.dal.order.model.OrdersPayHbfq" >
  38 + insert into orders_pay_hbfq
  39 + <trim prefix="(" suffix=")" suffixOverrides="," >
  40 + <if test="fqTradeNo != null" >
  41 + fq_trade_no,
  42 + </if>
  43 + <if test="payOrderCode != null" >
  44 + pay_order_code,
  45 + </if>
  46 + <if test="uid != null" >
  47 + uid,
  48 + </if>
  49 + <if test="createTime != null" >
  50 + create_time,
  51 + </if>
  52 + <if test="updateTime != null" >
  53 + update_time,
  54 + </if>
  55 + </trim>
  56 + <trim prefix="values (" suffix=")" suffixOverrides="," >
  57 + <if test="fqTradeNo != null" >
  58 + #{fqTradeNo,jdbcType=VARCHAR},
  59 + </if>
  60 + <if test="payOrderCode != null" >
  61 + #{payOrderCode,jdbcType=VARCHAR},
  62 + </if>
  63 + <if test="uid != null" >
  64 + #{uid,jdbcType=INTEGER},
  65 + </if>
  66 + <if test="createTime != null" >
  67 + #{createTime,jdbcType=INTEGER},
  68 + </if>
  69 + <if test="updateTime != null" >
  70 + #{updateTime,jdbcType=INTEGER},
  71 + </if>
  72 + </trim>
  73 + </insert>
  74 + <update id="updateByPrimaryKeySelective" parameterType="com.yohoufo.dal.order.model.OrdersPayHbfq" >
  75 + update orders_pay_hbfq
  76 + <set >
  77 + <if test="payOrderCode != null" >
  78 + pay_order_code = #{payOrderCode,jdbcType=VARCHAR},
  79 + </if>
  80 + <if test="uid != null" >
  81 + uid = #{uid,jdbcType=INTEGER},
  82 + </if>
  83 + <if test="createTime != null" >
  84 + create_time = #{createTime,jdbcType=INTEGER},
  85 + </if>
  86 + <if test="updateTime != null" >
  87 + update_time = #{updateTime,jdbcType=INTEGER},
  88 + </if>
  89 + </set>
  90 + where fq_trade_no = #{fqTradeNo,jdbcType=VARCHAR}
  91 + </update>
  92 + <update id="updateByPrimaryKey" parameterType="com.yohoufo.dal.order.model.OrdersPayHbfq" >
  93 + update orders_pay_hbfq
  94 + set pay_order_code = #{payOrderCode,jdbcType=VARCHAR},
  95 + uid = #{uid,jdbcType=INTEGER},
  96 + create_time = #{createTime,jdbcType=INTEGER},
  97 + update_time = #{updateTime,jdbcType=INTEGER}
  98 + where fq_trade_no = #{fqTradeNo,jdbcType=VARCHAR}
  99 + </update>
  100 +</mapper>
@@ -71,9 +71,11 @@ public class PaymentController { @@ -71,9 +71,11 @@ public class PaymentController {
71 public ApiResponse pay(@RequestParam(name = "uid") int uid, 71 public ApiResponse pay(@RequestParam(name = "uid") int uid,
72 @RequestParam(name = "orderCode") long orderCode, 72 @RequestParam(name = "orderCode") long orderCode,
73 @RequestParam(name = "payment") int payment, 73 @RequestParam(name = "payment") int payment,
74 - @RequestParam(name = "openid", required = false)String openid){ 74 + @RequestParam(name = "openid", required = false)String openid,
  75 + @RequestParam(name = "hbfqNums", required = false) int hbfqNums){
75 76
76 PaymentRequest request = PaymentRequest.builder().uid(uid).orderCode(orderCode).payment(payment) 77 PaymentRequest request = PaymentRequest.builder().uid(uid).orderCode(orderCode).payment(payment)
  78 + .hbfqNums(hbfqNums)
77 .openid(openid).build(); 79 .openid(openid).build();
78 80
79 logger.info("method com.yohoufo.order.controller.PaymentController.pay in, request is {}", request); 81 logger.info("method com.yohoufo.order.controller.PaymentController.pay in, request is {}", request);
@@ -24,6 +24,11 @@ public class PaymentRequest { @@ -24,6 +24,11 @@ public class PaymentRequest {
24 private int skup; 24 private int skup;
25 25
26 /** 26 /**
  27 + * 花呗分期期数
  28 + */
  29 + private int hbfqNums;
  30 +
  31 + /**
27 * 退款金额 32 * 退款金额
28 */ 33 */
29 private double refundAmount; 34 private double refundAmount;
@@ -6,11 +6,15 @@ import com.google.common.base.Splitter; @@ -6,11 +6,15 @@ import com.google.common.base.Splitter;
6 import com.yoho.error.ServiceError; 6 import com.yoho.error.ServiceError;
7 import com.yoho.error.exception.ServiceException; 7 import com.yoho.error.exception.ServiceException;
8 import com.yohobuy.ufo.model.order.bo.OrderInfo; 8 import com.yohobuy.ufo.model.order.bo.OrderInfo;
  9 +import com.yohobuy.ufo.model.order.common.Payment;
9 import com.yohoufo.common.utils.DateUtil; 10 import com.yohoufo.common.utils.DateUtil;
10 import com.yohoufo.common.utils.HttpClient; 11 import com.yohoufo.common.utils.HttpClient;
11 import com.yohoufo.common.utils.MD5Utils; 12 import com.yohoufo.common.utils.MD5Utils;
12 import com.yohoufo.common.utils.RSAUtils; 13 import com.yohoufo.common.utils.RSAUtils;
13 import com.yohoufo.common.utils.WXUtil; 14 import com.yohoufo.common.utils.WXUtil;
  15 +import com.yohoufo.dal.order.OrdersPayHbfqMapper;
  16 +import com.yohoufo.dal.order.model.OrdersPayHbfq;
  17 +import com.yohoufo.order.common.HbfqEnum;
14 import com.yohoufo.order.config.AlipayConfig; 18 import com.yohoufo.order.config.AlipayConfig;
15 import com.yohoufo.order.constants.RefundContant; 19 import com.yohoufo.order.constants.RefundContant;
16 import com.yohoufo.order.model.*; 20 import com.yohoufo.order.model.*;
@@ -59,6 +63,10 @@ public abstract class AlipayServiceAbstract extends AbstractPayService { @@ -59,6 +63,10 @@ public abstract class AlipayServiceAbstract extends AbstractPayService {
59 } 63 }
60 64
61 65
  66 + @Autowired
  67 + private OrdersPayHbfqMapper ordersPayHbfqDao;
  68 +
  69 +
62 70
63 @Value("${alipay.notifyurl}") 71 @Value("${alipay.notifyurl}")
64 private String notifyURL; 72 private String notifyURL;
@@ -124,7 +132,8 @@ public abstract class AlipayServiceAbstract extends AbstractPayService { @@ -124,7 +132,8 @@ public abstract class AlipayServiceAbstract extends AbstractPayService {
124 public JSONObject prepayRequest(OrderInfo orderInfo) { 132 public JSONObject prepayRequest(OrderInfo orderInfo) {
125 133
126 String orderCode = String.valueOf(orderInfo.getOrderCode()); 134 String orderCode = String.valueOf(orderInfo.getOrderCode());
127 - Map<String, String> queryParams = buildOpenApiPayParams(orderCode, orderInfo.getAmount(), orderInfo.getPayExpireTime()); 135 + Map<String, String> queryParams = buildOpenApiPayParams(orderCode, orderInfo.getAmount(),
  136 + orderInfo.getPayExpireTime(),orderInfo.getPayment(), orderInfo.getHbfqNums(), orderInfo.getUid());
128 StringBuilder res = new StringBuilder(); 137 StringBuilder res = new StringBuilder();
129 for (String key : queryParams.keySet()){ 138 for (String key : queryParams.keySet()){
130 res.append(key); 139 res.append(key);
@@ -414,7 +423,8 @@ public abstract class AlipayServiceAbstract extends AbstractPayService { @@ -414,7 +423,8 @@ public abstract class AlipayServiceAbstract extends AbstractPayService {
414 * @param payExpireTime 423 * @param payExpireTime
415 * @return 424 * @return
416 */ 425 */
417 - private Map<String, String> buildOpenApiPayParams(String tradeNo, BigDecimal amount, int payExpireTime) { 426 + private Map<String, String> buildOpenApiPayParams(String tradeNo, BigDecimal amount, int payExpireTime,
  427 + int payment, int hbfqNums, int uid) {
418 Map<String, String> params = new HashMap<String, String>(); 428 Map<String, String> params = new HashMap<String, String>();
419 params.put("app_id", getAppId()); 429 params.put("app_id", getAppId());
420 params.put("method", "alipay.trade.app.pay"); 430 params.put("method", "alipay.trade.app.pay");
@@ -424,6 +434,27 @@ public abstract class AlipayServiceAbstract extends AbstractPayService { @@ -424,6 +434,27 @@ public abstract class AlipayServiceAbstract extends AbstractPayService {
424 params.put("version", "1.0"); 434 params.put("version", "1.0");
425 params.put("notify_url", notifyURL); 435 params.put("notify_url", notifyURL);
426 436
  437 + if (Payment.isHB(payment)){
  438 + params.put("specified_channel", "pcredit"); // 花呗单渠道
  439 +
  440 + }else if(Payment.isHBFQ(payment)){
  441 +
  442 + params.put("specified_channel", "pcreditpayInstallment"); // 花呗分期
  443 +
  444 + HbfqEnum hbfqEnum = HbfqEnum.getByfqTerms(hbfqNums);
  445 + if(hbfqEnum == null) {
  446 + logger.warn("fqNums from req invalid, fqNums: {}, orderCode: {}", hbfqNums, tradeNo);
  447 + throw new ServiceException(ServiceError.ORDER_FQNUM_INVALID);
  448 + }
  449 +
  450 + String outTradeNo = tradeNo + hbfqEnum.getTradeNoPostfix();
  451 + params.put("out_trade_no", outTradeNo);
  452 + params.put("extend_params", getHbfqParam(hbfqEnum.getFqTerms()).toJSONString());
  453 +
  454 + // 记录分期
  455 + recordOrdersPayHbfq(outTradeNo, tradeNo, uid);
  456 + }
  457 +
427 458
428 JSONObject bizJson = new JSONObject(true); 459 JSONObject bizJson = new JSONObject(true);
429 bizJson.put("timeout_express", payExpireTime+"m"); //该订单允许的最晚付款时间 460 bizJson.put("timeout_express", payExpireTime+"m"); //该订单允许的最晚付款时间
@@ -451,6 +482,37 @@ public abstract class AlipayServiceAbstract extends AbstractPayService { @@ -451,6 +482,37 @@ public abstract class AlipayServiceAbstract extends AbstractPayService {
451 482
452 483
453 /** 484 /**
  485 + * 花呗分期payOrderCode记录
  486 + * @param hbfqRecord
  487 + * @return
  488 + */
  489 + public boolean recordOrdersPayHbfq(String outTradeNo, String tradeNo, int uid) {
  490 + logger.info("recordOrdersPayHbfq outTradeNo: {}, tradeNo: {}, uid: {}", outTradeNo, tradeNo, uid);
  491 +
  492 + OrdersPayHbfq record = new OrdersPayHbfq();
  493 + record.setFqTradeNo(outTradeNo);
  494 + record.setPayOrderCode(tradeNo);
  495 + record.setUid(uid);
  496 + try {
  497 +
  498 + ordersPayHbfqDao.insertOnDuplicateUpdate(record);
  499 + return true;
  500 + } catch (Exception e) {
  501 + logger.warn("recordOrdersPayHbfq failed, req: {}, ex: ", record, e);
  502 + }
  503 +
  504 + return false;
  505 + }
  506 +
  507 +
  508 + private JSONObject getHbfqParam(int fqNums) {
  509 + JSONObject json = new JSONObject();
  510 + json.put("hb_fq_num", String.valueOf(fqNums));
  511 + json.put("hb_fq_seller_percent", "0"); //用户承担手续费
  512 + return json;
  513 + }
  514 +
  515 + /**
454 * 获取openapi支付宝待签名字符串 516 * 获取openapi支付宝待签名字符串
455 * @param paramsMap 517 * @param paramsMap
456 * @return 518 * @return
@@ -475,12 +537,17 @@ public abstract class AlipayServiceAbstract extends AbstractPayService { @@ -475,12 +537,17 @@ public abstract class AlipayServiceAbstract extends AbstractPayService {
475 } 537 }
476 538
477 539
478 -  
479 public PaymentData getPaymentData(Map<String, String> params) { 540 public PaymentData getPaymentData(Map<String, String> params) {
480 PaymentData payData = new PaymentData(); 541 PaymentData payData = new PaymentData();
481 try { 542 try {
482 String outTradeNo = params.get("out_trade_no"); 543 String outTradeNo = params.get("out_trade_no");
483 544
  545 + // 花呗分期,获取订单号
  546 + OrdersPayHbfq hbfqRecord = ordersPayHbfqDao.selectByPrimaryKey(outTradeNo);
  547 + if(hbfqRecord != null) {
  548 + outTradeNo = hbfqRecord.getPayOrderCode();
  549 + }
  550 +
484 payData.setOrderCode(outTradeNo); 551 payData.setOrderCode(outTradeNo);
485 payData.setTotalFee(Double.parseDouble(params.get("total_fee") != null ? params.get("total_fee") : params.get("total_amount"))); 552 payData.setTotalFee(Double.parseDouble(params.get("total_fee") != null ? params.get("total_fee") : params.get("total_amount")));
486 payData.setBankCode(""); 553 payData.setBankCode("");
@@ -103,6 +103,7 @@ datasources: @@ -103,6 +103,7 @@ datasources:
103 - com.yohoufo.dal.order.InviteCodeSequenceRandomMapper 103 - com.yohoufo.dal.order.InviteCodeSequenceRandomMapper
104 - com.yohoufo.dal.order.SellerGoodsStatusFlowMapper 104 - com.yohoufo.dal.order.SellerGoodsStatusFlowMapper
105 - com.yohoufo.dal.order.CmsPayMapper 105 - com.yohoufo.dal.order.CmsPayMapper
  106 + - com.yohoufo.dal.order.OrdersPayHbfqMapper
106 107
107 ufo_promotion: 108 ufo_promotion:
108 servers: 109 servers:
@@ -102,6 +102,7 @@ datasources: @@ -102,6 +102,7 @@ datasources:
102 - com.yohoufo.dal.order.InviteCodeSequenceRandomMapper 102 - com.yohoufo.dal.order.InviteCodeSequenceRandomMapper
103 - com.yohoufo.dal.order.SellerGoodsStatusFlowMapper 103 - com.yohoufo.dal.order.SellerGoodsStatusFlowMapper
104 - com.yohoufo.dal.order.CmsPayMapper 104 - com.yohoufo.dal.order.CmsPayMapper
  105 + - com.yohoufo.dal.order.OrdersPayHbfqMapper
105 106
106 ufo_promotion: 107 ufo_promotion:
107 servers: 108 servers: