Parcourir la source

fix(统一支付): H5 轮询按 body code=404 停表

alphaH il y a 1 semaine
Parent
commit
59a40a8c36

+ 3 - 2
frontend/public/pay/unified-h5.html

@@ -372,8 +372,9 @@
       });
     }).then(function (out) {
       var json = out.json || {};
-      // 404 是终态(单不存在/令牌失效):继续轮询只会每 3 秒重复一次无效请求
-      if (out.status === 404) {
+      // 终态的真实信号是 HTTP 200 + body code=404(全局异常处理器不带 @ResponseStatus);
+      // HTTP 404 也照收,代理/边缘层可能改写状态码。继续轮询只会每 3 秒重复一次无效请求
+      if (out.status === 404 || json.code === 404) {
         stopPolling();
         showResultError(json.msg || "订单不存在或链接已过期");
         return;

+ 4 - 2
java/src/test/java/com/payment/platform/module/payment/unified/controller/UnifiedH5PageContractTest.java

@@ -86,9 +86,11 @@ class UnifiedH5PageContractTest {
                         + "空「去支付」链接与坏图会显示出来");
 
         Matcher stopOn404 = Pattern.compile(
-                "if \\(out\\.status === 404\\) \\{\\s*stopPolling\\(\\);").matcher(html);
+                "if \\(out\\.status === 404 \\|\\| json\\.code === 404\\) \\{\\s*stopPolling\\(\\);").matcher(html);
         assertTrue(stopOn404.find(),
-                "404 是终态:轮询必须在该分支 stopPolling(),否则每 3 秒重复一次无效请求");
+                "终态的真实信号是 HTTP 200 + body code=404(GlobalExceptionHandler 不带 @ResponseStatus),"
+                        + "HTTP 404 也要照收(代理/边缘层可能改写状态):轮询必须在 "
+                        + "out.status===404 || json.code===404 时 stopPolling(),否则每 3 秒重复一次无效请求");
     }
 
     @Test