소스 검색

fix:退款

liujunchi 2 년 전
부모
커밋
b579cfa853

+ 9 - 0
mec-client-api/src/main/java/com/ym/mec/web/WebFeignService.java

@@ -5,6 +5,7 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
 import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import com.ym.mec.web.fallback.WebFeignServiceFallback;
 import org.springframework.cloud.openfeign.FeignClient;
@@ -56,4 +57,12 @@ public interface WebFeignService {
 
 	@PostMapping("/api/mallSaveOrderInfo")
 	HttpResponseResult<Map> mallSaveOrderInfo(@RequestBody MallCreateOrderModel model);
+
+	// 商城获取 退款数据
+	@GetMapping("/api/getRefundInfo")
+	HttpResponseResult<Map<String,String>> getBaseUrl(@RequestParam("orderNo") String orderNo);
+
+	// 商城获取 退款数据
+	@GetMapping("/api/refund")
+	public HttpResponseResult<BaseResult<Map<String, Object>>> refund(@RequestParam Map<String,Object> refundInfo);
 }

+ 11 - 0
mec-client-api/src/main/java/com/ym/mec/web/fallback/WebFeignServiceFallback.java

@@ -4,6 +4,7 @@ import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
 import com.ym.mec.common.page.QueryInfo;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.thirdparty.adapay.entity.HfMerchantConfig;
 import org.springframework.stereotype.Component;
 
@@ -80,4 +81,14 @@ public class WebFeignServiceFallback implements WebFeignService {
 	public HttpResponseResult<Map> mallSaveOrderInfo(MallCreateOrderModel model) {
 		return null;
 	}
+
+	@Override
+	public HttpResponseResult<Map<String, String>> getBaseUrl(String orderNo) {
+		return null;
+	}
+
+	@Override
+	public HttpResponseResult<BaseResult<Map<String, Object>>> refund(Map<String, Object> refundInfo) {
+		return null;
+	}
 }

+ 2 - 0
mec-mall/mall-mbg/src/main/java/com/yonge/cooleshow/mbg/mapper/UserOrderRefundMapper.java

@@ -42,4 +42,6 @@ public interface UserOrderRefundMapper {
     UserOrderRefund selectByRefundNo(@Param("refundOrderNo") String refundOrderNo);
 
     UserOrderRefund selectByPayOrderNo( @Param("payOrderNo") String payOrderNo);
+
+    UserOrderRefund selectByPayTansNo(@Param("payTransNo") String payTransNo);
 }

+ 7 - 0
mec-mall/mall-mbg/src/main/resources/config/mybatis/UserOrderRefundMapper.xml

@@ -364,4 +364,11 @@
     from user_order_refund
     where #{payOrderNo} = pay_order_no_   and status_ = 'succeeded'
   </select>
+
+  <select id="selectByPayTansNo" resultMap="BaseResultMap">
+    select
+    <include refid="Base_Column_List" />
+    from user_order_refund
+    where #{payTransNo} = pay_trans_no_ limit 1
+  </select>
 </mapper>

+ 1 - 1
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/OmsPortalOrderController.java

@@ -202,7 +202,7 @@ public class OmsPortalOrderController {
         DistributedLock.of(redissonClient)
                        .runIfLockCanGet(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(omsOrder.getOrderSn())
                                , () -> {
-                                       if (omsOrder.getStatus() == 0 || omsOrder.getStatus() == 6) {
+                                       if (true) {
 
                                            UserOrderPayment orderPayment = userOrderPaymentService.getByOrderNoAndStatusPaying(
                                                    omsOrder.getOrderSn());

+ 8 - 28
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/controller/PaymentController.java

@@ -51,34 +51,6 @@ public class PaymentController extends BaseController {
     @Autowired
     private RedissonClient redissonClient;
 
-    // 调用管乐迷里的
-    // @ApiOperation(value = "订单付款")
-    // @PostMapping("/orderPay")
-    public HttpResponseResult<OrderPayRes> orderPay(@Valid @RequestBody Map payReq, HttpServletRequest request) {
-        SysUser user = sysUserFeignService.queryUserInfo();
-        if (user == null || null == user.getId()) {
-            return failed(HttpStatus.FORBIDDEN, "请登录");
-        }
-        String orderNo = MapUtil.getStr(payReq,"orderNo");
-
-        RLock lock = redissonClient.getLock(OrderCacheEnum.LOCK_ORDER_NO_MALL.getRedisKey(orderNo));
-        try {
-            boolean b = lock.tryLock(60, TimeUnit.SECONDS);
-            if (b) {
-                return orderService.orderPay(payReq);
-            }
-            return failed("请求超时");
-        } catch (BizException e) {
-            return failed(e.getMessage());
-        } catch (Exception e) {
-            e.printStackTrace();
-            return failed("付款失败");
-        } finally {
-            if (lock.getHoldCount()>0) {
-                lock.unlock();
-            }
-        }
-    }
 
 
     /***
@@ -130,7 +102,15 @@ public class PaymentController extends BaseController {
                                 orderService.paymentFailedHandle(dataObj.getString("order_no"),notifyMap);
 
                                 break;
+                            case "refund.succeeded" :
+
+                                orderService.paymentRefundSucceededHandle(dataObj.getString("payment_id")
+                                                ,dataObj.getString("refund_amt"),dataObj.getString("id"),dataObj.getString("fee_amt"));
+                                break;
+                            case "refund.failed" :
 
+                                orderService.paymentRefundFailedHandle(dataObj.getString("payment_id")
+                                        ,dataObj.getString("error_msg"),dataObj.getString("id"));
                             default:
                                 break;
                         }

+ 6 - 8
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/OmsPortalOrderService.java

@@ -78,14 +78,6 @@ public interface OmsPortalOrderService {
     void deleteOrder(Long orderId);
 
     /**
-     * 订单拉起支付
-     *
-     * @param payReq 支付信息
-     * @return
-     */
-    @Transactional
-    HttpResponseResult orderPay(Map payReq) throws Exception;
-    /**
      * 获取订单信息
      *
      * @param orderId 订单号
@@ -118,4 +110,10 @@ public interface OmsPortalOrderService {
      * 根据支付订单号查询订单列表
      */
     List<OmsOrderDetail> list(List<String> adapayNoList);
+
+    @Transactional
+    void paymentRefundSucceededHandle(String payTransNo, String refundAmount, String refundTransNo,String feeAmt);
+
+    @Transactional
+    void paymentRefundFailedHandle(String payTransNo, String msg, String refundTransNo);
 }

+ 90 - 16
mec-mall/mall-portal/src/main/java/com/yonge/cooleshow/portal/service/impl/OmsPortalOrderServiceImpl.java

@@ -10,6 +10,8 @@ import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
 import com.ym.mec.common.exception.BizException;
 import com.ym.mec.common.service.IdGeneratorService;
+import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import com.ym.mec.web.WebFeignService;
 import com.yonge.cooleshow.mall.common.api.CommonPage;
 import com.yonge.cooleshow.mall.common.enums.OrderCacheEnum;
@@ -76,6 +78,9 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
     private PortalOrderDao portalOrderDao;
 
     @Autowired
+    private UserOrderRefundMapper userOrderRefundMapper;
+
+    @Autowired
     private IdGeneratorService idGeneratorService;
 
     @Autowired
@@ -665,22 +670,7 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
     }
 
-    @Override
-    @Transactional
-    public HttpResponseResult orderPay(Map payReq) {
-
-        String orderNo = MapUtil.getStr(payReq,"orderNo");
-        OmsOrderDetail detail = detail(orderNo);
-        if (detail == null) {
-            throw new BizException("订单不存在");
-        }
-        if (detail.getStatus() != 0 && detail.getStatus() != 6) {
-            throw new BizException("订单已付款或已关闭");
-        }
 
-        // 远程调用支付接口
-        return webFeignService.executePayment(payReq);
-    }
 
 
     @Override
@@ -801,11 +791,57 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         } else {
             LOG.error("汇付支付回调,订单状态异常。 req is {}", detail.getOrderSn());
 
-            // 金额退回
+
+            orderRefund(orderPayment,detail.getPayAmount().toString());
         }
 
     }
 
+    /**
+     * 支付成功,业务退款
+     */
+    private void orderRefund(UserOrderPayment userOrderPayment,String refundAmount) {
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayOrderNo(userOrderPayment.getAdapayNo());
+        if (userOrderRefund != null && userOrderRefund.getStatus().equals("succeeded")) {
+            LOG.warn("支付金额已退回");
+            return;
+        }
+
+        String orderSn = generateOrderSn();
+
+        HttpResponseResult<Map<String,String>> httpResponseResult = webFeignService.getBaseUrl(userOrderPayment.getAdapayNo());
+        if (!httpResponseResult.getStatus()) {
+            throw new BizException("获取回调路径失败");
+        }
+        Map<String, String> data = httpResponseResult.getData();
+        String baseUrl = MapUtil.getStr(data,"baseUrl");
+        String transNo = MapUtil.getStr(data,"transNo");
+        // 金额退回
+        Map<String, Object> refundParams = new HashMap<>(10);
+        refundParams.put("refund_amt", refundAmount);
+        refundParams.put("refund_order_no", orderSn);
+        refundParams.put("notify_url",baseUrl + "/api-mall-portal/payment/callback");
+        refundParams.put("transNo",transNo);
+        HttpResponseResult<BaseResult<Map<String, Object>>> refund = webFeignService.refund(refundParams);
+        if (!refund.getStatus()) {
+            throw new BizException("退款失败");
+        }
+        BaseResult<Map<String, Object>> mapBaseResult = refund.getData();
+        userOrderRefund = new UserOrderRefund();
+        userOrderRefund.setOrderNo(orderSn);
+        userOrderRefund.setPayTransNo(transNo);
+        userOrderRefund.setRefundAmt(new BigDecimal(refundAmount));
+        userOrderRefund.setPayOrderNo(userOrderPayment.getOrderNo());
+        if (mapBaseResult.getStatus()) {
+            Map<String,Object> refundBill = mapBaseResult.getData();
+            userOrderRefund.setRefundAmt(new BigDecimal(MapUtil.getStr(refundBill,"refund_amt")));
+            userOrderRefund.setStatus(TradeStatusEnum.pending.getCode());
+        } else {
+            userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
+            userOrderRefund.setPayFailMsg("退款失败:" +mapBaseResult.getMsg());
+        }
+        userOrderRefundMapper.insert(userOrderRefund);
+    }
 
     /***
      * 处理回调-支付失败
@@ -885,6 +921,44 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
         }
     }
 
+    /**
+     * 退款成功
+     */
+    @Override
+    @Transactional
+    public void paymentRefundSucceededHandle(String payTransNo, String refundAmount, String refundTransNo, String feeAmt) {
+
+        LOG.info("refund payTransNo is {}", payTransNo);
+        if (payTransNo == null) {
+            return;
+        }
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayTansNo(payTransNo);
+        userOrderRefund.setArrivalTime(new Date());
+        userOrderRefund.setStatus(TradeStatusEnum.succeeded.getCode());
+        userOrderRefund.setTransNo(refundTransNo);
+        userOrderRefund.setFeeAmt(new BigDecimal(feeAmt));
+        userOrderRefund.setRefundAmt(new BigDecimal(refundAmount));
+
+        userOrderRefundMapper.updateByPrimaryKeySelective(userOrderRefund);
+    }
+
+    /**
+     * 退款失败
+     */
+    @Override
+    @Transactional
+    public void paymentRefundFailedHandle(String payTransNo, String msg, String refundTransNo) {
+        if (payTransNo == null) {
+            return;
+        }
+        UserOrderRefund userOrderRefund = userOrderRefundMapper.selectByPayTansNo(payTransNo);
+        userOrderRefund.setArrivalTime(new Date());
+        userOrderRefund.setStatus(TradeStatusEnum.failed.getCode());
+        userOrderRefund.setPayFailMsg(msg);
+        userOrderRefund.setTransNo(refundTransNo);
+
+        userOrderRefundMapper.updateByPrimaryKeySelective(userOrderRefund);
+    }
 
     /**
      * 生成18位订单编号:8位日期+2位平台号码+2位支付方式+6位以上自增id

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

@@ -5,11 +5,15 @@ import java.util.*;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.huifu.adapay.core.exception.BaseAdaPayException;
+import com.huifu.adapay.model.Refund;
+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.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.util.CollectionUtils;
 import org.springframework.util.DigestUtils;
 
 public class Payment {
@@ -139,4 +143,24 @@ public class Payment {
         paymentParams.remove("appId");
         return paymentParams;
     }
+
+    public static BaseResult<Map<String ,Object>> refundPayment(Map<String, Object> refundParams) {
+
+        Map<String, Object> res;
+        try {
+            res = Refund.create(refundParams.get("transNo").toString(), refundParams);
+        } catch (BaseAdaPayException e) {
+            return BaseResult.failed(e.getMessage());
+        }
+        if (CollectionUtils.isEmpty(res)) {
+            return BaseResult.failed("请求失败");
+        }
+        LOGGER.info("汇付[支付退款] Resp:{}", res);
+        String errorCode = (String) res.get("error_code");
+        if (null != errorCode) {
+            String errorMsg = (String) res.get("error_msg");
+            return BaseResult.failed(errorMsg);
+        }
+        return BaseResult.succeed(res);
+    }
 }

+ 131 - 0
mec-thirdparty/src/main/java/com/ym/mec/thirdparty/adapay/entity/BaseResult.java

@@ -0,0 +1,131 @@
+package com.ym.mec.thirdparty.adapay.entity;
+
+import org.springframework.http.HttpStatus;
+
+import java.util.Date;
+
+/**
+ * HttpResponse 返回结果
+ */
+public class BaseResult<T> {
+
+	private boolean status = true;
+	private String msg;
+	private T data;
+	private int code;
+	private Date nowTime = new Date();
+
+	public BaseResult(boolean status, int code, T data, String message) {
+		this.status = status;
+		this.msg = message;
+		this.data = data;
+		this.code = code;
+	}
+
+	public BaseResult(boolean status, HttpStatus resultCode, T data, String message) {
+		this.status = status;
+		this.msg = message;
+		this.data = data;
+		this.code = resultCode.value();
+	}
+
+	public BaseResult() {
+	}
+
+	public int getCode() {
+		return code;
+	}
+
+	public void setCode(int code) {
+		this.code = code;
+	}
+
+	public boolean getStatus() {
+		return status;
+	}
+
+	public void setStatus(boolean status) {
+		this.status = status;
+	}
+
+	public String getMsg() {
+		return msg;
+	}
+
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+
+	public T getData() {
+		return data;
+	}
+
+	public void setData(T data) {
+		this.data = data;
+	}
+
+	public void success() {
+		this.status = true;
+	}
+
+	public void fail() {
+		this.status = false;
+	}
+
+	public Date getNowTime() {
+		return nowTime;
+	}
+
+	public void setNowTime(Date nowTime) {
+		this.nowTime = nowTime;
+	}
+
+
+	public static <T> BaseResult<T> succeed(T object) {
+		return getResponseData(true, HttpStatus.OK, object, "");
+	}
+
+	public static <T> BaseResult<T> succeed() {
+		return getResponseData(true, HttpStatus.OK, null, "");
+	}
+
+	public static <T> BaseResult<T> succeedData(T obj) {
+		return getResponseData(true, HttpStatus.OK, obj, "操作成功");
+	}
+
+	public static <T> BaseResult<T> warned(String message) {
+		return failed(HttpStatus.MULTI_STATUS, message);
+	}
+
+	public static <T> BaseResult<T> failed() {
+		return failed("");
+	}
+
+	public static <T> BaseResult<T> failed(String msg) {
+		return failed(HttpStatus.INTERNAL_SERVER_ERROR, msg);
+	}
+
+	public static <T> BaseResult<T> failed(HttpStatus statusCode, String msg) {
+		return getResponseData(false, statusCode, null, msg);
+	}
+
+	public static <T> BaseResult<T> failed(HttpStatus statusCode, T data, String msg) {
+		return getResponseData(false, statusCode, data, msg);
+	}
+	public static <T> BaseResult<T> failed(int code, T data, String msg) {
+		return new BaseResult<>(false, code, data, msg);
+	}
+
+	public static <T> BaseResult<T> status(boolean flag) {
+		return flag ? succeed() : failed("操作失败");
+	}
+
+	private static <T> BaseResult<T> getResponseData(boolean status, HttpStatus statusCode, T data, String message) {
+		BaseResult<T> obj = new BaseResult<T>();
+		obj.setStatus(status);
+		obj.setCode(statusCode.value());
+		obj.setData(data);
+		obj.setMsg(message);
+		return obj;
+	}
+}

+ 44 - 28
mec-web/src/main/java/com/ym/mec/web/controller/APIController.java

@@ -1,17 +1,16 @@
 package com.ym.mec.web.controller;
 
-import com.ym.mec.biz.dal.dto.PaymentParam;
 import com.ym.mec.biz.dal.dto.StudentVipGroupShowListDto;
-import com.ym.mec.biz.dal.entity.StudentPaymentOrder;
+import com.ym.mec.biz.dal.entity.*;
 import com.ym.mec.biz.dal.page.StudentVipGroupQueryInfo;
 import com.ym.mec.biz.service.*;
 import com.ym.mec.common.entity.HttpResponseResult;
 import com.ym.mec.common.entity.MallCreateOrderModel;
 import com.ym.mec.common.entity.OrderCancelModel;
+import com.ym.mec.thirdparty.adapay.Payment;
+import com.ym.mec.thirdparty.adapay.entity.BaseResult;
 import io.swagger.annotations.Api;
 
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,12 +22,8 @@ import com.ym.mec.auth.api.entity.SysUser;
 import com.ym.mec.biz.dal.dao.EmployeeDao;
 import com.ym.mec.biz.dal.dao.SysUserCashAccountDao;
 import com.ym.mec.biz.dal.dao.TeacherDao;
-import com.ym.mec.biz.dal.entity.Employee;
-import com.ym.mec.biz.dal.entity.SysUserCashAccount;
-import com.ym.mec.biz.dal.entity.Teacher;
 import com.ym.mec.common.controller.BaseController;
 
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -61,6 +56,9 @@ public class APIController extends BaseController {
 	private VipGroupService vipGroupService;
 
 	@Autowired
+	private SysConfigService sysConfigService;
+
+	@Autowired
 	private StudentPaymentOrderService studentPaymentOrderService;
 
 	@GetMapping("/createCashAccount")
@@ -135,6 +133,7 @@ public class APIController extends BaseController {
 
 
 
+	// 商城创建订单
 	@PostMapping("/mallCreateOrder")
 	public HttpResponseResult<Map> mallCreateOrder(@RequestBody MallCreateOrderModel model) {
 		try {
@@ -146,6 +145,7 @@ public class APIController extends BaseController {
 	}
 
 
+	// 商城保存订单详情数据
 	@PostMapping("/mallSaveOrderInfo")
 	public HttpResponseResult<Map> mallSaveOrderInfo(@RequestBody MallCreateOrderModel model) {
 		try {
@@ -157,23 +157,7 @@ public class APIController extends BaseController {
 		}
 	}
 
-	@ApiOperation(value = "台牌支付")
-	@PostMapping("/executePayment")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "amount", value = "支付金额", required = true, dataType = "BigDecimal"),
-			@ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String"),
-			@ApiImplicitParam(name = "payChannel", value = "支付方式(alipay-支付宝app支付)", required = true, dataType = "String"),
-	})
-	public Object executePayment(@RequestBody PaymentParam paymentParam) {
-		try {
-			Map<String, Object> payment = orderPayOpsService.executePayment(paymentParam);
-			return succeed(payment);
-		} catch (Exception e) {
-			return failed(e.getMessage());
-		}
-	}
-
-
+	// 商城支付成功/失败修改订单状态
 	@PostMapping("/updateOrder")
 	public HttpResponseResult updateOrder(@RequestBody Map map) {
 
@@ -188,10 +172,8 @@ public class APIController extends BaseController {
 
 
 	/**
-	 * 取消订单接口
+	 * 商城取消订单接口
 	 *
-	 * @param orderNo
-	 * @return
 	 */
 	@PostMapping("/cancelOrder")
 	public HttpResponseResult<OrderCancelModel> cancelOrder(@RequestParam String orderNo) {
@@ -212,4 +194,38 @@ public class APIController extends BaseController {
 		}
 	}
 
+
+	// 商城获取 退款数据
+	@GetMapping("/getRefundInfo")
+	public HttpResponseResult<Map<String,String>> getBaseUrl(@RequestParam String orderNo) {
+
+		try {
+			SysConfig baseApiUrl = sysConfigService.findByParamName("base_api_url");
+			StudentPaymentOrder orderByOrderNo = studentPaymentOrderService.findOrderByOrderNo(orderNo);
+			Map<String,String> result = new HashMap<>();
+			result.put("transNo",orderByOrderNo.getTransNo());
+			result.put("baseUrl",baseApiUrl.getParanValue());
+			;
+			return succeed(result);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+	}
+
+
+
+	// 商城获取 退款数据
+	@GetMapping("/refund")
+	public HttpResponseResult<BaseResult<Map<String, Object>>> refund(@RequestParam Map<String,Object> refundInfo) {
+
+		try {
+
+			BaseResult<Map<String, Object>> mapBaseResult = Payment.refundPayment(refundInfo);
+			return succeed(mapBaseResult);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return failed();
+		}
+	}
 }