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