From 4ef94185af0c3f00ae1dc933bb099bde26894df8 Mon Sep 17 00:00:00 2001
From: yeg <1347747024@qq.com>
Date: 星期三, 16 九月 2026 00:51:43 +0800
Subject: [PATCH] feat(merchant): 未完成微信实名与授权前不允许收款

---
 talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantPaymentReadinessService.java |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantPaymentReadinessService.java b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantPaymentReadinessService.java
index 5c351e6..7492073 100644
--- a/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantPaymentReadinessService.java
+++ b/talent-card-server/src/main/java/com/talentcard/server/business/merchant/MerchantPaymentReadinessService.java
@@ -159,6 +159,13 @@
         if (!isMerchantNormal(application.merchantStatus())) {
             return Readiness.blocked("斗拱子商户状态异常(" + application.merchantStatus() + "),暂时无法收款");
         }
+        // 微信支付权限的前置:业务开通生效 + 实名与授权完成。只开通不实名,微信侧并没有把收款
+        // 权限给到商户——实名认证的适用对象就是「需要开通微信支付权限的商户」。证据取自分阶段
+        // 进度(由通道查询落库),不靠请求参数推断:「请求里带了参数」不等于通道侧生效。
+        List<String> missingWechat = missingWechatCapabilities(application.id());
+        if (!missingWechat.isEmpty()) {
+            return Readiness.blocked("微信收款能力未就绪:" + String.join("、", missingWechat) + ",暂时无法收款");
+        }
         return Readiness.allowed(new CollectingMerchant(application.id(), application.storeId(), application.huifuId()));
     }
 
@@ -266,6 +273,22 @@
         return huifuPaymentProperties.isMerchantCapabilityRequired();
     }
 
+    /**
+     * 分阶段进度里代表微信收款权限的两个阶段,缺哪个报哪个。
+     *
+     * <p>没有进度记录时两个都算缺——查不到证据就不能认为能收款。后续配置(延迟入账、自动结算、
+     * 银行卡)另有各自的阶段与快照,这里只管微信侧这两项。
+     */
+    private List<String> missingWechatCapabilities(long applicationId) {
+        List<Map<String, Object>> saved = rows("select stages_json from merchant_onboarding_progress where application_id=?", applicationId);
+        if (saved.isEmpty()) return List.of("微信支付业务开通", "微信实名与授权");
+        Map<String, Object> stages = com.alibaba.fastjson.JSON.parseObject(clean(saved.get(0).get("stagesJson")), Map.class);
+        List<String> missing = new java.util.ArrayList<>();
+        if (!"confirmed".equals(clean(stages.get("wechat")))) missing.add("微信支付业务开通");
+        if (!"confirmed".equals(clean(stages.get("realname")))) missing.add("微信实名与授权");
+        return missing;
+    }
+
     private boolean isAutoSettleOff(String value) { return "0".equals(value) || "N".equalsIgnoreCase(value); }
 
     private boolean isCashAvailable(String value) { return "1".equals(value) || "Y".equalsIgnoreCase(value); }

--
Gitblit v1.7.1