Explorar el Código

安盛支付二维码

xuqiang hace 3 meses
padre
commit
bbe871bdac

+ 44 - 22
tenant/insurance/quotation-ansheng/src/main/java/com/jzg/quotation/ansheng/crawler/service/impl/AnShengCrawlerRequestImpl.java

@@ -1,6 +1,7 @@
 package com.jzg.quotation.ansheng.crawler.service.impl;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSONObject;
 import com.jzg.commons.constants.dict.InsOrderStatusEnum;
 import com.jzg.commons.entity.quote.vo.QuoteVo;
@@ -37,6 +38,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -59,6 +61,14 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
 
     private final AnShengCrawlerQuoteProcessService anShengCrawlerQuoteProcessService;
 
+
+    /** 最大重试次数:获取支付链接 */
+    private static final int MAX_PAY_LINK_RETRY = 15;
+    /** 每次重试间隔休眠毫秒:3秒 */
+    private static final long RETRY_SLEEP_MILLIS = 3000L;
+
+
+
     @Override
     public void login(LoginBase loginBase) {
         anShengCrawlerLoginService.login(loginBase.getUsername(), loginBase.getPassword());
@@ -248,40 +258,53 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         return underwritingResultsVo;
     }
 
-
-
     /**
-     *  调用接口的业务方法(有返回值)
+     * 循环重试获取支付链接
+     * @param paymentLinkVo 请求参数
+     * @return 支付链接结果
      */
     private PaymentLinkResultsVo loopAcquisitionPaymentLink(PaymentLinkVo paymentLinkVo) {
-        int retryCount = 0;
-        int maxRetry = 15;
-        long sleepTime = 3000;
-        PaymentLinkResultsVo paymentLink = null;
-        while (retryCount < maxRetry) {
+        if (paymentLinkVo == null || paymentLinkVo.getOrder() == null) {
+            log.error("获取支付链接入参为空");
+            return new PaymentLinkResultsVo();
+        }
+        String ordersNo = paymentLinkVo.getOrder().getOrdersNo();
+        PaymentLinkResultsVo linkResult = null;
+        for (int retryCount = 0; retryCount < MAX_PAY_LINK_RETRY; retryCount++) {
             try {
-                paymentLink = getPaymentLink(paymentLinkVo);
-                log.info("第{}次获取支付链接信息:{}", retryCount, JSONObject.toJSONString(paymentLink));
-                if (paymentLink != null && StringUtils.isNotEmpty(paymentLink.getPaymentLink())) {
+                linkResult = getPaymentLink(paymentLinkVo);
+                log.info("订单[{}]第{}次获取支付链接,返回结果:{}", ordersNo, retryCount + 1, JSONObject.toJSONString(linkResult));
+                if (linkResult != null && StrUtil.isNotBlank(linkResult.getPaymentLink())) {
+                    log.info("订单[{}]第{}次成功获取支付链接", ordersNo, retryCount + 1);
                     break;
                 }
-                Thread.sleep(sleepTime);
             } catch (Exception e) {
-                e.printStackTrace();
-                log.error("安盛支付二维码异常信息:{}",e.getMessage());
-                try {
-                    Thread.sleep(sleepTime);
-                } catch (InterruptedException ie) {
-                    Thread.currentThread().interrupt();
+                log.error("订单[{}]第{}次调用获取支付链接接口异常", ordersNo, retryCount + 1, e);
+            }
+            if (retryCount != MAX_PAY_LINK_RETRY - 1) {
+                boolean sleepSuccess = sleep(RETRY_SLEEP_MILLIS);
+                if (!sleepSuccess) {
+                    log.warn("订单[{}]支付链接重试休眠被中断,终止重试", ordersNo);
                     break;
                 }
-            } finally {
-                retryCount++;
             }
         }
-        return paymentLink;
+        return linkResult == null ? new PaymentLinkResultsVo() : linkResult;
     }
 
+    /**
+     * @param millis 休眠毫秒数
+     * @return true=正常休眠完成;false=被中断
+     */
+    private boolean sleep(long millis) {
+        try {
+            TimeUnit.MILLISECONDS.sleep(millis);
+            return true;
+        } catch (InterruptedException ie) {
+            Thread.currentThread().interrupt();
+            return false;
+        }
+    }
 
 
 
@@ -324,7 +347,6 @@ public class AnShengCrawlerRequestImpl implements AnShengCrawlerRequest {
         // 获取支付链接
         AnShengCrawlerPaymentRequest anShengCrawlerPaymentRequest = new AnShengCrawlerPaymentRequest(anShengCrawlerOrder, userDetailResponse.getDepartmentCode(), anShengCrawlerOrder.getTotalPremium());
         String paymentUrl = anShengCrawlerRequestComponent.payment(anShengCrawlerPaymentRequest, httpHeaders);
-        log.info("获取安盛支付二维码地址长度:{}", StringUtils.isNotEmpty(paymentUrl) ? paymentUrl.length() : "无法获取支付链接");
         return new PaymentLinkResultsVo(true, paymentUrl, "");
     }