Explorar o código

fix: "Airwallex退款还是有问题

ritchie %!s(int64=2) %!d(string=hai) anos
pai
achega
5a21ac1c0e

+ 24 - 0
src/main/java/com/szwl/common/AccessTokenCommon.java

@@ -0,0 +1,24 @@
+package com.szwl.common;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.szwl.constant.AirwallexConstant;
+import com.szwl.model.utils.HttpClientSslUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.entity.ContentType;
+import org.apache.http.message.BasicHeader;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AccessTokenCommon {
+    public final static String ACCESS_TOKEN_URL = "https://api-demo.airwallex.com/api/v1/authentication/login";
+    public final static String CLIENT_ID = "IBi-pVO4SSGzXIDHRYfVOA";
+
+    public final static String API_KEY = "7eb2be388987ae27ae80c904bed93f89ddd08437debb2692c364da07deba1502a279e388d0c3e732f16ebbb8787d1a14";
+
+    public static String ACCESS_TOKEN = null;
+
+}

+ 3 - 2
src/main/java/com/szwl/controller/AirwallexPayController.java

@@ -88,7 +88,7 @@ public class AirwallexPayController {
         tOrderAbroad.setProductName(productName);
         tOrderAbroad.setClientId(clientId);
         tOrderAbroad.setEquipmentId(equipmentId);
-        // TODO: 设置订单支付状态,0未支付,1已支付。
+        // 设置订单支付状态,0未支付,1已支付,3已退款
         tOrderAbroad.setPayStatus(0);
         // 将订单存入数据库
         boolean save = tOrderAbroadService.save(tOrderAbroad);
@@ -123,6 +123,7 @@ public class AirwallexPayController {
     ResponseModel<String> createARefund(@RequestBody RefundRequestBody refundRequestBody) {
         log.info("发起退款");
         String requestId = refundRequestBody.getRequestId();
+        String paymentIntentId = refundRequestBody.getPaymentIntentId();
 //        QueryWrapper<TOrderAbroad> tOrderAbroadQueryWrapper = new QueryWrapper<>();
 //        tOrderAbroadQueryWrapper.eq("request_id", requestId);
 //        TOrderAbroad orderAbroad = tOrderAbroadService.getOne(tOrderAbroadQueryWrapper);
@@ -147,7 +148,7 @@ public class AirwallexPayController {
 
 
         // 发起退款
-        String refund = airwallexService.createARefund(requestId);
+        String refund = airwallexService.createARefund(requestId, paymentIntentId);
 
         JSONObject jsonObject = JSON.parseObject(refund);
         String status = jsonObject.getString("status");

+ 3 - 1
src/main/java/com/szwl/model/bean/RefundRequestBody.java

@@ -11,5 +11,7 @@ public class RefundRequestBody {
 
     private String requestId;
 
-//    private String paymentIntentId;
+    private String paymentIntentId;
+
+    private String reason;
 }

+ 17 - 0
src/main/java/com/szwl/model/utils/AccessTokenListener.java

@@ -0,0 +1,17 @@
+package com.szwl.model.utils;
+
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+
+public class AccessTokenListener implements ServletContextListener {
+    @Override
+    public void contextInitialized(ServletContextEvent sce) {
+        // 开启servlet
+        new AccessTokenThreadUtil().start();
+    }
+
+    @Override
+    public void contextDestroyed(ServletContextEvent sce) {
+        // 关闭servlet
+    }
+}

+ 59 - 0
src/main/java/com/szwl/model/utils/AccessTokenThreadUtil.java

@@ -0,0 +1,59 @@
+package com.szwl.model.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.szwl.common.AccessTokenCommon;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.entity.ContentType;
+import org.apache.http.message.BasicHeader;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class AccessTokenThreadUtil extends Thread{
+
+    @Override
+    public void run() {
+        while (true) {
+            this.getAccessToken();
+            try {
+                Thread.sleep(20 * 60 * 1000);//休眠20分钟
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+        }
+
+    }
+
+    //获取access_token方法
+    public String getAccessToken() {
+
+//        String requestUrl = AccessTokenCommon.ACCESS_TOKEN_URL.replace("CLIENT_ID", AccessTokenCommon.CLIENT_ID).replace("API_KEY", AccessTokenCommon.API_KEY);
+//        jsonObject = WeixinUtil.httpRequest(requestUrl, "GET", null);
+//        AccessTokenCommon.ACCESS_TOKEN  = jsonObject.getString("access_token");
+//        System.out.println(AccessTokenCommon.ACCESS_TOKEN );
+        String url = AccessTokenCommon.ACCESS_TOKEN_URL;
+        List<BasicHeader> headers = new ArrayList<>();
+        BasicHeader header1 = new BasicHeader("CLIENT_ID", AccessTokenCommon.CLIENT_ID);
+        BasicHeader header2 = new BasicHeader("API_KEY", AccessTokenCommon.API_KEY);
+        headers.add(header1);
+        headers.add(header2);
+        Map<String,String> map = new HashMap<>();
+        String data = JSON.toJSONString(map);
+        String response = null;
+        try {
+            response = HttpClientSslUtils.doPost(url, data, ContentType.APPLICATION_JSON,headers);
+            JSONObject resultJson = JSONObject.parseObject(response);
+            AccessTokenCommon.ACCESS_TOKEN = resultJson.getString("token");
+            if(StringUtils.isNotEmpty(AccessTokenCommon.ACCESS_TOKEN)){
+                System.out.println("token="+AccessTokenCommon.ACCESS_TOKEN);
+                return AccessTokenCommon.ACCESS_TOKEN;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return AccessTokenCommon.ACCESS_TOKEN;
+    }
+}

+ 3 - 3
src/main/java/com/szwl/service/AirwallexService.java

@@ -2,8 +2,6 @@ package com.szwl.service;
 
 import com.szwl.model.bo.R;
 
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
 import java.util.Map;
 
@@ -39,10 +37,12 @@ public interface AirwallexService  {
 
     /**
      * 创建一笔退款 Create a Refund
+     *
      * @param requestId
+     * @param paymentIntentId
      * @return
      */
-    String createARefund(String requestId);
+    String createARefund(String requestId, String paymentIntentId);
 
 //    /**
 //     * 退款结果回调

+ 6 - 9
src/main/java/com/szwl/service/impl/AirwallexServiceImpl.java

@@ -3,10 +3,7 @@ package com.szwl.service.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.szwl.constant.AirwallexConstant;
-import com.szwl.model.bean.PaymentIntent;
-import com.szwl.model.bean.PaymentIntentRequestBody;
 import com.szwl.model.bo.R;
-import com.szwl.model.entity.TOrderAbroad;
 import com.szwl.model.utils.HttpClientSslUtils;
 import com.szwl.service.AirwallexService;
 import com.szwl.service.TOrderAbroadService;
@@ -15,13 +12,9 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.http.entity.ContentType;
 import org.apache.http.message.BasicHeader;
 import org.springframework.stereotype.Service;
-import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.annotation.Resource;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
 import java.math.BigDecimal;
-import java.sql.Array;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -109,6 +102,9 @@ public class AirwallexServiceImpl implements AirwallexService {
         String paymentIntentId = (String) responseMap.get("id");
         String clientSecret = (String) responseMap.get("client_secret");
 
+        // 把 paymentIntentId 保存到数据库
+
+
         String env = AirwallexConstant.ENV;
         String mode = AirwallexConstant.MODE;
 
@@ -118,7 +114,7 @@ public class AirwallexServiceImpl implements AirwallexService {
     }
 
     @Override
-    public String createARefund(String requestId) {
+    public String createARefund(String requestId, String paymentIntentId) {
 
         // 请求头
         String url = AirwallexConstant.url + "/api/v1/pa/refunds/create";
@@ -131,11 +127,12 @@ public class AirwallexServiceImpl implements AirwallexService {
         bodyMap.put("request_id", requestId);
 //        bodyMap.put("amount", amount); // 退款金额
 //        bodyMap.put("reason", reason); // 退款原因
+        bodyMap.put("payment_intent_id", paymentIntentId);
         String data = JSON.toJSONString(bodyMap);
 
         String resp = null;
         try {
-            resp = HttpClientSslUtils.doPost(url, data, ContentType.APPLICATION_JSON, headers);
+            HttpClientSslUtils.doPost(url, data, ContentType.APPLICATION_JSON, headers);
         } catch (Exception e) {
             throw new RuntimeException(e);
         }