Просмотр исходного кода

Merge remote-tracking branch 'origin/zx_saas_goods' into zx_saas_goods

zouxuan 1 год назад
Родитель
Сommit
0c1443d674

+ 9 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/StudentPaymentOrderServiceImpl.java

@@ -1831,6 +1831,15 @@ public class StudentPaymentOrderServiceImpl extends BaseServiceImpl<Long, Studen
                 model.setStatus(false);
                 order.setStatus(CLOSE);
                 order.setMemo(reason);
+            } else {
+                // 执行关单操作
+                if(StringUtils.equals(order.getPaymentChannel(), PaymentChannelEnum.ADAPAY.getCode())) {
+                    Payment.closeWithKey(order.getTransNo(),"", hfMerchantConfig.getMerKey());
+                }else if(StringUtils.equals(order.getPaymentChannel(), PaymentChannelEnum.YEEPAY.getCode())) {
+                    yeepayPaymentService.close(hfMerchantConfig, order.getTransNo(),"", order.getOrderNo());
+                }
+                model.setStatus(false);
+                order.setStatus(CLOSE);
             }
             TenantContextHolder.setTenantId(order.getTenantId());
             callOrderCallBack(order);

+ 14 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/controller/OmsOrderController.java

@@ -60,6 +60,20 @@ public class OmsOrderController {
         return CommonResult.failed("当前状态不可关闭");
     }
 
+
+    @ApiOperation("批量完成订单")
+    @RequestMapping(value = "/update/success", method = RequestMethod.POST)
+    @ResponseBody
+    public CommonResult success(@RequestBody List<Long> ids) {
+
+         int count = orderService.success(ids);
+        // if (count > 0) {
+        //     return CommonResult.success(count);
+        // }
+        return CommonResult.success(true);
+    }
+
+
     @ApiOperation("批量删除订单")
     @RequestMapping(value = "/delete", method = RequestMethod.POST)
     @ResponseBody

+ 2 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/OmsOrderService.java

@@ -100,4 +100,6 @@ public interface OmsOrderService {
 
     // 同步订单状态,
     boolean productUpdateOrderStatus(String orderNo, Integer status);
+
+    int success(List<Long> ids);
 }

+ 25 - 0
mec-mall/mall-admin/src/main/java/com/yonge/cooleshow/admin/service/impl/OmsOrderServiceImpl.java

@@ -790,4 +790,29 @@ public class OmsOrderServiceImpl implements OmsOrderService {
 
         return true;
     }
+
+    // 直接修改订单状态为完成
+    @Override
+    @Transactional
+    public int success(List<Long> ids) {
+        OmsOrder record = new OmsOrder();
+        record.setStatus(3);
+        OmsOrderExample example = new OmsOrderExample();
+        example.createCriteria().andDeleteStatusEqualTo(0).andIdIn(ids);
+        orderMapper.updateByExampleSelective(record, example);
+
+
+        //添加操作记录
+        List<OmsOrderOperateHistory> operateHistoryList = ids.stream()
+            .map(id -> {
+                OmsOrderOperateHistory history = new OmsOrderOperateHistory();
+                history.setOrderId(id);
+                history.setCreateTime(new Date());
+                history.setOperateMan("后台管理员");
+                history.setOrderStatus(3);
+                history.setNote("订单完成");
+                return history;
+            }).collect(Collectors.toList());
+        return orderOperateHistoryDao.insertList(operateHistoryList);
+    }
 }

+ 58 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/Payment.java

@@ -5,6 +5,7 @@ import java.util.*;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.google.common.collect.Lists;
 import com.huifu.adapay.core.exception.BaseAdaPayException;
 import com.huifu.adapay.core.util.StringUtil;
 import com.huifu.adapay.model.PaymentReverse;
@@ -13,6 +14,8 @@ import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.thirdparty.exception.ThirdpartyException;
 
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.util.CollectionUtils;
@@ -198,4 +201,59 @@ public class Payment {
         }
         return BaseResult.succeed(res);
     }
+
+
+    /**
+     *
+     针对已经创建的 支付对象,您可以调用关单接口进行交易的关闭。调用此接口后,该用户订单将不再能支付成功。 对于关单功能的使用有如下规则:
+     1.存在关单记录,不能再次关单
+     2.交易时间 1分钟 内无法关单成功
+     3.正扫交易时间超过 2小时 无法关单成功
+     4.支付宝正扫接口,如果用户没有扫码,订单不能关闭成功(二维码给用户展示,如果用户没有用手机去扫码,那这笔就不能关单; 如果用户扫过了的话(无需支付成功)就可以关单了)—-微信正扫无此条限制
+     5.网银和快捷类交易都不支持关单操作
+     对于已经成功付款的订单,请使用 退款对象 接口进行退款处理。我们建议您只有针对未支付的订单调用关单接口。
+     * @param transNo 交易流水号
+     * @param reason 原因
+     * @param merchantKey 商户Key
+     * @return Map<String, Object>
+     */
+    public static Map<String ,Object> closeWithKey(String transNo, String reason, String merchantKey) {
+
+
+        Map<String, Object> result = new HashMap<>();
+
+        Map<String, Object> params = new HashMap<>();
+
+        params.put("payment_id", transNo);
+        params.put("reason", reason);
+        //params.put("notify_url", adapayPaymentConfig.getPayNotifyUrl());
+
+        Map<String, Object> paymentClose = new HashMap<>();
+        try {
+            paymentClose =  com.huifu.adapay.model.Payment.close(params, merchantKey);
+        } catch (BaseAdaPayException e) {
+            LOGGER.info("请求汇付[关单]接口失败:{}", e.getMessage());
+            result.put("status", "failed");
+            return result;
+        }
+        if (StringUtils.equals(paymentClose.get("status").toString(), "failed")) {
+            LOGGER.error("调用汇付[关单]接口同步返回,出现异常:{}", paymentClose);
+
+            // 忽略关单异常
+            // channel_close_fail 通道关单失败
+            // close_order_exists 关单记录已存在,不允许重复关单
+            List<String> errorCodes = Lists.newArrayList("close_order_exists"); // "channel_close_fail", "frequent_request"
+            // 关单记录已存在,不允许重复关单,重复关单会不抛出异常,只记录异常信息
+            if (errorCodes.contains(paymentClose.get("error_code").toString())) {
+                LOGGER.warn("调用汇付[关单]接口同步返回,出现异常:{}", paymentClose);
+
+                result.put("status", "success");
+            }
+            result.put("status", "failed");
+            // throw new PaymentException(paymentClose.get("error_msg").toString());
+        }
+
+        return result;
+    }
+
 }

+ 58 - 2
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/yeepay/YeepayPaymentService.java

@@ -1,9 +1,11 @@
 package com.ym.mec.thirdparty.yeepay;
 
 import java.io.IOException;
-import java.util.Date;
-import java.util.Map;
+import java.util.*;
 
+import com.google.common.collect.Lists;
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -103,4 +105,58 @@ public class YeepayPaymentService {
 		
 		return jsonObject;
 	}
+
+
+    /**
+     * 关闭订单
+     * @param transNo 交易流水号
+     * @param reason 原因
+     * @return Map<String, Object>
+     */
+    public Map<String,Object> close(HfMerchantConfig hfMerchantConfig,String transNo, String reason, String outTransNo) {
+
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("status", "failed");
+        try {
+
+            // 订单参数
+            YopRequest request = new YopRequest(hfMerchantConfig.getAppId(), hfMerchantConfig.getRsaPrivateKey())
+                .addParam("parentMerchantNo", hfMerchantConfig.getPlatformPayeeMemberId())
+                .addParam("merchantNo", hfMerchantConfig.getPlatformPayeeMemberId())
+                .addParam("uniqueOrderNo", transNo)
+                .addParam("orderId", outTransNo);
+
+            LOGGER.info("易宝[关闭订单] Req:{}", request.getParams());
+
+            // 关闭订单
+            YopResponse ret = YopRsaClient.post("/rest/v1.0/trade/order/close", request);
+            LOGGER.info("易宝[关闭订单]返回结果:transNo={}, {}", transNo, ret.getStringResult());
+
+            // 关闭订单异常消息
+            if (Objects.nonNull(ret.getError())) {
+                LOGGER.error("易宝[关闭订单]接口失败:transNo={}, reason={}", transNo, reason, ret.getError());
+                result.put("status", "failed");
+            }
+
+            JSONObject jsonObject = JSON.parseObject(ret.getStringResult());
+
+            // 关闭订单成功
+            // OPR00000	成功
+            // OPR18015	已拒绝支付,不必关闭订单
+            // OPR18017	订单已过期,不必关闭订单
+            ArrayList<String> retCodes = Lists.newArrayList("OPR00000", "OPR18015", "OPR18017");
+            if (retCodes.contains(jsonObject.getString("code"))) {
+                result.put("status", "success");
+            }
+
+        } catch (Exception e) {
+            LOGGER.error("易宝[关闭订单]接口失败:transNo={}, reason={}", transNo, reason, e);
+            result.put("status", "failed");
+
+        }
+
+
+        return result;
+    }
 }