|
|
@@ -549,8 +549,10 @@ public class LsyOnboardingService {
|
|
|
* (首段小写 + {@code L} 大写):键名进**签名原文**,改一个字母就换签名。
|
|
|
* 同族先例:创建腿的 {@code fSettle_account_type}、上游自己拼错的 {@code picture_idcard_hander}。
|
|
|
* <br>★ {@code channel_id} 在本页声明成光秃秃的 {@code String}(创建页 / 更新页是
|
|
|
- * {@code Integer(11)})⇒ **原样发配置字符串,不过 {@code upstreamInteger}**。
|
|
|
- * 同一物理值在四个页面上的声明类型不同,本类按**各页自己的声明**发(计划 §0.5 对同批字段的口径)。
|
|
|
+ * {@code Integer(11)})⇒ **不过 {@code upstreamInteger}**(它做的是数字规范化,本页按声明不需要),
|
|
|
+ * 但仍过 {@link #stringChannelId} **trim** —— 空白处理四条腿必须一致,理由见那个方法。
|
|
|
+ * 同一物理值在四个页面上的声明类型不同,本类按**各页自己的声明**发(计划 §0.5 对同批字段的口径);
|
|
|
+ * 统一的是**空白**这一个轴,**不是**类型。
|
|
|
*
|
|
|
* <p>★ 租户缺口(R-4)对本法同样成立:{@code dto.mchNo} 不受租户约束,三-B 的端点必须先证明
|
|
|
* 它属于当前租户,见类 javadoc。
|
|
|
@@ -574,8 +576,9 @@ public class LsyOnboardingService {
|
|
|
|
|
|
// ③ 组装:9 个键
|
|
|
Map<String, Object> p = mchNoParams(dto.getMchNo());
|
|
|
- // 本页把 channel_id 声明成 String ⇒ 原样发(与创建/更新页的 Integer(11) 不同,见 javadoc)
|
|
|
- p.put("channel_id", props.getChannelId());
|
|
|
+ // 本页把 channel_id 声明成 String ⇒ 不做数字规范化(与创建/更新页的 Integer(11) 不同,
|
|
|
+ // 见 javadoc);但 trim 是与那两条腿共用的口径(见 stringChannelId)
|
|
|
+ p.put("channel_id", stringChannelId());
|
|
|
p.put("mcht_aptitude", dto.getMchtAptitude());
|
|
|
p.put("mcht_aptitude_note", dto.getMchtAptitudeNote());
|
|
|
// ★ store_Loca / mcht_Landuse 的大小写是签名原文,不得规整
|
|
|
@@ -652,8 +655,9 @@ public class LsyOnboardingService {
|
|
|
|
|
|
// ② mchNo 必填 + ③ 组装
|
|
|
Map<String, Object> p = mchNoParams(mchNo);
|
|
|
- // 本页把 channel_id 声明成 String ⇒ 原样发配置字符串(与创建/更新页的 Integer(11) 不同)
|
|
|
- p.put("channel_id", props.getChannelId());
|
|
|
+ // 本页把 channel_id 声明成 String ⇒ 不做数字规范化(与创建/更新页的 Integer(11) 不同),
|
|
|
+ // 但 trim 与那两条腿同一口径(见 stringChannelId)
|
|
|
+ p.put("channel_id", stringChannelId());
|
|
|
|
|
|
// ④ 上送 + 解析:只做 asText 一件事,不映射任何码表(见 javadoc 的两套冲突映射)
|
|
|
return asText(client.postApi("/api/merchant/reportQuery", p).get("reviewed_status"));
|
|
|
@@ -687,6 +691,30 @@ public class LsyOnboardingService {
|
|
|
+ " 项),明细见服务端日志");
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 进件配置里的 {@code String} 型 {@code channel_id} → 出站值:**只 trim**。
|
|
|
+ *
|
|
|
+ * <p>提交入网页(196236563)与入网状态页(196236564)把 {@code channel_id} 声明成
|
|
|
+ * {@code String},创建页 / 更新页声明 {@code Integer(11)} ⇒ 本方法**不做**
|
|
|
+ * {@link #upstreamInteger} 那套数字规范化(「按各页声明发」是既定口径),
|
|
|
+ * 只把首尾空白去掉。两条 {@code String} 腿共用这一个方法,理由同
|
|
|
+ * {@link #requireOnboardingCredentials}:抄两份就会出现「某天只给其中一处加处理」。
|
|
|
+ *
|
|
|
+ * <p>★ <b>为什么必须 trim</b>:另外两条腿走 {@code upstreamInteger},而它的第一步就是
|
|
|
+ * {@code trim()}。这两条若原样发,同一个配置值就会「两条腿修剪、两条腿不修剪」——
|
|
|
+ * 配置来自**环境变量**(联调时用户手工注入),带首尾空白是现实风险,而
|
|
|
+ * {@code channel_id} 进**签名原文** ⇒ 症状是上游回一句签名错误,本侧看不出是空白。
|
|
|
+ *
|
|
|
+ * <p>★ 空白值到不了这里:调用方先过 {@link #requireOnboardingCredentials},而
|
|
|
+ * {@code channel_id} 正是那五项之一 ⇒ 本方法只需要处理「非空白、但首尾带空白」这一态。
|
|
|
+ * 写法仍取 {@code null} 安全的形态(与 {@link #upstreamInteger} 第一行同款),
|
|
|
+ * 这样即便将来闸与组装的顺序被改动,也不会在这里 NPE。
|
|
|
+ */
|
|
|
+ private String stringChannelId() {
|
|
|
+ String channelId = props.getChannelId();
|
|
|
+ return channelId == null ? null : channelId.trim();
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 增量语义的落点:**有值才进 Map**,空白({@code null} / 空串 / 全空格)一律**不 put**。
|
|
|
*
|