chao 3 роки тому
батько
коміт
f3e7f5d678

+ 110 - 0
src/main/java/com/caimei365/order/controller/PayNonOrderApi.java

@@ -0,0 +1,110 @@
+package com.caimei365.order.controller;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.model.dto.SecondPayDto;
+import com.caimei365.order.service.PayNonOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.bind.annotation.*;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+
+/**
+ * 二手发布支付,升级超级会员支付
+ *
+ * @author : Charles
+ * @date : 2021/9/27
+ */
+@Api(tags="其他(非订单)支付API")
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/order/pay")
+public class PayNonOrderApi {
+
+    private final PayNonOrderService payNonOrderService;
+
+    /**
+     * 二手发布微信线上支付
+     * @param secondPayDto {
+     *               productId      二手发布商品id
+     *               returnUrl     页面回调地址
+     *               code          微信小程序code
+     *               state         微信公众号state参数
+     * }
+     */
+    @ApiOperation("二手发布微信线上支付(旧:/PayOrder/appletsSecondHandPay)(/PayOrder/secondHandPay[WEIXIN])")
+    @PostMapping("/second/wechat")
+    public ResponseJson<JSONObject> paySecondByWeChat(SecondPayDto secondPayDto, @RequestHeader HttpHeaders headers){
+        if (null == secondPayDto.getProductId()) {
+            return ResponseJson.error("二手商品Id不能为空!", null);
+        }
+        if (StringUtils.isEmpty(secondPayDto.getCode())) {
+            return ResponseJson.error("微信code不能为空!", null);
+        }
+        return payNonOrderService.paySecondByWeChat(secondPayDto, headers);
+    }
+
+    /**
+     * 二手发布支付宝线上支付
+     * @param secondPayDto {
+     *               productId      二手发布商品id
+     *               returnUrl     页面回调地址
+     * }
+     */
+    @ApiOperation("二手发布支付宝线上支付(旧:/PayOrder/secondHandPay[ALIPAY])")
+    @PostMapping("/second/alipay")
+    public ResponseJson<JSONObject> paySecondByAlipay(SecondPayDto secondPayDto, @RequestHeader HttpHeaders headers){
+        if (null == secondPayDto.getProductId()) {
+            return ResponseJson.error("二手商品Id不能为空!", null);
+        }
+        if (StringUtils.isEmpty(secondPayDto.getReturnUrl())) {
+            return ResponseJson.error("回调地址不能为空!", null);
+        }
+        return payNonOrderService.paySecondByAlipay(secondPayDto, headers);
+    }
+
+    /**
+     * 二手发布银联线上支付
+     * @param secondPayDto {
+     *               productId     二手发布商品id
+     *               returnUrl     页面回调地址
+     *               bankCode      银行编码(银联支付使用)
+     *               userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
+     * }
+     */
+    @ApiOperation("二手发布银联线上支付(旧:/PayOrder/secondHandPay[UNIONPAY])")
+    @PostMapping("/second/union")
+    public ResponseJson<JSONObject> paySecondByUnionPay(SecondPayDto secondPayDto, @RequestHeader HttpHeaders headers){
+        if (null == secondPayDto.getProductId()) {
+            return ResponseJson.error("二手商品Id不能为空!", null);
+        }
+        if (StringUtils.isEmpty(secondPayDto.getReturnUrl())) {
+            return ResponseJson.error("回调地址不能为空!", null);
+        }
+        if (StringUtils.isEmpty(secondPayDto.getBankCode())) {
+            return ResponseJson.error("银行编码不能为空!", null);
+        }
+        if (StringUtils.isEmpty(secondPayDto.getUserType())) {
+            return ResponseJson.error("银行用户类型不能为空!", null);
+        }
+        return payNonOrderService.paySecondByUnionPay(secondPayDto, headers);
+    }
+
+    /**
+     * 二手发布支付回调
+     */
+    @ApiOperation("二手发布支付回调(旧:/PayOrder/secondHandPayCallBack)")
+    @GetMapping("/second/callback")
+    public String paymentSecondCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException {
+        if (StringUtils.isBlank(data)) {
+            return "回调参数失败";
+        }
+        return payNonOrderService.paymentSecondCallback(data);
+    }
+
+}

+ 0 - 80
src/main/java/com/caimei365/order/controller/PayOrderApi.java

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.PayDto;
 import com.caimei365.order.model.dto.PayLinkDto;
-import com.caimei365.order.model.dto.SecondPayDto;
 import com.caimei365.order.service.PayOrderService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -249,85 +248,6 @@ public class PayOrderApi {
         return payOrderService.getPayOrderResult(mbOrderId);
     }
 
-    /**
-     * 二手发布微信线上支付
-     * @param secondPayDto {
-     *               productId      二手发布商品id
-     *               returnUrl     页面回调地址
-     *               code          微信小程序code
-     *               state         微信公众号state参数
-     * }
-     */
-    @ApiOperation("二手发布微信线上支付(旧:/PayOrder/appletsSecondHandPay)(/PayOrder/secondHandPay[WEIXIN])")
-    @PostMapping("/second/wechat")
-    public ResponseJson<JSONObject> paySecondByWeChat(SecondPayDto secondPayDto, @RequestHeader HttpHeaders headers){
-        if (null == secondPayDto.getProductId()) {
-            return ResponseJson.error("二手商品Id不能为空!", null);
-        }
-        if (StringUtils.isEmpty(secondPayDto.getCode())) {
-            return ResponseJson.error("微信code不能为空!", null);
-        }
-        return payOrderService.paySecondByWeChat(secondPayDto, headers);
-    }
-
-    /**
-     * 二手发布支付宝线上支付
-     * @param secondPayDto {
-     *               productId      二手发布商品id
-     *               returnUrl     页面回调地址
-     * }
-     */
-    @ApiOperation("二手发布支付宝线上支付(旧:/PayOrder/secondHandPay[ALIPAY])")
-    @PostMapping("/second/alipay")
-    public ResponseJson<JSONObject> paySecondByAlipay(SecondPayDto secondPayDto, @RequestHeader HttpHeaders headers){
-        if (null == secondPayDto.getProductId()) {
-            return ResponseJson.error("二手商品Id不能为空!", null);
-        }
-        if (StringUtils.isEmpty(secondPayDto.getReturnUrl())) {
-            return ResponseJson.error("回调地址不能为空!", null);
-        }
-        return payOrderService.paySecondByAlipay(secondPayDto, headers);
-    }
-
-    /**
-     * 二手发布银联线上支付
-     * @param secondPayDto {
-     *               productId     二手发布商品id
-     *               returnUrl     页面回调地址
-     *               bankCode      银行编码(银联支付使用)
-     *               userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
-     * }
-     */
-    @ApiOperation("二手发布银联线上支付(旧:/PayOrder/secondHandPay[UNIONPAY])")
-    @PostMapping("/second/union")
-    public ResponseJson<JSONObject> paySecondByUnionPay(SecondPayDto secondPayDto, @RequestHeader HttpHeaders headers){
-        if (null == secondPayDto.getProductId()) {
-            return ResponseJson.error("二手商品Id不能为空!", null);
-        }
-        if (StringUtils.isEmpty(secondPayDto.getReturnUrl())) {
-            return ResponseJson.error("回调地址不能为空!", null);
-        }
-        if (StringUtils.isEmpty(secondPayDto.getBankCode())) {
-            return ResponseJson.error("银行编码不能为空!", null);
-        }
-        if (StringUtils.isEmpty(secondPayDto.getUserType())) {
-            return ResponseJson.error("银行用户类型不能为空!", null);
-        }
-        return payOrderService.paySecondByUnionPay(secondPayDto, headers);
-    }
-
-    /**
-     * 二手发布支付回调
-     */
-    @ApiOperation("二手发布支付回调(旧:/PayOrder/secondHandPayCallBack)")
-    @GetMapping("/second/callback")
-    public String paymentSecondCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException {
-        if (StringUtils.isBlank(data)) {
-            return "回调参数失败";
-        }
-        return payOrderService.paymentSecondCallback(data);
-    }
-
     /**
      * 延时分账异步通知回调
      */

+ 51 - 0
src/main/java/com/caimei365/order/service/PayNonOrderService.java

@@ -0,0 +1,51 @@
+package com.caimei365.order.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.model.dto.SecondPayDto;
+import org.springframework.http.HttpHeaders;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/9/27
+ */
+public interface PayNonOrderService {
+    /**
+     * 二手发布微信线上支付
+     * @param secondPayDto {
+     *               productId      二手发布商品id
+     *               returnUrl     页面回调地址
+     *               code          微信小程序code
+     *               state         微信公众号state参数
+     * }
+     */
+    ResponseJson<JSONObject> paySecondByWeChat(SecondPayDto secondPayDto, HttpHeaders headers);
+    /**
+     * 二手发布支付宝线上支付
+     * @param secondPayDto {
+     *               productId      二手发布商品id
+     *               returnUrl     页面回调地址
+     * }
+     */
+    ResponseJson<JSONObject> paySecondByAlipay(SecondPayDto secondPayDto, HttpHeaders headers);
+    /**
+     * 二手发布银联线上支付
+     * @param secondPayDto {
+     *               productId       二手发布商品id
+     *               returnUrl     页面回调地址
+     *               bankCode      银行编码(银联支付使用)
+     *               userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
+     * }
+     */
+    ResponseJson<JSONObject> paySecondByUnionPay(SecondPayDto secondPayDto, HttpHeaders headers);
+    /**
+     * 二手发布支付回调
+     */
+    String paymentSecondCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException;
+
+}

+ 0 - 34
src/main/java/com/caimei365/order/service/PayOrderService.java

@@ -4,7 +4,6 @@ import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.model.ResponseJson;
 import com.caimei365.order.model.dto.PayDto;
 import com.caimei365.order.model.dto.PayLinkDto;
-import com.caimei365.order.model.dto.SecondPayDto;
 import org.springframework.http.HttpHeaders;
 
 import javax.servlet.http.HttpServletResponse;
@@ -103,39 +102,6 @@ public interface PayOrderService {
      * @param mbOrderId 平台唯一流水号
      */
     ResponseJson<JSONObject> getPayOrderResult(String mbOrderId);
-
-    /**
-     * 二手发布微信线上支付
-     * @param secondPayDto {
-     *               productId      二手发布商品id
-     *               returnUrl     页面回调地址
-     *               code          微信小程序code
-     *               state         微信公众号state参数
-     * }
-     */
-    ResponseJson<JSONObject> paySecondByWeChat(SecondPayDto secondPayDto, HttpHeaders headers);
-    /**
-     * 二手发布支付宝线上支付
-     * @param secondPayDto {
-     *               productId      二手发布商品id
-     *               returnUrl     页面回调地址
-     * }
-     */
-    ResponseJson<JSONObject> paySecondByAlipay(SecondPayDto secondPayDto, HttpHeaders headers);
-    /**
-     * 二手发布银联线上支付
-     * @param secondPayDto {
-     *               productId       二手发布商品id
-     *               returnUrl     页面回调地址
-     *               bankCode      银行编码(银联支付使用)
-     *               userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
-     * }
-     */
-    ResponseJson<JSONObject> paySecondByUnionPay(SecondPayDto secondPayDto, HttpHeaders headers);
-    /**
-     * 二手发布支付回调
-     */
-    String paymentSecondCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException;
     /**
      * 延时分账
      */

+ 282 - 0
src/main/java/com/caimei365/order/service/impl/PayNonOrderServiceImpl.java

@@ -0,0 +1,282 @@
+package com.caimei365.order.service.impl;
+
+import com.alibaba.fastjson.JSONObject;
+import com.caimei365.order.components.WeChatService;
+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.SecondPayDto;
+import com.caimei365.order.model.po.SplitAccountPo;
+import com.caimei365.order.service.PayNonOrderService;
+import com.caimei365.order.utils.PayUtil;
+import com.caimei365.order.utils.pay.RSAUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.http.HttpHeaders;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.security.NoSuchAlgorithmException;
+import java.security.spec.InvalidKeySpecException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Description
+ *
+ * @author : Charles
+ * @date : 2021/9/27
+ */
+@Slf4j
+@Service
+public class PayNonOrderServiceImpl implements PayNonOrderService {
+    @Resource
+    private PayOrderMapper payOrderMapper;
+    @Resource
+    private WeChatService weChatService;
+    @Value("${pay.second-notify-url}")
+    private String secondHandUrl;
+    /**
+     * 二手发布微信线上支付
+     *
+     * @param secondPayDto {
+     *                     productId      二手发布商品id
+     *                     returnUrl     页面回调地址
+     *                     code          微信小程序code
+     *                     state         微信公众号state参数
+     *                     }
+     * @param headers
+     */
+    @Override
+    public ResponseJson<JSONObject> paySecondByWeChat(SecondPayDto secondPayDto, HttpHeaders headers) {
+        PayParamBo payParam = new PayParamBo();
+        // payDto -> payParam
+        BeanUtils.copyProperties(secondPayDto, payParam);
+        // 微信线上支付
+        payParam.setPayWay("WEIXIN");
+        String openId = null;
+        if (null == payParam.getState()) {
+            // 小程序微信授权获取登录信息
+            ResponseJson<Map<String, Object>> appletsInfo = weChatService.getInfoMapByApplets(payParam.getCode(), headers, 1);
+            if (appletsInfo.getCode() == -1) {
+                return ResponseJson.error(appletsInfo.getMsg(), null);
+            }
+            Map<String, Object> infoData = appletsInfo.getData();
+            openId = (String) infoData.get(WeChatService.Keys.OPEN_ID);
+            if (StringUtils.isEmpty(openId)) {
+                return ResponseJson.error("微信小程序获取openId失败!", null);
+            }
+            //小程序微信快捷支付
+            payParam.setPayType("MINIAPP_WEIXIN");
+        } else {
+            try {
+                // 微信公众号,通过code获取微信用户信息
+                Map<String, Object> map = weChatService.getInfoMapByWeb(payParam.getCode(), "crm");
+                openId = (String) map.get(WeChatService.Keys.OPEN_ID);
+            } catch (Exception e) {
+                log.error("try-catch:",e);
+            }
+            if (StringUtils.isEmpty(openId)) {
+                return ResponseJson.error("微信公众号获取openId失败!", null);
+            }
+            //pc微信扫码支付,微信公众号支付
+            payParam.setPayType("JSAPI_WEIXIN");
+        }
+        payParam.setOpenId(openId);
+        // 二手发布默认100元
+        payParam.setPayAmount(10000);
+        payParam.setNotifyUrl(secondHandUrl);
+        log.info("【二手发布微信支付】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>获取openId:" + openId);
+        return toPaySecond(payParam, headers);
+    }
+
+    /**
+     * 二手发布支付宝线上支付
+     *
+     * @param secondPayDto {
+     *                     productId      二手发布商品id
+     *                     returnUrl     页面回调地址
+     *                     }
+     * @param headers HttpHeaders
+     */
+    @Override
+    public ResponseJson<JSONObject> paySecondByAlipay(SecondPayDto secondPayDto, HttpHeaders headers) {
+        PayParamBo payParam = new PayParamBo();
+        // payDto -> payParam
+        BeanUtils.copyProperties(secondPayDto, payParam);
+        //支付宝支付
+        payParam.setPayWay("ALIPAY");
+        payParam.setPayType("ALIPAY_H5");
+        // 二手发布默认100元
+        payParam.setPayAmount(10000);
+        payParam.setNotifyUrl(secondHandUrl);
+        log.info("【二手发布支付宝支付】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>productId:" + payParam.getProductId());
+        return toPaySecond(payParam, headers);
+    }
+
+    /**
+     * 二手发布银联线上支付
+     *
+     * @param secondPayDto {
+     *                     productId       二手发布商品id
+     *                     returnUrl     页面回调地址
+     *                     bankCode      银行编码(银联支付使用)
+     *                     userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
+     *                     }
+     * @param headers HttpHeaders
+     */
+    @Override
+    public ResponseJson<JSONObject> paySecondByUnionPay(SecondPayDto secondPayDto, HttpHeaders headers) {
+        PayParamBo payParam = new PayParamBo();
+        // payDto -> payParam
+        BeanUtils.copyProperties(secondPayDto, payParam);
+        //支付宝支付
+        payParam.setPayWay("UNIONPAY");
+        payParam.setPayType("GATEWAY_UNIONPAY");
+        // 二手发布默认100元
+        payParam.setPayAmount(10000);
+        payParam.setNotifyUrl(secondHandUrl);
+        log.info("【二手发布银联支付】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>productId:" + payParam.getProductId());
+        return toPaySecond(payParam, headers);
+    }
+
+    /**
+     * 二手发布支付
+     */
+    private ResponseJson<JSONObject> toPaySecond(PayParamBo payParam, HttpHeaders headers) {
+        // 定义支付请求结果
+        JSONObject result = null;
+        try {
+            // 时间戳
+            long time = System.currentTimeMillis() / 1000;
+            // 用户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());
+            }
+            String environment = "";
+            if (payParam.getNotifyUrl().contains("18002")) {
+                environment = "DEV";
+            } else if (payParam.getNotifyUrl().contains("core-b")) {
+                environment = "BETA";
+            }
+            // 商户订单号
+            String orderId = payParam.getProductId() + "T" + time + environment;
+            json.put("orderId", orderId);
+            //商品名称
+            String product = "采美订单" + orderId;
+            json.put("product", product);
+            String attach = payParam.getProductId() + "," + payParam.getPayType();
+            json.put("attach", attach);
+            // 二手发布默认100元,默认私账
+            List<Map<String, String>> list = new ArrayList<>();
+            Map<String, String> map = new HashMap<>(3);
+            map.put("subUserNo", PayUtil.privateAccountNo);
+            map.put("splitBillType", "1");
+            map.put("splitBillValue", "1");
+            list.add(map);
+            String splitBillDetail = JSONObject.toJSONString(list);
+            json.put("splitBillDetail", splitBillDetail);
+            String sign = PayUtil.getPaySign(json, PayUtil.merKey);
+            json.put("sign", sign);
+            // 私钥加密
+            String data = RSAUtil.privateEncrypt(json.toJSONString(), PayUtil.merKey);
+            // 提交
+            result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/order/v1", PayUtil.merAccount, data);
+        } catch (Exception e) {
+            log.error("错误信息", e);
+            return ResponseJson.error("支付失败!", null);
+        }
+        String code = result.getString("code");
+        if (!"000000".equals(code)) {
+            String msg = result.getString("msg");
+            log.info("第三方支付失败>>>>>>>msg:" + msg);
+            return ResponseJson.error(msg, null);
+        }
+        // 保存二手发布分账参数
+        SplitAccountPo splitAccount = new SplitAccountPo();
+        splitAccount.setOrderId(payParam.getOrderId());
+        splitAccount.setProductId(payParam.getProductId());
+        // 二手交易供应商
+        splitAccount.setShopId(1252);
+        splitAccount.setProductType(4);
+        splitAccount.setType(2);
+        if ("UNIONPAY".equals(payParam.getPayWay())) {
+            splitAccount.setSplitAccount(92.00);
+        } else {
+            splitAccount.setSplitAccount(99.62);
+        }
+        JSONObject data = result.getJSONObject("data");
+        splitAccount.setMbOrderId(data.getString("mbOrderId"));
+        splitAccount.setOrderRequestNo(data.getString("orderId"));
+        splitAccount.setPayStatus(0);
+        // 保存分账详情
+        payOrderMapper.insertSplitAccount(splitAccount);
+
+        return ResponseJson.success(result);
+    }
+
+    /**
+     * 二手发布支付回调
+     */
+    @Override
+    public String paymentSecondCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException {
+        log.info("******************** 二手发布支付异步回调 start *******************");
+        // 公钥解密
+        JSONObject json = PayUtil.publicKeyDecrypt(data, PayUtil.publicKey);
+        log.info("公钥解密>>>>>>" + json);
+        // 公钥验签
+        String signaa = json.getString("sign");
+        json.remove("sign");
+        String signbb = PayUtil.getPaySign(json, PayUtil.publicKey);
+        if (!signaa.equals(signbb)) {
+            return "验签失败";
+        }
+        // 订单状态
+        String orderStatus = json.getString("orderStatus");
+        // 平台唯一流水号
+        String mbOrderId = json.getString("mbOrderId");
+        // 附加数据,下单时若有传输则原样返回,下单时为空,则不返回该数据
+        String attach = json.getString("attach");
+        // 订单金额,以元为单位
+        BigDecimal amount = json.getBigDecimal("amount");
+        log.info("订单状态>>>>>>" + orderStatus);
+        if ("FAILED".equals(orderStatus)) {
+            return "支付失败";
+        }
+        String[] split = attach.split(",");
+        // 订单id
+        Integer productId = Integer.valueOf(split[0]);
+        // 支付类型
+        String payType = split[1];
+        double payAmount = amount.doubleValue();
+        String payFormData = json.toJSONString();
+        payOrderMapper.updateSeconHandDetail(productId, payType, payAmount, payFormData);
+        //修改分账付款状态
+        payOrderMapper.updateSplitAccountByPay(mbOrderId);
+        return "SUCCESS";
+    }
+
+}

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

@@ -6,13 +6,12 @@ import com.caimei365.order.components.OrderCommonService;
 import com.caimei365.order.components.ProductService;
 import com.caimei365.order.components.WeChatService;
 import com.caimei365.order.mapper.BaseMapper;
-import com.caimei365.order.mapper.PayOrderMapper;
 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.PayDto;
 import com.caimei365.order.model.dto.PayLinkDto;
-import com.caimei365.order.model.dto.SecondPayDto;
 import com.caimei365.order.model.enums.OrderStatus;
 import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.vo.*;
@@ -35,7 +34,6 @@ import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-import java.math.BigDecimal;
 import java.security.NoSuchAlgorithmException;
 import java.security.spec.InvalidKeySpecException;
 import java.text.SimpleDateFormat;
@@ -72,8 +70,6 @@ public class PayOrderServiceImpl implements PayOrderService {
     private String linkPage;
     @Value("${pay.notify-url}")
     private String notifyUrl;
-    @Value("${pay.second-notify-url}")
-    private String secondHandUrl;
 
     /**
      * 订单支付前效验付款规则
@@ -867,246 +863,6 @@ public class PayOrderServiceImpl implements PayOrderService {
         return ResponseJson.success(result);
     }
 
-    /**
-     * 二手发布微信线上支付
-     *
-     * @param secondPayDto {
-     *                     productId      二手发布商品id
-     *                     returnUrl     页面回调地址
-     *                     code          微信小程序code
-     *                     state         微信公众号state参数
-     *                     }
-     * @param headers
-     */
-    @Override
-    public ResponseJson<JSONObject> paySecondByWeChat(SecondPayDto secondPayDto, HttpHeaders headers) {
-        PayParamBo payParam = new PayParamBo();
-        // payDto -> payParam
-        BeanUtils.copyProperties(secondPayDto, payParam);
-        // 微信线上支付
-        payParam.setPayWay("WEIXIN");
-        String openId = null;
-        if (null == payParam.getState()) {
-            // 小程序微信授权获取登录信息
-            ResponseJson<Map<String, Object>> appletsInfo = weChatService.getInfoMapByApplets(payParam.getCode(), headers, 1);
-            if (appletsInfo.getCode() == -1) {
-                return ResponseJson.error(appletsInfo.getMsg(), null);
-            }
-            Map<String, Object> infoData = appletsInfo.getData();
-            openId = (String) infoData.get(WeChatService.Keys.OPEN_ID);
-            if (StringUtils.isEmpty(openId)) {
-                return ResponseJson.error("微信小程序获取openId失败!", null);
-            }
-            //小程序微信快捷支付
-            payParam.setPayType("MINIAPP_WEIXIN");
-        } else {
-            try {
-                // 微信公众号,通过code获取微信用户信息
-                Map<String, Object> map = weChatService.getInfoMapByWeb(payParam.getCode(), "crm");
-                openId = (String) map.get(WeChatService.Keys.OPEN_ID);
-            } catch (Exception e) {
-                log.error("try-catch:",e);
-            }
-            if (StringUtils.isEmpty(openId)) {
-                return ResponseJson.error("微信公众号获取openId失败!", null);
-            }
-            //pc微信扫码支付,微信公众号支付
-            payParam.setPayType("JSAPI_WEIXIN");
-        }
-        payParam.setOpenId(openId);
-        // 二手发布默认100元
-        payParam.setPayAmount(10000);
-        payParam.setNotifyUrl(secondHandUrl);
-        log.info("【二手发布微信支付】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>获取openId:" + openId);
-        return toPaySecond(payParam, headers);
-    }
-
-    /**
-     * 二手发布支付宝线上支付
-     *
-     * @param secondPayDto {
-     *                     productId      二手发布商品id
-     *                     returnUrl     页面回调地址
-     *                     }
-     * @param headers
-     */
-    @Override
-    public ResponseJson<JSONObject> paySecondByAlipay(SecondPayDto secondPayDto, HttpHeaders headers) {
-        PayParamBo payParam = new PayParamBo();
-        // payDto -> payParam
-        BeanUtils.copyProperties(secondPayDto, payParam);
-        //支付宝支付
-        payParam.setPayWay("ALIPAY");
-        payParam.setPayType("ALIPAY_H5");
-        // 二手发布默认100元
-        payParam.setPayAmount(10000);
-        payParam.setNotifyUrl(secondHandUrl);
-        log.info("【二手发布支付宝支付】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>productId:" + payParam.getProductId());
-        return toPaySecond(payParam, headers);
-    }
-
-    /**
-     * 二手发布银联线上支付
-     *
-     * @param secondPayDto {
-     *                     productId       二手发布商品id
-     *                     returnUrl     页面回调地址
-     *                     bankCode      银行编码(银联支付使用)
-     *                     userType      用户类型(银联支付使用)企业:ENTERPRISE,个人:USER
-     *                     }
-     * @param headers
-     */
-    @Override
-    public ResponseJson<JSONObject> paySecondByUnionPay(SecondPayDto secondPayDto, HttpHeaders headers) {
-        PayParamBo payParam = new PayParamBo();
-        // payDto -> payParam
-        BeanUtils.copyProperties(secondPayDto, payParam);
-        //支付宝支付
-        payParam.setPayWay("UNIONPAY");
-        payParam.setPayType("GATEWAY_UNIONPAY");
-        // 二手发布默认100元
-        payParam.setPayAmount(10000);
-        payParam.setNotifyUrl(secondHandUrl);
-        log.info("【二手发布银联支付】>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>productId:" + payParam.getProductId());
-        return toPaySecond(payParam, headers);
-    }
-
-    /**
-     * 二手发布支付
-     */
-    private ResponseJson<JSONObject> toPaySecond(PayParamBo payParam, HttpHeaders headers) {
-        // 定义支付请求结果
-        JSONObject result = null;
-        try {
-            // 时间戳
-            long time = System.currentTimeMillis() / 1000;
-            // 用户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());
-            }
-            String environment = "";
-            if (payParam.getNotifyUrl().contains("18002")) {
-                environment = "DEV";
-            } else if (payParam.getNotifyUrl().contains("core-b")) {
-                environment = "BETA";
-            }
-            // 商户订单号
-            String orderId = payParam.getProductId() + "T" + time + environment;
-            json.put("orderId", orderId);
-            //商品名称
-            String product = "采美订单" + orderId;
-            json.put("product", product);
-            String attach = payParam.getProductId() + "," + payParam.getPayType();
-            json.put("attach", attach);
-            // 二手发布默认100元,默认私账
-            List<Map<String, String>> list = new ArrayList<>();
-            Map<String, String> map = new HashMap<>(3);
-            map.put("subUserNo", PayUtil.privateAccountNo);
-            map.put("splitBillType", "1");
-            map.put("splitBillValue", "1");
-            list.add(map);
-            String splitBillDetail = JSONObject.toJSONString(list);
-            json.put("splitBillDetail", splitBillDetail);
-            String sign = PayUtil.getPaySign(json, PayUtil.merKey);
-            json.put("sign", sign);
-            // 私钥加密
-            String data = RSAUtil.privateEncrypt(json.toJSONString(), PayUtil.merKey);
-            // 提交
-            result = PayUtil.httpGet("https://platform.mhxxkj.com/paygateway/mbpay/order/v1", PayUtil.merAccount, data);
-        } catch (Exception e) {
-            log.error("错误信息", e);
-            return ResponseJson.error("支付失败!", null);
-        }
-        String code = result.getString("code");
-        if (!"000000".equals(code)) {
-            String msg = result.getString("msg");
-            log.info("第三方支付失败>>>>>>>msg:" + msg);
-            return ResponseJson.error(msg, null);
-        }
-        // 保存二手发布分账参数
-        SplitAccountPo splitAccount = new SplitAccountPo();
-        splitAccount.setOrderId(payParam.getOrderId());
-        splitAccount.setProductId(payParam.getProductId());
-        // 二手交易供应商
-        splitAccount.setShopId(1252);
-        splitAccount.setProductType(4);
-        splitAccount.setType(2);
-        if ("UNIONPAY".equals(payParam.getPayWay())) {
-            splitAccount.setSplitAccount(92.00);
-        } else {
-            splitAccount.setSplitAccount(99.62);
-        }
-        JSONObject data = result.getJSONObject("data");
-        splitAccount.setMbOrderId(data.getString("mbOrderId"));
-        splitAccount.setOrderRequestNo(data.getString("orderId"));
-        splitAccount.setPayStatus(0);
-        // 保存分账详情
-        payOrderMapper.insertSplitAccount(splitAccount);
-
-        return ResponseJson.success(result);
-    }
-
-    /**
-     * 二手发布支付回调
-     *
-     * @param data
-     */
-    @Override
-    public String paymentSecondCallback(String data) throws NoSuchAlgorithmException, InvalidKeySpecException {
-        log.info("******************** 二手发布支付异步回调 start *******************");
-        // 公钥解密
-        JSONObject json = PayUtil.publicKeyDecrypt(data, PayUtil.publicKey);
-        log.info("公钥解密>>>>>>" + json);
-        // 公钥验签
-        String signaa = json.getString("sign");
-        json.remove("sign");
-        String signbb = PayUtil.getPaySign(json, PayUtil.publicKey);
-        if (!signaa.equals(signbb)) {
-            return "验签失败";
-        }
-        // 订单状态
-        String orderStatus = json.getString("orderStatus");
-        // 平台唯一流水号
-        String mbOrderId = json.getString("mbOrderId");
-        // 附加数据,下单时若有传输则原样返回,下单时为空,则不返回该数据
-        String attach = json.getString("attach");
-        // 订单金额,以元为单位
-        BigDecimal amount = json.getBigDecimal("amount");
-        log.info("订单状态>>>>>>" + orderStatus);
-        if ("FAILED".equals(orderStatus)) {
-            return "支付失败";
-        }
-        String[] split = attach.split(",");
-        // 订单id
-        Integer productId = Integer.valueOf(split[0]);
-        // 支付类型
-        String payType = split[1];
-        double payAmount = amount.doubleValue();
-        String payFormData = json.toJSONString();
-        payOrderMapper.updateSeconHandDetail(productId, payType, payAmount, payFormData);
-        //修改分账付款状态
-        payOrderMapper.updateSplitAccountByPay(mbOrderId);
-        return "SUCCESS";
-    }
-
     /**
      * 延时分账
      *