Ver Fonte

fix auto17自动充值 特殊处理

zoujiajian há 1 mês atrás
pai
commit
a3808f2476

+ 2 - 0
netflix-dao/src/main/java/com/cyksj/model/response/recharge/Auto17OrderStatusResponse.java

@@ -86,5 +86,7 @@ public class Auto17OrderStatusResponse {
         private String message;
 
         private Boolean success;
+
+        private String failure_detail;
     }
 }

+ 27 - 5
netflix-service/src/main/java/com/cyksj/service/recharge/impl/Auto17RechargeServiceImpl.java

@@ -40,6 +40,7 @@ import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
 import java.util.Date;
+import java.util.Locale;
 
 @Service
 @RequiredArgsConstructor
@@ -147,9 +148,14 @@ public class Auto17RechargeServiceImpl implements Auto17RechargeService {
     public TaskResult getTaskResult(GroupsRelation relation) {
         try {
             Auto17OrderStatusResponse response = queryOrderStatus(relation.getCardKey(), relation.getGptTaskId());
-            TaskResult taskResult = convertTaskResult(response.getData());
+            Auto17OrderStatusResponse.OrderData data = response.getData();
+            boolean specialSuccess = isSpecialSuccess(data);
+            TaskResult taskResult = convertTaskResult(data);
             String result = StrUtil.blankToDefault(taskResult.getError(), taskResult.getResult());
-            resetGroupsRelationRechargeStatus(relation, taskResult.getStatus(), result);
+            if (specialSuccess) {
+                result = getStatusMessage(data);
+            }
+            resetGroupsRelationRechargeStatus(relation, taskResult.getStatus(), result, specialSuccess);
             return taskResult;
         } catch (Exception e) {
             log.error("auto17查询充值任务失败: {}", e.getMessage(), e);
@@ -202,7 +208,7 @@ public class Auto17RechargeServiceImpl implements Auto17RechargeService {
         TaskResult result = new TaskResult();
         String status = data.getStatus();
         String message = getStatusMessage(data);
-        if ("success".equalsIgnoreCase(status)) {
+        if (isSpecialSuccess(data) || "success".equalsIgnoreCase(status)) {
             result.setStatus("completed");
             result.setResult(message);
         } else if ("failed".equalsIgnoreCase(status)) {
@@ -215,6 +221,22 @@ public class Auto17RechargeServiceImpl implements Auto17RechargeService {
         return result;
     }
 
+    private boolean isSpecialSuccess(Auto17OrderStatusResponse.OrderData data) {
+        if (data == null) {
+            return false;
+        }
+        Auto17OrderStatusResponse.PaymentResult paymentResult = data.getPaymentResult();
+        if (paymentResult == null) {
+            return false;
+        }
+        String message = StrUtil.blankToDefault(paymentResult.getFailure_detail(), "");
+        String failureReason = StrUtil.blankToDefault(data.getFailureReason(), "");
+        String details = message + " " + failureReason;
+        String lowerCaseDetails = details.toLowerCase(Locale.ROOT);
+        return lowerCaseDetails.contains("already succeeded after being previously confirmed")
+                || lowerCaseDetails.contains("payment_intent_unexpected_state");
+    }
+
     private String getStatusMessage(Auto17OrderStatusResponse.OrderData data) {
         if (StrUtil.isNotBlank(data.getFailureReason())) {
             return data.getFailureReason();
@@ -335,7 +357,7 @@ public class Auto17RechargeServiceImpl implements Auto17RechargeService {
                 .eq(GroupsRelation::getId, relation.getId())));
     }
 
-    private void resetGroupsRelationRechargeStatus(GroupsRelation relation, String status, String message) {
+    private void resetGroupsRelationRechargeStatus(GroupsRelation relation, String status, String message, boolean specialSuccess) {
         if (!"completed".equals(status) && !"failed".equals(status)) {
             return;
         }
@@ -392,7 +414,7 @@ public class Auto17RechargeServiceImpl implements Auto17RechargeService {
                 .set(GroupsRelation::getRechargeStatus, rechargeStatus)
                 .set(expiryTime != null, GroupsRelation::getStartTime, startTime)
                 .set(expiryTime != null, GroupsRelation::getExpiryTime, expiryTime)
-                .set(!completed && StrUtil.isNotBlank(message), GroupsRelation::getRechargeErrorInfo, message)
+                .set((!completed || specialSuccess) && StrUtil.isNotBlank(message), GroupsRelation::getRechargeErrorInfo, message)
                 .eq(GroupsRelation::getId, relation.getId())
                 .eq(GroupsRelation::getRechargeStatus, GroupsRelation.RechargeStatus.recharging));
         if (update == 0 || !completed) {