Browse Source

网银bugfix

zhijiezhao 3 years ago
parent
commit
a810aa13e5

+ 70 - 0
src/main/java/com/caimei365/order/components/OnlinePostFormUtil.java

@@ -0,0 +1,70 @@
+package com.caimei365.order.components;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.FormBody;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Administrator
+ */
+
+@Slf4j
+public class OnlinePostFormUtil {
+
+    public static OkHttpClient client = new OkHttpClient.Builder()
+            .connectTimeout(3, TimeUnit.SECONDS)
+            .readTimeout(20, TimeUnit.SECONDS)
+            .build();
+
+    public static <T> T postForm(Map<String, String> params, String url, String sign, Class<T> clazz) {
+        FormBody.Builder builder = new FormBody.Builder();
+        for (Map.Entry<String, String> entry : params.entrySet()) {
+            builder.add(entry.getKey(), entry.getValue());
+        }
+        builder.add("sign", sign);
+
+        Request request = new Request.Builder() // okHttp post
+                .url(url)
+                .post(builder.build())
+                .build();
+
+        Response response = null;
+        try {
+            response = client.newCall(request).execute();
+        } catch (IOException e) {
+            throw new IllegalStateException("请求出错", e);
+        }
+        if (!response.isSuccessful()) {
+            try {
+                System.out.println(response.body().string());
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+            throw new RuntimeException("请求失败了: http response code: " + response.code());
+        }
+
+        okhttp3.ResponseBody body = response.body();
+        String content = null;
+        try {
+            content = body.string();
+        } catch (IOException e) {
+            throw new IllegalStateException("IO异常", e);
+        }
+        JSONObject res = JSON.parseObject(content);
+        //网银查询回调
+        if (!"SUCCESS".equals(res.getString("rt10_orderStatus"))) {
+            log.info(res.toString());
+        }
+        /** rt4_success 为 true,需验签  **/
+        return res.toJavaObject(clazz);
+    }
+
+}

+ 5 - 4
src/main/java/com/caimei365/order/controller/HeliPayApi.java

@@ -165,7 +165,7 @@ public class HeliPayApi {
      */
     @ApiOperation("判断此次支付是否完成(旧:/PayOrder/payWhetherSuccess)")
     @ApiImplicitParams({
-            @ApiImplicitParam(required = false, name = "shopOrderId", value = "订单id"),
+            @ApiImplicitParam(required = false, name = "shopOrderId", value = "订单id"),
             @ApiImplicitParam(required = false, name = "paySuccessCounter", value = "付款次数")
     })
     @GetMapping("/result/check")
@@ -186,18 +186,19 @@ public class HeliPayApi {
      */
     @ApiOperation("查询本次支付订单结果(旧:/PayOrder/findOrderStatus)")
     @ApiImplicitParams({
-            @ApiImplicitParam(required = false, name = "mbOrderId", value = "平台唯一流水号"),
+            @ApiImplicitParam(required = true, name = "mbOrderId", value = "平台唯一流水号"),
+            @ApiImplicitParam(required = true, name = "orderFlag", value = "订单标识:0非订单,1订单"),
             @ApiImplicitParam(required = false, name = "orderFlag", value = "订单标识:0非订单,1订单"),
     })
     @GetMapping("/result/json")
-    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId,Integer orderFlag) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId,Integer orderFlag,Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
         if (null == mbOrderId) {
             return ResponseJson.error("平台唯一流水号不能为空!", null);
         }
         if (null == orderFlag) {
             return ResponseJson.error("订单标识不能为空!", null);
         }
-        return heliPayService.getPayOrderResult(mbOrderId, orderFlag);
+        return heliPayService.getPayOrderResult(mbOrderId, orderFlag,shopOrderId);
     }
 
     /**

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

@@ -248,9 +248,9 @@ public interface PayOrderMapper {
 
     Integer getOrderId(Integer shopOrderId);
 
-    String getSplitCodeByMbOrderId(String mbOrderId);
-
     List<BankCodeVo> findB2BBankCode();
 
     List<BankCodeVo> findB2CBankCode();
+
+    String getSplitCodeByShopOrderId(Integer shopOrderId);
 }

+ 40 - 0
src/main/java/com/caimei365/order/model/vo/OnlineCheckVo.java

@@ -0,0 +1,40 @@
+package com.caimei365.order.model.vo;
+
+import com.google.common.collect.ImmutableSet;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.Set;
+
+@Setter
+@Getter
+@ToString
+public class OnlineCheckVo implements Serializable {
+    private String rt1_bizType;
+    private String rt2_retCode;
+    private String rt3_customerNumber;
+    private String rt4_orderId;
+    private String rt5_orderAmount;
+    private String rt6_bankId;
+    private String rt7_business;
+    private String rt8_createDate;
+    private String rt9_completeDate;
+    private String rt10_orderStatus;
+    private String rt11_desc;
+    //DEBIT:借记卡
+    //CREDIT:贷记卡
+    //UNKNOWN:未知ZCREDIT:准贷记卡
+    //DEBIT_CREDIT:借贷合一
+    private String onlineCardType;
+    private String sign;
+
+
+    /**
+     * 需要加签的属性参数
+     * 看接口文档
+     */
+    public static final Set<String> NEED_SIGN_PARAMS = ImmutableSet.of("rt1_bizType", "rt2_retCode", "rt3_customerNumber",
+            "rt4_orderId", "rt5_orderAmount", "rt6_bankId", "rt7_business", "rt8_createDate","rt9_completeDate","rt10_orderStatus");
+}

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

@@ -43,7 +43,7 @@ public interface HeliPayService {
 
     ResponseJson<Map<String, Object>> bankCode();
 
-    ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
+    ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag,Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException;
     /**
      * 银联回调
      */

+ 89 - 42
src/main/java/com/caimei365/order/service/impl/HeliPayServiceImpl.java

@@ -3,6 +3,7 @@ package com.caimei365.order.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.caimei365.order.components.HeliPayUtil;
+import com.caimei365.order.components.OnlinePostFormUtil;
 import com.caimei365.order.components.WeChatService;
 import com.caimei365.order.constant.Constant;
 import com.caimei365.order.mapper.BaseMapper;
@@ -840,67 +841,113 @@ public class HeliPayServiceImpl implements HeliPayService {
         List<BankCodeVo> B2B = payOrderMapper.findB2BBankCode();
         List<BankCodeVo> B2C = payOrderMapper.findB2CBankCode();
         Map<String, Object> banks = new HashMap<>(2);
-        banks.put("B2B",B2B);
-        banks.put("B2C",B2C);
+        banks.put("B2B", B2B);
+        banks.put("B2C", B2C);
         return ResponseJson.success("获取成功", banks);
     }
 
     @Override
-    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
+    public ResponseJson<JSONObject> getPayOrderResult(String mbOrderId, Integer orderFlag, Integer shopOrderId) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
         log.info("--------进入交易订单查询接口----------");
-        QueryOrderVo queryOrderVo = new QueryOrderVo();
-        queryOrderVo.setP1_bizType("AppPayQuery");
-        queryOrderVo.setP2_orderId(mbOrderId);
-        if (0 == orderFlag) {
-            queryOrderVo.setP3_customerNumber(Constant.CUSTOMERNUM);
-        } else {
-            String splitCode = payOrderMapper.getSplitCodeByMbOrderId(mbOrderId);
-            queryOrderVo.setP3_customerNumber(splitCode);
-        }
-        Map<String, String> map = MyBeanUtils.convertBean(queryOrderVo, new LinkedHashMap());
-        String oriMessage = MyBeanUtils.getSignedByPresetParameter(map, QueryOrderVo.NEED_SIGN_PARAMS);
         //区分网银和其他产品
         String payType = baseMapper.findType(mbOrderId);
         if ("12".equals(payType) || "17".equals(payType)) {
-            oriMessage += Constant.SPLIT + Constant.WANGYIN;
+            String customerNumber = "";
+            if (0 == orderFlag) {
+                customerNumber = Constant.CUSTOMERNUM;
+            } else {
+                if (null == shopOrderId) {
+                    return ResponseJson.error("子订单Id不能为空!", null);
+                }
+                String splitCode = payOrderMapper.getSplitCodeByShopOrderId(shopOrderId);
+                if (null == splitCode) {
+                    return ResponseJson.error("订单信息不正确!", null);
+                }
+                customerNumber = splitCode;
+            }
+            Map<String, String> sPara = new HashMap<String, String>();
+            sPara.put("P1_bizType", "OnlineQuery");
+            sPara.put("P2_orderId", mbOrderId);
+            sPara.put("P3_customerNumber", customerNumber);
+            StringBuffer sb = new StringBuffer();
+            sb.append("&").append("OnlineQuery").append("&").append(mbOrderId).append("&")
+                    .append(customerNumber).append("&").append(WANGYIN);
+            String sign = Disguiser.disguiseMD5(sb.toString());
+            sPara.put("sign", sign);
+            try {
+                OnlineCheckVo on= OnlinePostFormUtil.postForm(sPara, YL, sign, OnlineCheckVo.class);
+                JSONObject jsonObject = JSONObject.parseObject(JSONObject.toJSONString(on), JSONObject.class);
+                if (!"0000".equals(on.getRt2_retCode())) {
+                    log.info("查询失败:" + on.toString());
+                    return ResponseJson.error("查询失败",jsonObject);
+                } else {
+                    String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(on, OnlineCheckVo.NEED_SIGN_PARAMS);
+                    log.info("组装返回结果签名串:" + assemblyRespOriSign);
+                    assemblyRespOriSign += Constant.SPLIT + WANGYIN;
+                    String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
+                    if(!checkSign.equals(on.getSign())){
+                        return ResponseJson.error("验签失败",jsonObject);
+                    }else{
+                        return ResponseJson.success("查询成功",jsonObject);
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
         } else {
-            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");
-            QueryOrderResponseVo queryOrderResponseVo = JSONObject.parseObject(resultMsg, QueryOrderResponseVo.class);
-            String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(queryOrderResponseVo, QueryOrderResponseVo.NEED_SIGN_PARAMS);
-            log.info("组装返回结果签名串:" + assemblyRespOriSign);
-            if ("12".equals(payType) || "17".equals(payType)) {
-                assemblyRespOriSign += Constant.SPLIT + Constant.WANGYIN;
+            QueryOrderVo queryOrderVo = new QueryOrderVo();
+            queryOrderVo.setP1_bizType("AppPayQuery");
+            queryOrderVo.setP2_orderId(mbOrderId);
+            if (0 == orderFlag) {
+                queryOrderVo.setP3_customerNumber(Constant.CUSTOMERNUM);
             } else {
-                assemblyRespOriSign += Constant.SPLIT + Constant.SAOMA;
+                if (null == shopOrderId) {
+                    return ResponseJson.error("子订单Id不能为空!", null);
+                }
+                String splitCode = payOrderMapper.getSplitCodeByShopOrderId(shopOrderId);
+                if (null == splitCode) {
+                    return ResponseJson.error("订单信息不正确!", null);
+                }
+                queryOrderVo.setP3_customerNumber(splitCode);
             }
-            String responseSign = queryOrderResponseVo.getSign();
-            log.info("响应签名:" + responseSign);
-            String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
-            if (checkSign.equals(responseSign)) {
-                if ("0000".equals(queryOrderResponseVo.getRt2_retCode())) {
-                    JSONObject jsonObject = JSONObject.parseObject(resultMsg, JSONObject.class);
-                    return ResponseJson.success("查询成功", jsonObject);
+
+            Map<String, String> map = MyBeanUtils.convertBean(queryOrderVo, new LinkedHashMap());
+            String oriMessage = MyBeanUtils.getSignedByPresetParameter(map, QueryOrderVo.NEED_SIGN_PARAMS);
+            oriMessage += Constant.SPLIT + Constant.SAOMA;
+            log.info("签名原文串:" + oriMessage);
+            String sign = Disguiser.disguiseMD5(oriMessage.trim());
+            log.info("md5加密签名串:" + 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");
+                QueryOrderResponseVo queryOrderResponseVo = JSONObject.parseObject(resultMsg, QueryOrderResponseVo.class);
+                String assemblyRespOriSign = MyBeanUtils.getSignedByPresetParameter(queryOrderResponseVo, QueryOrderResponseVo.NEED_SIGN_PARAMS);
+                log.info("组装返回结果签名串:" + assemblyRespOriSign);
+                assemblyRespOriSign += Constant.SPLIT + Constant.SAOMA;
+                String responseSign = queryOrderResponseVo.getSign();
+                log.info("响应签名:" + responseSign);
+                String checkSign = Disguiser.disguiseMD5(assemblyRespOriSign.trim());
+                if (checkSign.equals(responseSign)) {
+                    if ("0000".equals(queryOrderResponseVo.getRt2_retCode())) {
+                        JSONObject jsonObject = JSONObject.parseObject(resultMsg, JSONObject.class);
+                        return ResponseJson.success("查询成功", jsonObject);
+                    } else {
+                        return ResponseJson.error("验签失败", null);
+                    }
                 } else {
                     return ResponseJson.error("验签失败", null);
                 }
             } else {
-                return ResponseJson.error("验签失败", null);
+                return ResponseJson.error("查询失败", null);
             }
-        } else {
-            return ResponseJson.error("查询失败", null);
         }
+        return null;
     }
 
+
     @Override
     public String unionCallback(UnionResVo res) throws IntrospectionException, InvocationTargetException, IllegalAccessException {
         log.info("******************** 网银支付异步回调 start *******************");

+ 5 - 6
src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java

@@ -1092,10 +1092,10 @@ public class SubmitServiceImpl implements SubmitService {
             //在店铺满减算完之后重新根据商品的splitCode排shopOrderList
             List<OrderShopPo> shops = submitMapper.findShops(productIdList);
             //子订单分多子订单,满减分摊到原子订单分开的子订单,无满减重算佣金/应付
-            if (shops.size() != shopOrderList.size()) {
-                //找要拆分的子订单,重赋值needpay计算不包含分摊优惠的金额
+//            if (shops.size() != shopOrderList.size()) {
+                //重组订单
                 findSplitShopOrder(orderProductList, shopOrderList, shops, orderParamBo);
-            }
+//            }
             //线上支付分摊优惠总和到子订单
             //经理折扣+优惠券+满减 提交订单的时候无经理折扣
             double allDiscount = MathUtil.add(couponAmount, promotionFullReduction.get()).doubleValue();
@@ -1625,10 +1625,10 @@ public class SubmitServiceImpl implements SubmitService {
 
     private void findSplitShopOrder(List<OrderProductPo> orderProductList, List<OrderShopPo> shopOrderList, List<OrderShopPo> shops, OrderParamBo orderParamBo) {
         //统计拆分的shop
-        List<OrderShopPo> collect = shops.stream().filter(s -> shops.stream().filter(so -> so.getShopId().equals(s.getShopId())).count() > 1).collect(Collectors.toList());
+        //List<OrderShopPo> collect = shops.stream().filter(s -> shops.stream().filter(so -> so.getShopId().equals(s.getShopId())).count() > 1).collect(Collectors.toList());
         //对拆分的shop重新计算子订单佣金,应付,不计入店铺满减
         ArrayList<OrderShopPo> orderShopPos = new ArrayList<>();
-        for (OrderShopPo shop : collect) {
+        for (OrderShopPo shop : shops) {
             // 供应商名称
             String shopName = baseMapper.getShopNameById(shop.getShopId());
             /*
@@ -1643,7 +1643,6 @@ public class SubmitServiceImpl implements SubmitService {
             // 用户Id
             shopOrder.setUserId(oldShop.get(0).getUserId());
             shopOrder.setClubId(oldShop.get(0).getClubId());
-            // todo ??
             if (null != oldShop.get(0).getOrderPromotionsId()) {
                 shopOrder.setOrderPromotionsId(oldShop.get(0).getOrderPromotionsId());
             }

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

@@ -645,7 +645,7 @@
                cop.realPay,
                cop.receiptAmount,
                cop.receiptStatus,
-               cop.paySuccessCounter,
+               ifnull(cop.paySuccessCounter,0) as paySuccessCounter,
                p.name          as shopName
         FROM cm_shop_order cop
                  left join shop p on cop.shopID = p.shopID

+ 4 - 6
src/main/resources/mapper/PayOrderMapper.xml

@@ -220,7 +220,7 @@
         SELECT id FROM cm_promotions_order WHERE orderId = #{orderId} LIMIT 1
     </select>
     <select id="getDbPaySuccessCounter" resultType="java.lang.Integer">
-        SELECT paySuccessCounter FROM cm_shop_order
+        SELECT ifnull(paySuccessCounter,0) FROM cm_shop_order
         WHERE shopOrderID = #{shopOrderId} AND delFlag = '0'
     </select>
 
@@ -369,11 +369,6 @@
     <select id="getOrderId" resultType="java.lang.Integer">
         select orderId from cm_shop_order where shopOrderID = #{shopOrderId}
     </select>
-    <select id="getSplitCodeByMbOrderId" resultType="java.lang.String">
-        select cso.splitCode from cm_shop_order cso
-            left join cm_receipt_order_relation cror on cso.shopOrderID = cror.shopOrderId
-        where cror.orderRequestNo = #{mbOrderId}
-    </select>
     <select id="findB2BBankCode" resultType="com.caimei365.order.model.vo.BankCodeVo">
         select id, bankName, B2B, bankLogo, delFlag
         from cm_bankcode
@@ -388,4 +383,7 @@
           and B2C != ''
           and delFlag = 0
     </select>
+    <select id="getSplitCodeByShopOrderId" resultType="java.lang.String">
+        select splitCode from cm_shop_order where shopOrderID = #{shopOrderId}
+    </select>
 </mapper>