浏览代码

优惠券购买接口

zhijiezhao 3 年之前
父节点
当前提交
70d21bd632

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

@@ -43,6 +43,10 @@ public class HeliPayUtil {
     private String vipUnionPay;
     @Value("${pay.second-union-url}")
     private String secondUnionPay;
+    @Value("${pay.coupon-notify-url}")
+    private String couponUrl;
+    @Value("${pay.coupon-union-url}")
+    private String couponUnionPay;
 
     private final String publicCode="wx91c4152b60ca91a3";
 
@@ -70,17 +74,17 @@ public class HeliPayUtil {
             //收款账号
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
             //立即分账,固定金额
-            pay.setSplitBillType("FIXED_AMOUNT");
+//            pay.setSplitBillType("FIXED_AMOUNT");
             //分账对象
-            PaySplitVo paySplitVo = new PaySplitVo();
+//            PaySplitVo paySplitVo = new PaySplitVo();
             //分账账户邮箱 二手进信息
             //交易分账规则串必须包含两个参数,分别是分账商户的合法邮箱splitBillMerchantEmail和对应分账合法金额splitBillAmount,
             //分账金额单位:元,最多保留两位小数,分账规则串中不可以重复出现同一邮箱,分账规则串中不可以传分账发起方自己;
-            paySplitVo.setSplitBillMerchantEmail(Constant.XX_MAIL);
+//            paySplitVo.setSplitBillMerchantEmail(Constant.XX_MAIL);
             //手续费0.25% 支付金额*(1-0.25%)
-            paySplitVo.setSplitBillAmount("99.75");
-            String s = JSON.toJSONString(new ArrayList<PaySplitVo>().add(paySplitVo));
-            pay.setRuleJson(s);
+//            paySplitVo.setSplitBillAmount("99.75");
+//            String s = JSON.toJSONString(new ArrayList<PaySplitVo>().add(paySplitVo));
+//            pay.setRuleJson(s);
         } else if ("vip".equals(payFlag)) {
             VipRecordBo record = payOrderMapper.getVipPackageRecord(heliDto.getVipRecordId());
             Double price = payOrderMapper.getVipPackagePriceById(record.getPackageId());
@@ -94,18 +98,29 @@ public class HeliPayUtil {
             pay.setP18_desc(attach);
             //收款账号
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
-            //立即分账,固定金额
-            pay.setSplitBillType("FIXED_AMOUNT");
-            //分账对象
-            PaySplitVo paySplitVo = new PaySplitVo();
+//            //立即分账,固定金额
+//            pay.setSplitBillType("FIXED_AMOUNT");
+//            //分账对象
+//            PaySplitVo paySplitVo = new PaySplitVo();
             //分账账户邮箱 超级会员默认进信息
             //交易分账规则串必须包含两个参数,分别是分账商户的合法邮箱splitBillMerchantEmail和对应分账合法金额splitBillAmount,
             //分账金额单位:元,最多保留两位小数,分账规则串中不可以重复出现同一邮箱,分账规则串中不可以传分账发起方自己;
-            paySplitVo.setSplitBillMerchantEmail(Constant.XX_MAIL);
+//            paySplitVo.setSplitBillMerchantEmail(Constant.XX_MAIL);
             //手续费0.25% 支付金额*(1-0.25%)
-            paySplitVo.setSplitBillAmount(MathUtil.mul(price,0.9975).toString());
-            String s = JSON.toJSONString(new ArrayList<PaySplitVo>().add(paySplitVo));
-            pay.setRuleJson(s);
+//            paySplitVo.setSplitBillAmount(MathUtil.mul(price,0.9975).toString());
+//            String s = JSON.toJSONString(new ArrayList<PaySplitVo>().add(paySplitVo));
+//            pay.setRuleJson(s);
+        }else if("coupon".equals(payFlag)){
+            Double couponPrice = payOrderMapper.getCouponPrice(heliDto.getCouponRecordId());
+            orderId = heliDto.getUserId() + "C" + heliDto.getCouponId() + "R" + heliDto.getCouponRecordId() + "T" + time + environment;
+            pay.setP9_orderAmount(couponPrice.toString());
+            pay.setP12_notifyUrl(couponUrl);
+            String product = "采美订单" + orderId;
+            pay.setP15_goodsName(product);
+            String attach = heliDto.getCouponId() + "," + heliDto.getUserId() + "," + heliDto.getCouponRecordId() + "," + BizType.getNumByType(heliDto.getPayType())+","+heliDto.getSource();
+            pay.setP18_desc(attach);
+            //收款账号
+            pay.setP3_customerNumber(Constant.CUSTOMERNUM);
         } else if ("order".equals(payFlag)) {
             //普通订单
 //            pay.setP3_customerNumber(Constant.CUSTOMERNUM2);
@@ -156,16 +171,16 @@ public class HeliPayUtil {
             pay.setP14_desc(heliDto.getProductId().toString() + "," + BizType.getNumByType(heliDto.getPayType()));
             //网络收款,分账进信息
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
-            PaySplitVo paySplitVo = new PaySplitVo();
+//            PaySplitVo paySplitVo = new PaySplitVo();
             //分账规则穿给分账账户邮箱 二手进信息
             //交易分账规则串必须包含两个参数,分别是分账商户的合法邮箱splitBillMerchantEmail和对应分账合法金额splitBillAmount,
             //分账金额单位:元,最多保留两位小数,分账规则串中不可以重复出现同一邮箱,分账规则串中不可以传分账发起方自己;
-            paySplitVo.setSplitBillMerchantEmail(Constant.XX_MAIL);
+//            paySplitVo.setSplitBillMerchantEmail(Constant.XX_MAIL);
             //手续费0.25% 100*(1-0.25%)
-            paySplitVo.setSplitBillAmount("99.75");
-            String s = JSON.toJSONString(new ArrayList<PaySplitVo>().add(paySplitVo));
-            pay.setRuleJson(s);
-            pay.setSplitBillType("FIXED_AMOUNT");
+//            paySplitVo.setSplitBillAmount("99.75");
+//            String s = JSON.toJSONString(new ArrayList<PaySplitVo>().add(paySplitVo));
+//            pay.setRuleJson(s);
+//            pay.setSplitBillType("FIXED_AMOUNT");
         }else if ("vip".equals(payFlag)) {
             VipRecordBo record = payOrderMapper.getVipPackageRecord(heliDto.getVipRecordId());
             Double price = payOrderMapper.getVipPackagePriceById(record.getPackageId());
@@ -178,15 +193,27 @@ public class HeliPayUtil {
             pay.setP14_desc(attach);
             //收款账号
             pay.setP3_customerNumber(Constant.CUSTOMERNUM);
-            PaySplitVo paySplitVo = new PaySplitVo();
+//            PaySplitVo paySplitVo = new PaySplitVo();
             //进信息
-            paySplitVo.setSplitBillMerchantEmail(Constant.XX_MAIL);
+//            paySplitVo.setSplitBillMerchantEmail(Constant.XX_MAIL);
             //价格*0.9975
-            paySplitVo.setSplitBillAmount(MathUtil.mul(price,0.9975).toString());
-            String s = JSON.toJSONString(new ArrayList<PaySplitVo>().add(paySplitVo));
-            pay.setRuleJson(s);
-            pay.setSplitBillType("FIXED_AMOUNT");
-        }else if ("order".equals(payFlag)) {
+//            paySplitVo.setSplitBillAmount(MathUtil.mul(price,0.9975).toString());
+//            String s = JSON.toJSONString(new ArrayList<PaySplitVo>().add(paySplitVo));
+//            pay.setRuleJson(s);
+//            pay.setSplitBillType("FIXED_AMOUNT");
+        }else if("coupon".equals(payFlag)){
+            Double couponPrice = payOrderMapper.getCouponPrice(heliDto.getCouponRecordId());
+            orderId = heliDto.getUserId() + "C" + heliDto.getCouponId() + "R" + heliDto.getCouponRecordId() + "T" + time + environment;
+            pay.setP5_orderAmount(couponPrice.toString());
+            pay.setP9_notifyUrl(couponUrl);
+            String product = "采美订单" + orderId;
+            pay.setP12_goodsName(product);
+            String attach = heliDto.getCouponId() + "," + heliDto.getUserId() + "," + heliDto.getCouponRecordId() + "," + BizType.getNumByType(heliDto.getPayType())+","+heliDto.getSource();
+            pay.setP14_desc(attach);
+            //收款账号
+            pay.setP3_customerNumber(Constant.CUSTOMERNUM);
+        }
+        else if ("order".equals(payFlag)) {
             //以子订单为单位付款,商户号为商品的分帐号
 //            pay.setP3_customerNumber(Constant.CUSTOMERNUM2);
             OrderVo order = orderCommonMapper.getOrderByOrderId(heliDto.getOrderId());
@@ -246,7 +273,20 @@ public class HeliPayUtil {
                 String attach = record.getPackageId() + "," + record.getUserId() + "," + heliDto.getVipRecordId() + "," + BizType.getNumByType(heliDto.getUserType());
                 URLEncoder.encode(attach,"UTF-8");
                 pay.setP15_desc(attach);
-            }else if ("order".equals(payFlag)) {
+            }else if("coupon".equals(payFlag)){
+                pay.setP3_customerNumber(Constant.CUSTOMERNUM);
+                Double couponPrice = payOrderMapper.getCouponPrice(heliDto.getCouponRecordId());
+                pay.setP4_orderAmount(couponPrice.toString());
+                pay.setP12_serverCallback(couponUnionPay);
+                orderId = heliDto.getUserId() + "C" + heliDto.getCouponId() + "R" + heliDto.getCouponRecordId() + "T" + time + environment;
+                String product = "采美订单" + orderId;
+                URLEncoder.encode(product,"UTF-8");
+                pay.setP8_goodsName(product);
+                String attach = heliDto.getCouponId() + "," + heliDto.getUserId() + "," + heliDto.getCouponRecordId() + "," + BizType.getNumByType(heliDto.getPayType())+","+heliDto.getSource();
+                URLEncoder.encode(attach,"UTF-8");
+                pay.setP15_desc(attach);
+            }
+            else if ("order".equals(payFlag)) {
 //                pay.setP3_customerNumber(Constant.CUSTOMERNUM2);
                 OrderVo order = orderCommonMapper.getOrderByOrderId(heliDto.getOrderId());
                 orderId = order.getOrderNo() + "T" + time + environment;

+ 118 - 0
src/main/java/com/caimei365/order/controller/HeliPayNonOrderApi.java

@@ -3,6 +3,7 @@ package com.caimei365.order.controller;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.HeliDto;
+import com.caimei365.order.model.dto.PayCouponDto;
 import com.caimei365.order.model.dto.PaySecondDto;
 import com.caimei365.order.model.dto.PayVipDto;
 import com.caimei365.order.model.vo.NotifyResponseVo;
@@ -86,6 +87,112 @@ public class HeliPayNonOrderApi {
         return payNonOrderService.paymentSecondCallback(res);
     }
 
+    @ApiOperation("购买价值优惠券-获取购买记录id")
+    @PostMapping("/coupon/record")
+    public ResponseJson<PayCouponDto> payCouponGetRecord(PayCouponDto payCouponDto, @RequestHeader HttpHeaders headers) {
+        if (null == payCouponDto.getCouponId()) {
+            return ResponseJson.error("优惠券Id不能为空!", null);
+        }
+        if (null == payCouponDto.getUserId()) {
+            return ResponseJson.error("userId不能为空!", null);
+        }
+        return payNonOrderService.getCouponRecord(payCouponDto, headers);
+    }
+
+     /**
+     * 购买优惠券-微信线上支付
+     *
+     * @param heliDto {
+     *                     couponId      购买优惠券Id
+     *                     userId        userId
+     *                     couponRecordId  购买记录id
+     *                     returnUrl     页面回调地址
+     *                     code          微信小程序code
+     *                     state         微信公众号state参数
+     *                     }
+     */
+    @ApiOperation("购买价值优惠券-微信线上支付")
+    @PostMapping("/coupon/wechat")
+    public ResponseJson<JSONObject> payCouponByWeChat(HeliDto heliDto, @RequestHeader HttpHeaders headers) {
+        if (null == heliDto.getCouponRecordId()) {
+            return ResponseJson.error("购买记录id不能为空!", null);
+        }
+        if (null == heliDto.getSource()) {
+            return ResponseJson.error("领取渠道不能为空!", null);
+        }
+        if (null == heliDto.getCouponId()) {
+            return ResponseJson.error("优惠券Id不能为空!", null);
+        }
+        if (null == heliDto.getUserId()) {
+            return ResponseJson.error("userId不能为空!", null);
+        }
+        if (StringUtils.isEmpty(heliDto.getCode())) {
+            return ResponseJson.error("微信code不能为空!", null);
+        }
+        return payNonOrderService.payCouponByWeChat(heliDto, headers);
+    }
+
+    @ApiOperation("购买价值优惠券-网银线上支付")
+    @PostMapping("/coupon/union")
+    public ResponseJson<String> payCouponByUnionPay(HeliDto heliDto, @RequestHeader HttpHeaders headers) {
+        if (null == heliDto.getVipRecordId()) {
+            return ResponseJson.error("购买记录id不能为空!", null);
+        }
+        if (StringUtils.isEmpty(heliDto.getReturnUrl())) {
+            return ResponseJson.error("回调地址不能为空!", null);
+        }
+        if (StringUtils.isEmpty(heliDto.getBankCode())) {
+            return ResponseJson.error("银行编码不能为空!", null);
+        }
+        if (StringUtils.isEmpty(heliDto.getUserType())) {
+            return ResponseJson.error("银行用户类型不能为空!", null);
+        }
+        if(null==heliDto.getSource()){
+            return ResponseJson.error("领取渠道不能为空!",null);
+        }
+        return payNonOrderService.couponUnionPay(heliDto, headers);
+    }
+
+    /**
+     * 购买价值优惠券-微信/支付宝二维码
+     *
+     * @param heliDto {
+     *                     couponId      购买优惠券Id
+     *                     userId        userId
+     *                     couponRecordId  购买记录id
+     *                     returnUrl     页面回调地址
+     *                     state         微信公众号state参数
+     *                }
+     */
+    @ApiOperation("购买价值优惠券-支付宝线上支付")
+    @PostMapping("/second/scan")
+    public ResponseJson<JSONObject> payCouponByAlipay(HeliDto heliDto, @RequestHeader HttpHeaders headers) {
+        if (null == heliDto.getCouponRecordId()) {
+            return ResponseJson.error("购买记录id不能为空!", null);
+        }
+        if (null == heliDto.getSource()) {
+            return ResponseJson.error("领取渠道不能为空!", null);
+        }
+        if (null == heliDto.getCouponId()) {
+            return ResponseJson.error("优惠券Id不能为空!", null);
+        }
+        if (null == heliDto.getUserId()) {
+            return ResponseJson.error("userId不能为空!", null);
+        }
+        return payNonOrderService.payCouponByAlipay(heliDto, headers);
+    }
+
+    /**
+     * 购买优惠券-支付回调
+     */
+    @ApiOperation("购买优惠券-支付回调")
+    @GetMapping("/coupon/callback")
+    public String couponCallback(NotifyResponseVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+        if (null == res) {
+            return "回调参数失败";
+        }
+        return payNonOrderService.couponCallback(res);
+    }
     /**
      * 二手发布-网银支付回调
      */
@@ -200,4 +307,15 @@ public class HeliPayNonOrderApi {
         return payNonOrderService.unionVipCallback(data);
     }
 
+    /**
+     * 升级超级会员-网银支付回调
+     */
+    @ApiOperation("升级超级会员-网银支付回调")
+    @PostMapping("/coupon/callback/union")
+    public String couponUnionCallback(UnionResVo data) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+        if (null == data) {
+            return "回调参数失败";
+        }
+        return payNonOrderService.unionCouponCallback(data);
+    }
 }

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

@@ -68,5 +68,26 @@ public class HeliDto implements Serializable {
      */
     @ApiModelProperty("子订单Id")
     private Integer shopOrderId;
+
+    /**
+     * 购买优惠券Id
+     */
+    @ApiModelProperty("购买优惠券Id")
+    private Integer couponId;
+    /**
+     * userId
+     */
+    @ApiModelProperty("userId")
+    private Integer userId;
+    /**
+     * 购买记录id
+     */
+    @ApiModelProperty("购买记录id")
+    private Integer couponRecordId;
+    /**
+     *  1小程序 2网站
+     */
+    @ApiModelProperty("领取渠道1小程序 2网站")
+    private Integer source;
 }
 

+ 12 - 0
src/main/java/com/caimei365/order/service/HeliPayNonOrderService.java

@@ -3,6 +3,7 @@ package com.caimei365.order.service;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.HeliDto;
+import com.caimei365.order.model.dto.PayCouponDto;
 import com.caimei365.order.model.dto.PaySecondDto;
 import com.caimei365.order.model.dto.PayVipDto;
 import com.caimei365.order.model.vo.NotifyResponseVo;
@@ -15,6 +16,11 @@ import java.security.NoSuchAlgorithmException;
 import java.security.spec.InvalidKeySpecException;
 
 public interface HeliPayNonOrderService {
+    ResponseJson<PayCouponDto> getCouponRecord(PayCouponDto payCouponDto, HttpHeaders headers);
+
+    ResponseJson<JSONObject> payCouponByWeChat(HeliDto heliDto, HttpHeaders headers);
+
+    String couponCallback(NotifyResponseVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
     /**
      * 二手发布微信线上支付
      * @param heliDto {
@@ -75,4 +81,10 @@ public interface HeliPayNonOrderService {
      * 二手发布-网银支付回调
      */
     String unionSecondCallback(UnionResVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
+
+    ResponseJson<JSONObject> payCouponByAlipay(HeliDto heliDto, HttpHeaders headers);
+
+    ResponseJson<String> couponUnionPay(HeliDto heliDto, HttpHeaders headers);
+
+    String unionCouponCallback(UnionResVo data) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
 }

+ 448 - 35
src/main/java/com/caimei365/order/service/impl/HeliPayNonOrderServiceImpl.java

@@ -6,18 +6,17 @@ import com.caimei365.order.components.HeliPayUtil;
 import com.caimei365.order.components.WeChatService;
 import com.caimei365.order.constant.Constant;
 import com.caimei365.order.mapper.BaseMapper;
+import com.caimei365.order.mapper.OrderClubMapper;
 import com.caimei365.order.mapper.PayOrderMapper;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.bo.PayParamBo;
 import com.caimei365.order.model.bo.VipRecordBo;
 import com.caimei365.order.model.dto.HeliDto;
+import com.caimei365.order.model.dto.PayCouponDto;
 import com.caimei365.order.model.enums.AccountPayOrderType;
 import com.caimei365.order.model.enums.AppPayType;
 import com.caimei365.order.model.enums.PayType;
-import com.caimei365.order.model.po.DiscernReceiptPo;
-import com.caimei365.order.model.po.OrderReceiptRelationPo;
-import com.caimei365.order.model.po.SplitAccountPo;
-import com.caimei365.order.model.po.UserVipPo;
+import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.vo.*;
 import com.caimei365.order.service.HeliPayNonOrderService;
 import com.caimei365.order.service.RemoteCallService;
@@ -59,6 +58,210 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
     private WeChatService weChatService;
     @Resource
     private RemoteCallService remoteCallService;
+    @Resource
+    private OrderClubMapper orderClubMapper;
+
+    @Override
+    public ResponseJson<PayCouponDto> getCouponRecord(PayCouponDto payCouponDto, HttpHeaders headers) {
+        //个人机构返回状态码-1  不是医美 -2
+        if (49 == payCouponDto.getCouponId()) {
+            //正式id49优惠券 普通机构和非医美机构无法购买
+            //先判断是否是普通机构,是就打回
+            Integer userIdentity = baseMapper.getIdentityByUserId(payCouponDto.getUserId());
+            if (userIdentity != null && 4 == userIdentity) {
+                return ResponseJson.error(-1, "仅供医美机构购买!", null);
+            }
+            Integer clubType = payOrderMapper.findClubType(payCouponDto.getUserId());
+            //为空或者不等于1    医美=1和生美=2
+            if (null == clubType || 1 != clubType) {
+                return ResponseJson.error(-2, "仅供医美机构购买!", null);
+            }
+        }
+        CouponRecordPo cr = new CouponRecordPo();
+        cr.setCouponId(payCouponDto.getCouponId());
+        cr.setUserId(payCouponDto.getUserId());
+        payOrderMapper.insertCouponRecord(cr);
+        payCouponDto.setCouponRecordId(cr.getId());
+        return ResponseJson.success(payCouponDto);
+    }
+
+    @Override
+    public ResponseJson<JSONObject> payCouponByWeChat(HeliDto heliDto, HttpHeaders headers) {
+        Integer status = payOrderMapper.findPayStatus(heliDto.getCouponRecordId());
+        if (null != status && 1 == status) {
+            return ResponseJson.error("该笔记录已支付,请勿重复支付!", null);
+        }
+        try {
+            AppPayPublicCreateOrderVo pay = new AppPayPublicCreateOrderVo();
+            //公众号,小程序获取openid
+            if ("GZH".equals(heliDto.getPayType()) || "XCX".equals(heliDto.getPayType())) {
+                PayParamBo tempParam = new PayParamBo();
+                BeanUtils.copyProperties(heliDto, tempParam);
+                ResponseJson<PayParamBo> jsonParam = getWeChatResponseJson(tempParam, headers);
+                if (-1 == jsonParam.getCode()) {
+                    return ResponseJson.error(jsonParam.getMsg(), null);
+                }
+                PayParamBo payParam = jsonParam.getData();
+                pay.setP8_openid(payParam.getOpenId());
+            }
+            //合利宝主扫接口参数赋值
+            heliPayUtil.setOnlineValue(pay, heliDto, "coupon", headers);
+            Map<String, String> map = MyBeanUtils.convertBean(pay, new LinkedHashMap());
+            String oriMessage = MyBeanUtils.getSignedByPresetParameter(map, AppPayPublicCreateOrderVo.NEED_SIGN_PARAMS);
+            oriMessage += Constant.SPLIT + Constant.SAOMA;
+            log.info("签名原文串:" + oriMessage);
+            String sign = Disguiser.disguiseMD5(oriMessage.trim());
+            log.info("签名串:" + sign);
+            map.put("sign", sign);
+            log.info("发送参数:" + map);
+            Map<String, Object> resultMap = HttpClientService.getHttpResp(map, Constant.REQUEST_URL);
+            log.info("响应结果:" + resultMap);
+            if ((Integer) resultMap.get("statusCode") == HttpStatus.SC_OK) {
+                String resultMsg = (String) resultMap.get("response");
+                AppPayPublicOrderResponseVo orderResponseVo = JSONObject.parseObject(resultMsg, AppPayPublicOrderResponseVo.class);
+                String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(orderResponseVo, AppPayPublicOrderResponseVo.NEED_SIGN_PARAMS);
+                log.info("组装返回结果签名串:" + assemblyRespOriSign);
+                assemblyRespOriSign += Constant.SPLIT + Constant.SAOMA;
+                String responseSign = orderResponseVo.getSign();
+                log.info("响应签名:" + responseSign);
+                String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
+                if (checkSign.equals(responseSign) && "0000".equals(orderResponseVo.getRt2_retCode())) {
+                    JSONObject jsonObject = JSONObject.parseObject(resultMsg);
+                    SplitAccountPo splitAccount = new SplitAccountPo();
+                    splitAccount.setCouponRecordId(heliDto.getCouponRecordId());
+                    // 优惠券 公账-专票
+                    splitAccount.setType(1);
+                    // 待分账总金额
+                    double splitAmount =Double.parseDouble(heliDto.getPayAmount());
+                    // 总手续费
+                    double procedureFee;
+                    procedureFee = MathUtil.mul(splitAmount, 0.0025, 2).doubleValue();
+                    if (MathUtil.compare(procedureFee, 0) == 0) {
+                        procedureFee = 0.01;
+                    }
+                    splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
+                    splitAccount.setSplitAccount(splitAmount);
+                    splitAccount.setMbOrderId(orderResponseVo.getRt6_serialNumber());
+                    splitAccount.setOrderRequestNo(orderResponseVo.getRt5_orderId());
+                    splitAccount.setPayStatus(0);
+                    // 保存分账详情
+                    payOrderMapper.insertSplitAccount(splitAccount);
+                    return ResponseJson.success("请求成功", jsonObject);
+                } else {
+                    return ResponseJson.error("请求参数有误", JSONObject.parseObject(resultMsg));
+                }
+            } else {
+                return ResponseJson.error("请求失败", null);
+            }
+        } catch (Exception e) {
+            log.error("交易失败" + e);
+            return ResponseJson.error("交易失败", null);
+        }
+    }
+
+    @Override
+    public String couponCallback(NotifyResponseVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+        log.info("******************** 升级超级会员异步回调 start *******************");
+        String sign = res.getSign();
+        log.info("回调签名" + sign);
+        // 公钥验签
+        String oriMessage = MyBeanUtils.getSigned(res, null);
+        String oriMessage1 = oriMessage + Constant.SPLIT + Constant.SAOMA;
+        String oriMessage2 = oriMessage + Constant.SPLIT + Constant.FENZHANG;
+        String oriMessage3 = oriMessage + Constant.SPLIT + Constant.XUNI;
+        String oriMessage4 = oriMessage + Constant.SPLIT + Constant.WANGYIN;
+        String checkSign1 = Disguiser.disguiseMD5(oriMessage1.trim());
+        String checkSign2 = Disguiser.disguiseMD5(oriMessage2.trim());
+        String checkSign3 = Disguiser.disguiseMD5(oriMessage3.trim());
+        String checkSign4 = Disguiser.disguiseMD5(oriMessage4.trim());
+        boolean b = sign.equals(checkSign1) || sign.equals(checkSign2) || sign.equals(checkSign3) || sign.equals(checkSign4);
+        if (!b) {
+            return "验签失败!";
+        }
+        // 订单状态
+        String orderStatus = res.getRt4_status();
+        // 平台唯一流水号
+        String mbOrderId = res.getRt3_systemSerial();
+        // 商户唯一订单号
+        String orderRequestNo = res.getRt2_orderId();
+        // 金额,以元为单位
+        Double amount = Double.valueOf(res.getRt5_orderAmount());
+        String payFormData = JSON.toJSONString(res);
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>支付订单状态:" + orderStatus);
+        if (!"SUCCESS".equals(orderStatus)) {
+            return "支付失败";
+        }
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>本次支付金额:" + amount);
+        // 附加数据,支付时若有传输则原样返回(vipId,userId,recordId,payType),下单时为空,则不返回该数据
+        String attach = res.getRt8_desc();
+        String[] split = attach.split(",");
+        int couponId = 0;
+        int userId = 0;
+        int recordId = 0;
+        int payType = 0;
+        int source = 0;
+        try {
+            // 优惠券Id
+            couponId = Integer.parseInt(split[0]);
+            // 用户Id
+            userId = Integer.parseInt(split[1]);
+            // 购买历史记录Id
+            recordId = Integer.parseInt(split[2]);
+            // 支付方式
+            payType = Integer.parseInt(split[3]);
+            //购买渠道
+            source = Integer.parseInt(split[4]);
+        } catch (NumberFormatException e) {
+            log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>获取回调参数解析失败!");
+        }
+        //cm_coupon_club数据库修改
+        CouponClubPo couponClubPo = new CouponClubPo();
+        couponClubPo.setSource(source);
+        couponClubPo.setUserId(userId);
+        couponClubPo.setCouponId(couponId);
+        couponClubPo.setStatus("1");
+        couponClubPo.setDelFlag("0");
+        couponClubPo.setCreateDate(new Date());
+        orderClubMapper.insertCouponClub(couponClubPo);
+        // 改历史记录支付状态
+        payOrderMapper.updateCouponRecord(recordId);
+        Date date = new Date();
+        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
+        // 保存收款记录
+        DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
+        discernReceipt.setPayWay(1);
+        discernReceipt.setPayType(payType);
+        discernReceipt.setReceiptType(8);
+        discernReceipt.setReceiptStatus(3);
+        discernReceipt.setReceiptAmount(amount);
+        discernReceipt.setConfirmType(4);
+        discernReceipt.setRePayFlag(1);
+        discernReceipt.setFormData(payFormData);
+        discernReceipt.setReceiptDate(curDateStr);
+        discernReceipt.setConfirmDate(curDateStr);
+        discernReceipt.setReviewDate(curDateStr);
+        discernReceipt.setUpdateDate(curDateStr);
+        discernReceipt.setDelFlag(0);
+        // 保存 收款记录
+        baseMapper.insertDiscernReceipt(discernReceipt);
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",couponRecordId:" + recordId);
+        // 收款项和订单关系表
+        OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
+        relation.setReceiptId(discernReceipt.getId());
+        relation.setCouponRecordId(recordId);
+        relation.setAssociateAmount(amount);
+        relation.setMbOrderId(mbOrderId);
+        relation.setOrderRequestNo(orderRequestNo);
+        relation.setSplitStatus(1);
+        relation.setRelationType(6);
+        relation.setDelFlag(0);
+        // 保存 收款项和订单关系
+        baseMapper.insertOrderReceiptRelation(relation);
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>收款项和购买历史关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",couponRecordId:" + recordId);
+        //修改分账付款状态
+        payOrderMapper.updateSplitAccountByPay(mbOrderId);
+        return "SUCCESS";
+    }
 
     /**
      * 二手发布 小程序/公众号
@@ -337,35 +540,6 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
         return "SUCCESS";
     }
 
-    /**
-     * 设置支付基础参数
-     */
-    private JSONObject getPayJsonObject(PayParamBo payParam, HttpHeaders headers, long time) {
-        // 用户IP地址
-        String userIp = headers.getFirst("X-CLIENT-IP");
-        JSONObject json = new JSONObject();
-        json.put("merAccount", PayUtil.merAccount);
-        json.put("merNo", PayUtil.merNo);
-        json.put("time", time);
-        //支付金额
-        json.put("amount", payParam.getPayAmount());
-        json.put("payWay", payParam.getPayWay());
-        json.put("payType", payParam.getPayType());
-        json.put("userIp", userIp);
-        json.put("returnUrl", payParam.getReturnUrl());
-        json.put("notifyUrl", payParam.getNotifyUrl());
-        if (StringUtils.isNotBlank(payParam.getBankCode())) {
-            json.put("bankCode", payParam.getBankCode());
-        }
-        if (StringUtils.isNotBlank(payParam.getUserType())) {
-            json.put("userType", payParam.getUserType());
-        }
-        if (StringUtils.isNotBlank(payParam.getOpenId())) {
-            json.put("openId", payParam.getOpenId());
-        }
-        return json;
-    }
-
     /**
      * 升级超级会员-微信线上支付
      *
@@ -974,7 +1148,7 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
             log.info("二手网银分账类型参数payType错误======================》" + payType);
             return "SUCCESS";
         }
-        split(data.getRt5_orderId(), totalAmount);
+//        split(data.getRt5_orderId(), totalAmount);
         return "SUCCESS";
     }
 
@@ -1064,7 +1238,246 @@ public class HeliPayNonOrderServiceImpl implements HeliPayNonOrderService {
             log.info("二手网银分账类型参数payType错误======================》" + payType);
             return "SUCCESS";
         }
-        split(res.getRt5_orderId(), totalAmount);
+//        split(res.getRt5_orderId(), totalAmount);
+        return "SUCCESS";
+    }
+
+    @Override
+    public ResponseJson<JSONObject> payCouponByAlipay(HeliDto heliDto, HttpHeaders headers) {
+        Integer status = payOrderMapper.findPayStatus(heliDto.getCouponRecordId());
+        if (null != status && 1 == status) {
+            return ResponseJson.error("该笔记录已支付,请勿重复支付!", null);
+        }
+        try {
+            AppCreateOrderVo pay = new AppCreateOrderVo();
+            //合利宝主扫接口参数赋值
+            heliPayUtil.setValue(pay, heliDto, "coupon", headers);
+            if (!(StringUtils.equals(AppPayType.ALIPAY.name(), pay.getP8_appType())
+                    && StringUtils.equals(PayType.SWIPE.name(), pay.getP4_payType()))) {
+                pay.setOpenId(null);
+                pay.setAuthConfirmMode(null);
+            }
+            Map<String, String> map = MyBeanUtils.convertBean(pay, new LinkedHashMap());
+            String oriMessage = MyBeanUtils.getSignedByPresetParameter(map, AppCreateOrderVo.NEED_SIGN_PARAMS);
+            //密钥拼接
+            oriMessage += Constant.SPLIT + Constant.SAOMA;
+            log.info("签名原文串:" + oriMessage);
+            String sign = Disguiser.disguiseMD5(oriMessage.trim());
+            log.info("签名串:" + sign);
+            map.put("sign", sign);
+            log.info("发送参数:" + map);
+            Map<String, Object> resultMap = HttpClientService.getHttpResp(map, Constant.REQUEST_URL);
+            log.info("响应结果:" + resultMap);
+            if ((Integer) resultMap.get("statusCode") == HttpStatus.SC_OK) {
+                String resultMsg = (String) resultMap.get("response");
+                AppCreateOrderResponseVo orderResponseVo = JSONObject.parseObject(resultMsg, AppCreateOrderResponseVo.class);
+                String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(orderResponseVo, AppCreateOrderResponseVo.NEED_SIGN_PARAMS);
+                log.info("组装返回结果签名串:" + assemblyRespOriSign);
+                assemblyRespOriSign += Constant.SPLIT + Constant.SAOMA;
+                String responseSign = orderResponseVo.getSign();
+                log.info("响应签名:" + responseSign);
+                String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
+                JSONObject jsonObject = JSONObject.parseObject(resultMsg);
+                if (checkSign.equals(responseSign) && "0000".equals(orderResponseVo.getRt2_retCode())) {
+                    SplitAccountPo splitAccount = new SplitAccountPo();
+                    splitAccount.setCouponRecordId(heliDto.getCouponRecordId());
+                    // 优惠券 公账-专票
+                    splitAccount.setType(1);
+                    // 待分账总金额
+                    double splitAmount =Double.parseDouble(heliDto.getPayAmount());
+                    // 总手续费
+                    double procedureFee;
+                    procedureFee = MathUtil.mul(splitAmount, 0.0025, 2).doubleValue();
+                    if (MathUtil.compare(procedureFee, 0) == 0) {
+                        procedureFee = 0.01;
+                    }
+                    splitAmount = MathUtil.sub(splitAmount, procedureFee).doubleValue();
+                    splitAccount.setSplitAccount(splitAmount);
+                    splitAccount.setMbOrderId(orderResponseVo.getRt6_serialNumber());
+                    splitAccount.setOrderRequestNo(orderResponseVo.getRt5_orderId());
+                    splitAccount.setPayStatus(0);
+                    // 保存分账详情
+                    payOrderMapper.insertSplitAccount(splitAccount);
+                    return ResponseJson.success("二维码创建成功", jsonObject);
+                } else {
+                    return ResponseJson.error("二维码创建失败", jsonObject);
+                }
+            } else {
+                return ResponseJson.error("创建二维码请求失败", null);
+            }
+        } catch (Exception e) {
+            log.error("创建二维码请求失败" + e);
+            return ResponseJson.error("创建二维码请求失败", null);
+        }
+    }
+
+    @Override
+    public ResponseJson<String> couponUnionPay(HeliDto heliDto, HttpHeaders headers) {
+        Integer status = payOrderMapper.findPayStatus(heliDto.getCouponRecordId());
+        if (null != status && 1 == status) {
+            return ResponseJson.error("该笔记录已支付,请勿重复支付!", null);
+        }
+        try {
+            log.info("--------进入优惠券网银线上支付接口----------");
+            HeliOnlineVo heliOnlineVo = new HeliOnlineVo();
+            heliPayUtil.setLinkValue(heliOnlineVo, heliDto, "coupon", headers);
+            Map<String, String> map = MyBeanUtils.convertBean(heliOnlineVo, new LinkedHashMap());
+            String oriMessage = MyBeanUtils.getSignedByPresetParameter(map, HeliOnlineVo.NEED_SIGN_PARAMS);
+            oriMessage += SPLIT + Constant.WANGYIN;
+            String sign = Disguiser.disguiseMD5(oriMessage.trim());
+            Map<String, String> sPara = new HashMap<String, String>();
+            sPara.put("P1_bizType", heliOnlineVo.getP1_bizType());
+            sPara.put("P2_orderId", heliOnlineVo.getP2_orderId());
+            sPara.put("P3_customerNumber", heliOnlineVo.getP3_customerNumber());
+            sPara.put("P4_orderAmount", heliOnlineVo.getP4_orderAmount());
+            sPara.put("P5_bankId", heliOnlineVo.getP5_bankId());
+            sPara.put("P6_business", heliOnlineVo.getP6_business());
+            sPara.put("P7_timestamp", heliOnlineVo.getP7_timestamp());
+            sPara.put("P8_goodsName", heliOnlineVo.getP8_goodsName());
+            sPara.put("P9_period", heliOnlineVo.getP9_period());
+            sPara.put("P10_periodUnit", heliOnlineVo.getP10_periodUnit());
+            sPara.put("P11_callbackUrl", heliOnlineVo.getP11_callbackUrl());
+            sPara.put("P12_serverCallbackUrl", heliOnlineVo.getP12_serverCallback());
+            sPara.put("P13_orderIp", heliOnlineVo.getP13_orderIp());
+            sPara.put("P14_onlineCardType", heliOnlineVo.getP14_onlineCardType());
+            sPara.put("P15_desc", heliOnlineVo.getP15_desc());
+            sPara.put("sign", sign);
+            StringBuffer sbHtml = new StringBuffer();
+            List<String> keys = new ArrayList<String>(sPara.keySet());
+            //		post方式传递
+            sbHtml.append("<form id=\"onlineForm\" name=\"onlineForm\" action=\"").append(YL).append("\" method=\"post\">");
+            String name = "";
+            String value = "";
+            for (int i = 0; i < keys.size(); i++) {
+                name = (String) keys.get(i);
+                value = (String) sPara.get(name);
+                if (value != null && !"".equals(value)) {
+                    sbHtml.append("<input type=\"hidden\" name=\"").append(name).append("\" value=\"" + value + "\"/>");
+                }
+            }
+            //submit按钮控件请不要含有name属性
+            sbHtml.append("<input type=\"submit\" value=\"确认付款\"></form>");
+
+            // 保存升级超级会员分账参数
+            SplitAccountPo splitAccount = new SplitAccountPo();
+            splitAccount.setCouponRecordId(heliDto.getCouponRecordId());
+            // 超级会员 公账-专票
+            splitAccount.setType(1);
+            // 待分账总金额
+            Double splitAmount = Double.valueOf(heliOnlineVo.getP4_orderAmount());
+            //b2b10块 b2c0.2%
+            if ("B2B".equals(heliDto.getUserType())) {
+                splitAmount = MathUtil.sub(splitAmount, 10).doubleValue();
+            } else {
+                splitAmount = MathUtil.mul(splitAmount, 0.998).doubleValue();
+            }
+            splitAccount.setSplitAccount(splitAmount);
+            //流水号暂存唯一订单id
+            splitAccount.setMbOrderId(heliOnlineVo.getP2_orderId());
+            splitAccount.setOrderRequestNo(heliOnlineVo.getP2_orderId());
+            splitAccount.setPayStatus(0);
+            // 保存分账详情
+            payOrderMapper.insertSplitAccount(splitAccount);
+            return ResponseJson.success(sbHtml.toString());
+        } catch (Exception e) {
+            log.error("错误信息", e);
+            return ResponseJson.error("支付失败!", null);
+        }
+    }
+
+    @Override
+    public String unionCouponCallback(UnionResVo data)  throws IntrospectionException, InvocationTargetException, IllegalAccessException{
+        log.info("******************** 购买价值优惠券网银支付异步回调 start *******************");
+        String sign = data.getSign();
+        log.info("回调签名" + sign);
+        // 公钥验签
+        String oriMessage = MyBeanUtils.getSigned(data, null);
+        String oriMessage4 = oriMessage + Constant.SPLIT + Constant.WANGYIN;
+        String checkSign4 = Disguiser.disguiseMD5(oriMessage4.trim());
+        boolean b = sign.equals(checkSign4);
+        if (!b) {
+            return "验签失败!";
+        }
+        // 订单状态
+        String orderStatus = data.getRt11_orderStatus();
+        // 平台唯一流水号
+        String mbOrderId = data.getRt12_serialNumber();
+        // 商户唯一订单号
+        String orderRequestNo = data.getRt5_orderId();
+        // 金额,以元为单位
+        Double amount = Double.valueOf(data.getRt6_orderAmount());
+        String payFormData = JSON.toJSONString(data);
+        log.info("【价值优惠券网银异步回调】>>>>>>>>>>>支付订单状态:" + orderStatus);
+        if (!"SUCCESS".equals(orderStatus)) {
+            return "支付失败";
+        }
+        String attach = data.getRt13_desc();
+        String[] split = attach.split(",");
+        int couponId = 0;
+        int userId = 0;
+        int recordId = 0;
+        int payType = 0;
+        int source = 0;
+        try {
+            // 优惠券Id
+            couponId = Integer.parseInt(split[0]);
+            // 用户Id
+            userId = Integer.parseInt(split[1]);
+            // 购买历史记录Id
+            recordId = Integer.parseInt(split[2]);
+            // 支付方式
+            payType = Integer.parseInt(split[3]);
+            //购买渠道
+            source = Integer.parseInt(split[4]);
+        } catch (NumberFormatException e) {
+            log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>获取回调参数解析失败!");
+        }
+        //cm_coupon_club数据库修改
+        CouponClubPo couponClubPo = new CouponClubPo();
+        couponClubPo.setSource(source);
+        couponClubPo.setUserId(userId);
+        couponClubPo.setCouponId(couponId);
+        couponClubPo.setStatus("1");
+        couponClubPo.setDelFlag("0");
+        couponClubPo.setCreateDate(new Date());
+        orderClubMapper.insertCouponClub(couponClubPo);
+        // 改历史记录支付状态
+        payOrderMapper.updateCouponRecord(recordId);
+        Date date = new Date();
+        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
+        // 保存收款记录
+        DiscernReceiptPo discernReceipt = new DiscernReceiptPo();
+        discernReceipt.setPayWay(1);
+        discernReceipt.setPayType(payType);
+        discernReceipt.setReceiptType(8);
+        discernReceipt.setReceiptStatus(3);
+        discernReceipt.setReceiptAmount(amount);
+        discernReceipt.setConfirmType(4);
+        discernReceipt.setRePayFlag(1);
+        discernReceipt.setFormData(payFormData);
+        discernReceipt.setReceiptDate(curDateStr);
+        discernReceipt.setConfirmDate(curDateStr);
+        discernReceipt.setReviewDate(curDateStr);
+        discernReceipt.setUpdateDate(curDateStr);
+        discernReceipt.setDelFlag(0);
+        // 保存 收款记录
+        baseMapper.insertDiscernReceipt(discernReceipt);
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>>>>保存识别款项(insert[cm_discern_receipt])id:" + discernReceipt.getId() + ",couponRecordId:" + recordId);
+        // 收款项和订单关系表
+        OrderReceiptRelationPo relation = new OrderReceiptRelationPo();
+        relation.setReceiptId(discernReceipt.getId());
+        relation.setCouponRecordId(recordId);
+        relation.setAssociateAmount(amount);
+        relation.setMbOrderId(mbOrderId);
+        relation.setOrderRequestNo(orderRequestNo);
+        relation.setSplitStatus(1);
+        relation.setRelationType(6);
+        relation.setDelFlag(0);
+        // 保存 收款项和订单关系
+        baseMapper.insertOrderReceiptRelation(relation);
+        log.info("【购买优惠券异步回调】>>>>>>>>>>>收款项和购买历史关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",couponRecordId:" + recordId);
+        //修改分账付款状态
+        payOrderMapper.updateSplitAccountByPay(mbOrderId);
         return "SUCCESS";
     }