xiongzhu 3 anni fa
parent
commit
35d895cff4

+ 6 - 0
pom.xml

@@ -486,6 +486,12 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-websocket</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>io.github.shashankn</groupId>
+            <artifactId>qr-terminal</artifactId>
+            <version>1.0.0</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 2 - 0
src/main/java/com/izouma/nineth/config/Constants.java

@@ -29,6 +29,8 @@ public interface Constants {
         String SAND = "sandPay";
         String HM   = "hmPay";
         String PE   = "payEase";
+
+        String ALI = "ali";
     }
 
     interface PayType {

+ 121 - 0
src/main/java/com/izouma/nineth/service/AlipayService.java

@@ -0,0 +1,121 @@
+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.AlipayTradePrecreateRequest;
+import com.alipay.api.request.AlipayTradeQueryRequest;
+import com.alipay.api.request.AlipayTradeRefundRequest;
+import com.alipay.api.response.AlipayTradePrecreateResponse;
+import com.alipay.api.response.AlipayTradeQueryResponse;
+import com.alipay.api.response.AlipayTradeRefundResponse;
+import com.izouma.nineth.config.AlipayProperties;
+import com.izouma.nineth.config.Constants;
+import com.izouma.nineth.dto.PayQuery;
+import com.izouma.nineth.enums.PayStatus;
+import com.izouma.nineth.exception.BusinessException;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Objects;
+
+@Service
+@AllArgsConstructor
+@Slf4j
+public class AlipayService {
+
+    private final AlipayProperties alipayProperties;
+    private final AlipayClient     alipayClient;
+
+    public String aliRequest(Long orderId, BigDecimal amount, String subject, String type) {
+        AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
+        request.setNotifyUrl(alipayProperties.getNotifyUrl());
+        JSONObject bizContent = new JSONObject();
+        bizContent.put("out_trade_no", orderId + "");
+        bizContent.put("total_amount", amount);
+        bizContent.put("subject", subject);
+        JSONObject body = new JSONObject();
+        body.put("type", type);
+        body.put("orderId", orderId);
+        bizContent.put("body", body.toString());
+
+        request.setBizContent(bizContent.toString());
+        AlipayTradePrecreateResponse response = null;
+        try {
+            response = alipayClient.execute(request);
+        } catch (AlipayApiException e) {
+            e.printStackTrace();
+            throw new BusinessException(Constants.PAY_ERR_MSG, e.getErrMsg());
+        }
+        if (response.isSuccess()) {
+            return response.getQrCode();
+        } else {
+            throw new BusinessException(response.getSubMsg());
+        }
+    }
+
+    public void refund(String orderId, BigDecimal amount) {
+        AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
+        JSONObject bizContent = new JSONObject();
+        bizContent.put("out_trade_no", orderId);
+        bizContent.put("refund_amount", amount.stripTrailingZeros().toPlainString());
+        bizContent.put("out_request_no", orderId);
+
+        request.setBizContent(bizContent.toString());
+        AlipayTradeRefundResponse response = null;
+        try {
+            response = alipayClient.execute(request);
+        } catch (AlipayApiException e) {
+            log.error("支付宝退款失败", e);
+            throw new BusinessException(e.getErrMsg());
+        }
+        log.info("支付宝退款结果:{}", response.getBody());
+        if (response.isSuccess() && "10000".equals(response.getCode())) {
+            log.info("支付宝退款成功");
+        } else {
+            throw new BusinessException(response.getMsg() + ";" + response.getSubMsg());
+        }
+    }
+
+    public PayQuery payQuery(String orderId) throws AlipayApiException {
+        AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
+        JSONObject bizContent = new JSONObject();
+        bizContent.put("out_trade_no", orderId);
+        request.setBizContent(bizContent.toJSONString());
+        AlipayTradeQueryResponse response = alipayClient.execute(request);
+        PayQuery query = new PayQuery(Constants.PayChannel.ALI);
+        query.setOrderId(orderId);
+        if (response.isSuccess() && "10000".equals(response.getCode())) {
+            query.setExist(true);
+            query.setAmount(new BigDecimal(response.getTotalAmount()));
+            query.setTransactionId(response.getTradeNo());
+            switch (response.getTradeStatus()) {
+                case "TRADE_SUCCESS":
+                case "TRADE_FINISHED":
+                    query.setStatus(PayStatus.SUCCESS);
+                    break;
+                case "WAIT_BUYER_PAY":
+                    query.setStatus(PayStatus.PENDING);
+                    break;
+                case "TRADE_CLOSED":
+                    query.setStatus(PayStatus.CANCEL);
+                    break;
+            }
+            if (response.getSendPayDate() != null) {
+                query.setPayTime(response.getSendPayDate().toInstant()
+                        .atZone(ZoneId.systemDefault())
+                        .toLocalDateTime());
+            }
+        } else {
+            query.setExist(false);
+            query.setMsg(response.getMsg() + ";" + response.getSubMsg());
+        }
+        return query;
+    }
+}

+ 5 - 0
src/main/java/com/izouma/nineth/service/OrderPayService.java

@@ -64,6 +64,7 @@ public class OrderPayService {
     private final IdentityAuthRepo    identityAuthRepo;
     private final AlipayClient        alipayClient;
     private final AlipayProperties    alipayProperties;
+    private final AlipayService       alipayService;
 
     public static void setPayChannel(String payChannel) {
         log.info("set pay channel {}", payChannel);
@@ -563,6 +564,10 @@ public class OrderPayService {
                 }
                 return res;
             }
+            case Constants.PayChannel.ALI: {
+                alipayService.refund(orderId, amount);
+                return null;
+            }
         }
         throw new BusinessException("退款失败");
     }

+ 2 - 1
src/main/vue/src/views/PayMgmt.vue

@@ -114,7 +114,8 @@ export default {
                 sandQuick: '衫德快捷',
                 sandPay: '衫德',
                 hmPay: '河马',
-                payEase: '首信易'
+                payEase: '首信易',
+                ali: '支付宝直联'
             },
             testPay: {
                 channel: '',

+ 29 - 1
src/test/java/com/izouma/nineth/AlipayTest.java

@@ -5,19 +5,27 @@ import com.alipay.api.AlipayApiException;
 import com.alipay.api.AlipayClient;
 import com.alipay.api.request.AlipayTradeRefundRequest;
 import com.alipay.api.response.AlipayTradeRefundResponse;
+import com.google.zxing.WriterException;
+import com.izouma.nineth.dto.PayQuery;
+import com.izouma.nineth.service.AlipayService;
 import com.izouma.nineth.utils.SnowflakeIdWorker;
+import io.github.shashankn.qrterminal.QRCode;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.context.SpringBootTest;
 import org.springframework.test.context.junit.jupiter.SpringExtension;
 
+import java.math.BigDecimal;
+
 @ExtendWith(SpringExtension.class)
 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
 public class AlipayTest {
 
     @Autowired
-    private AlipayClient alipayClient;
+    private AlipayClient  alipayClient;
+    @Autowired
+    private AlipayService alipayService;
 
     @Test
     public void test() throws AlipayApiException {
@@ -42,4 +50,24 @@ public class AlipayTest {
         }
 
     }
+
+    @Test
+    public void query() throws AlipayApiException {
+        PayQuery query = alipayService.payQuery("1020381579605839872");
+        System.out.println(query.getTransactionId());
+    }
+
+    @Test
+    public void pay() throws WriterException {
+        Long id = new SnowflakeIdWorker(1, 1).nextId();
+        String url = alipayService.aliRequest(id, new BigDecimal("0.01"), "测试", "test");
+        System.out.println(QRCode.from(url).generate());
+        System.out.println(id);
+        System.out.println(url);
+    }
+
+    @Test
+    public void refund() throws AlipayApiException {
+        alipayService.refund("1020381579605839872", new BigDecimal("0.01"));
+    }
 }