Răsfoiți Sursa

支付宝关单

xiongzhu 3 ani în urmă
părinte
comite
dce1423445

+ 15 - 0
src/main/java/com/izouma/nineth/dto/PayQuery.java

@@ -1,6 +1,8 @@
 package com.izouma.nineth.dto;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.izouma.nineth.enums.PayStatus;
+import com.izouma.nineth.service.IPayService;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Data;
@@ -25,7 +27,20 @@ public class PayQuery {
     private String        transactionId;
     private String        channel;
 
+    @JsonIgnore
+    private IPayService payService;
+
     public PayQuery(String channel) {
         this.channel = channel;
     }
+
+    public void setPayService(IPayService payService) {
+        this.payService = payService;
+    }
+
+    public void close() {
+        if (payService != null) {
+            payService.close(orderId);
+        }
+    }
 }

+ 29 - 1
src/main/java/com/izouma/nineth/service/AlipayService.java

@@ -3,9 +3,11 @@ package com.izouma.nineth.service;
 import com.alibaba.fastjson.JSONObject;
 import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
+import com.alipay.api.request.AlipayTradeCancelRequest;
 import com.alipay.api.request.AlipayTradePrecreateRequest;
 import com.alipay.api.request.AlipayTradeQueryRequest;
 import com.alipay.api.request.AlipayTradeRefundRequest;
+import com.alipay.api.response.AlipayTradeCancelResponse;
 import com.alipay.api.response.AlipayTradePrecreateResponse;
 import com.alipay.api.response.AlipayTradeQueryResponse;
 import com.alipay.api.response.AlipayTradeRefundResponse;
@@ -28,7 +30,7 @@ import java.util.Objects;
 @Service
 @AllArgsConstructor
 @Slf4j
-public class AlipayService {
+public class AlipayService implements IPayService {
 
     private final AlipayProperties alipayProperties;
     private final AlipayClient     alipayClient;
@@ -60,7 +62,31 @@ public class AlipayService {
         }
     }
 
+    @Override
+    public void close(String id) {
+        log.info("支付宝关闭订单:{}", id);
+        AlipayTradeCancelRequest request = new AlipayTradeCancelRequest();
+        JSONObject bizContent = new JSONObject();
+        bizContent.put("out_trade_no", id);
+        request.setBizContent(bizContent.toString());
+        AlipayTradeCancelResponse response = null;
+        try {
+            response = alipayClient.execute(request);
+        } catch (AlipayApiException e) {
+            log.error("支付宝关闭订单失败", e);
+            throw new BusinessException("关闭订单失败");
+        }
+        if (response.isSuccess() && "10000".equals(response.getCode())) {
+            log.info("支付宝关闭订单成功 {}", id);
+        } else {
+            log.error("支付宝关闭订单失败 code={} msg={} subMsg={}", response.getCode(), response.getMsg(), response.getSubMsg());
+            throw new BusinessException(response.getMsg() + ";" + response.getSubMsg());
+        }
+    }
+
+    @Override
     public void refund(String orderId, BigDecimal amount) {
+        log.info("支付宝退款开始 orderId={} amount={}", orderId, amount);
         AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
         JSONObject bizContent = new JSONObject();
         bizContent.put("out_trade_no", orderId);
@@ -79,6 +105,7 @@ public class AlipayService {
         if (response.isSuccess() && "10000".equals(response.getCode())) {
             log.info("支付宝退款成功");
         } else {
+            log.error("支付宝退款失败 code={} msg={} subMsg={}", response.getCode(), response.getMsg(), response.getSubMsg());
             throw new BusinessException(response.getMsg() + ";" + response.getSubMsg());
         }
     }
@@ -96,6 +123,7 @@ public class AlipayService {
             return null;
         }
         PayQuery query = new PayQuery(Constants.PayChannel.ALI);
+        query.setPayService(this);
         query.setOrderId(orderId);
         if (response.isSuccess() && "10000".equals(response.getCode())) {
             query.setExist(true);

+ 10 - 0
src/main/java/com/izouma/nineth/service/IPayService.java

@@ -0,0 +1,10 @@
+package com.izouma.nineth.service;
+
+import java.math.BigDecimal;
+
+public interface IPayService {
+
+    void close(String id);
+
+    void refund(String id, BigDecimal amount);
+}

+ 2 - 0
src/main/java/com/izouma/nineth/service/OrderCancelService.java

@@ -1,6 +1,7 @@
 package com.izouma.nineth.service;
 
 import com.izouma.nineth.annotations.RedisLock;
+import com.izouma.nineth.config.Constants;
 import com.izouma.nineth.config.GeneralProperties;
 import com.izouma.nineth.config.RedisKeys;
 import com.izouma.nineth.domain.*;
@@ -121,6 +122,7 @@ public class OrderCancelService {
                     case SUCCESS:
                     case PENDING:
                         log.info("订单 {}, 状态 {}, 不能取消", id, query.getStatus().name());
+                        query.close();
                         return false;
                     default:
                         log.info("订单 {}, 状态 {}, 可以取消", id, query.getStatus().name());