yeg
2026-09-16 c18b9fac0edf5ebe3aecd74c93ec3f841fe5bf9e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package com.talentcard.server.business.payment.huifu;
 
import static org.assertj.core.api.Assertions.assertThat;
 
import java.util.Map;
 
import org.junit.jupiter.api.Test;
 
/**
 * 进件的商户层级:只有「渠道商 → 普通商户」两级。
 *
 * <p>这里钉住的是一条**被实测否掉的旧做法**。平台曾经用
 * {@code head_office_flag=0} + {@code head_huifu_id=<平台汇付号>} 把新商户建成平台自己的下级商户,
 * 期望平台随后有权给它配微信支付与业务开通。真实通道上的对照实验推翻了它:
 *
 * <ul>
 *   <li>带 head 字段进件成功({@code huifu_id=6666000241506776},{@code resp_code=90000000 审核中}),
 *       紧接着调 {@code v2.merchant.busi.config} 与 {@code v2.merchant.busi.open},
 *       仍然 `20002 数据权限认证失败`;</li>
 *   <li>{@code head/config}(开通下级商户权限)申请单已 {@code apply_status=Y},不改变结果;</li>
 *   <li>渠道商直属的普通商户 {@code 6666000241335656}(该笔进件早于 head 改动,确定没有 head 字段)
 *       同样返回 {@code 20002}。</li>
 * </ul>
 *
 * <p>结论有两个:20002 与层级无关,取决于签名身份本身有没有那些商户的数据权限;而 head 层级
 * 不但没有收益,还会按总部客群类型索要 F725/F726/F727 材料,白白增加进件失败面。所以进件请求里
 * **不允许**再出现这两个字段。
 */
class HuifuOnboardingMerchantLevelTests {
 
    private static final String CHANNEL_HUIFU_ID = "6666000220591054";
 
    @Test
    void anIndividualOnboardingBelongsToTheChannelOnly() {
        Map<String, Object> request = HuifuIndividualOnboardingGateway.buildRequestForTest(properties(), individualCommand());
 
        assertThat(request).containsEntry("upper_huifu_id", CHANNEL_HUIFU_ID);
        assertThat(request).doesNotContainKeys("head_office_flag", "head_huifu_id");
    }
 
    @Test
    void anEnterpriseOnboardingBelongsToTheChannelOnly() {
        Map<String, Object> request = HuifuEnterpriseOnboardingGateway.buildRequestForTest(properties(), enterpriseCommand());
 
        assertThat(request).containsEntry("upper_huifu_id", CHANNEL_HUIFU_ID);
        assertThat(request).doesNotContainKeys("head_office_flag", "head_huifu_id");
    }
 
    /**
     * 默认不下发 {@code use_chains_flag}:子商户在渠道下取得自己的微信子商户号。
     *
     * <p>下发 {@code 3}(复用上级微信商户号)曾是默认值,但上级是渠道商、没有商户级微信配置,
     * 通道会拒:「失败:复用交易信息,上级商户号为空」。2026-09-15 的真实补开在不带该字段时被受理,
     * 线上公众号/小程序/反扫三场景各自入驻成功并返回自己的 {@code sub_mer_id}。
     */
    @Test
    void businessOpenLeavesTheUseChainsFlagOutByDefault() {
        Map<String, Object> request = HuifuMerchantBusinessOpenGateway.buildRequestForTest(
                properties(), "BO-TEST-1", "6666000241335656", "成都喜望科技", "5812", false);
 
        assertThat(request).doesNotContainKey("use_chains_flag");
    }
 
    @Test
    void aConfiguredUseChainsFlagIsSentAsIs() {
        HuifuPaymentProperties properties = properties();
        properties.setMerchantUseChainsFlag("3");
 
        Map<String, Object> request = HuifuMerchantBusinessOpenGateway.buildRequestForTest(
                properties, "BO-TEST-1", "6666000241335656", "成都喜望科技", "5812", false);
 
        assertThat(request).containsEntry("use_chains_flag", "3");
    }
 
    private static HuifuPaymentProperties properties() {
        HuifuPaymentProperties properties = new HuifuPaymentProperties();
        properties.setEnabled(true);
        properties.setSystemId("6666000226048687");
        properties.setProductId("KAZX");
        properties.setPrivateKey("x");
        properties.setPlatformPublicKey("y");
        properties.setMerchantWechatFeeRate("0.60");
        properties.setMerchantOnlineBusinessType("H5311L");
        properties.setMerchantOnlineMediaName("东区人才卡");
        properties.setMerchantAgreementUrl("https://example.com/agreement.htm");
        properties.setOnboardingUpperHuifuId(CHANNEL_HUIFU_ID);
        return properties;
    }
 
    private static HuifuIndividualOnboardingCommand individualCommand() {
        return new HuifuIndividualOnboardingCommand(
                "MO-TEST-1", "阳野", "511602199803310019", "0", "20120110", "20320110", "15708261096",
                "四川省广安市广安区兴安中街227号3栋1单元6楼2号", "1347747024@qq.com", "5812",
                "510000", "510100", "510104", "F40-ID", "F41-ID",
                "6217003680002760924", "510000", "511600", "01050000", "F13-CARD");
    }
 
    private static HuifuEnterpriseOnboardingCommand enterpriseCommand() {
        return new HuifuEnterpriseOnboardingCommand(
                "MO-TEST-2", "成都喜望科技有限公司", "成都喜望科技", "91510100MA6C5XXXXX", "0", "20180110", "20480110",
                "510000", "510100", "510104", "四川省成都市高新区天府大道1号", "张维", "510101199001010011",
                "0", "20120110", "20320110", "四川省成都市高新区天府大道1号", "张维", "13800000000", "zhangwei@example.com",
                "3", "5812", "F07-LICENSE", "F02-LEGAL", "F03-LEGAL",
                "0", "成都喜望科技有限公司", "6217003680002760924", "510000", "510100", "01050000",
                "CCB510400", "中国建设银行攀枝花东区支行营业部", "", "", "", "", "",
                "F08-ACCT", "", "", "",
                "20180110", "100.00");
    }
}