已经确认、还没修的行为差异。写在这里是为了让你现在就绕开,而不是踩到之后自己猜。
已知问题
这一页记的是我方已经确认为不合意、但还没改的行为。它们都不会报错 ——所以不写出来,你只会在生产上遇到,然后花时间怀疑自己。
每一条都给了「现在怎么写」。按那样写的代码,在我方修掉之后不需要改。
K-001 · 开卡申请的状态在两个端点上不一致
表现
POST /v1/cards/applications 下单时返回 status: "pending";回查 GET /v1/cards/applications/{id} 时同一张单返回status: "pending_merchant_funds"。
下单那一侧是裁剪过的三档,回查那一侧是内部原文(20 档)。
为什么会咬到你
你按下单响应写的状态映射表里没有 pending_merchant_funds。一次「商户预付不足排队」在你的系统里会落进 default 分支 ——而多数人的 default 是「未知,当失败处理」。
现在怎么写
把 pending_merchant_funds 当 pending 处理,并对所有不认识的在途状态一律按「还在跑,继续轮询」处理,只把那 5 个终态硬编码。见状态机与取值。
我方会怎么修:收敛到裁剪那一侧(回查也只回三档 + 终态)。
K-002 · 介质由 form_factor 决定,product_id 说了不算
表现
POST /v1/cards/applications 的介质只看请求体的 form_factor:physical = 实体卡,其余一切取值(含大写 Physical、含缺省)都按虚拟卡处理。没有拼写校验,没有报错。
而 product_id 指向的产品行自己也有一个介质,我方在解析产品时读了它 —— 但没有用。于是:
| 你传的 | 实际开出 |
|---|---|
一个实体卡产品的 product_id,不传 form_factor | 虚拟卡 |
一个虚拟卡产品的 product_id + form_factor: "physical" | 按实体卡流程走 |
form_factor: "Physical"(大写) | 虚拟卡 |
为什么会咬到你
你以为下单的是实体卡,结果开出一张虚拟卡 —— 而且账也对得上(实体卡才收邮费,按虚拟卡走就不收,两边都自洽)。发现这件事通常是会员问「我的卡什么时候寄到」。
现在怎么写
product_id 与 form_factor 一起传,并且自己保证两者一致。 form_factor 用小写常量,别拼接、别透传用户输入。下单后回查详情核对返回的 form_factor 再告诉会员。
我方会怎么修:传了 product_id 时以产品行的介质为准;两者冲突、或 form_factor 认不出,一律 400。
K-003 · 不传 client_key 会随机生成一把
表现
POST /v1/cards/applications 的 client_key(业务层幂等键,落库、永久)不传时我方随机生成一把。
为什么会咬到你
请求头 x-idempotency-key 的窗口是 24 小时。超过 24 小时之后同一份 body 重发,两把键都不拦 —— 会真的开出第二张卡,并真的再扣一次开卡费。
现在怎么写
自己传 client_key,用你那边的业务主键。这是唯一一把永久的幂等键。
我方会怎么修:不打算改缺省行为(随机比固定安全),但会在下单响应里回显生效的 client_key,让你能核对。
K-004 · 部分端点的 failure_code 是空字符串而不是 null
表现
拿不到具体失败原因时,failure_code 是 ""。
现在怎么写
判空用 falsy 判断(if (!failure_code)),别用 === null。出参里的所有可选字符串字段都按这条处理。
已修(留档,方便你确认自己绕开的写法可以撤了)
| 何时 | 原来的坑 | 现在 |
|---|---|---|
| 2026-08-14 | GET /v1/transfers/recipient-types 被 /v1/transfers/{id} 接走 —— 转账流程第一步从来没通过过 | 已修;新增路由遮蔽守卫防止再犯 |
| 2026-08-14 | 认证指南教你传 x-zise-merchant,而我方没有任何一处读它 | 四处已清(指南 / Postman 集合 / 三个示例工具) |
| 2026-08-14 | 开卡 / 转账 / 理财 / 扫码付都做不出确认页 | 五条只读端点,见各自的指南 |
| 2026-08-14 | 个人汇款开户协议正文商户手上一个字都没有(而提交即记录「已同意」) | GET /v1/remit/vp/agreement |
| 2026-08-14 | 卡申请走不下去只能等它失败 | cancel-preview + cancel |
| 2026-08-14 | CVV 锁死后卡密永久看不到 | POST /v1/cards/{id}/cvv/unblock |
| 2026-08-14 | 被驳回只知道「被拒了」,不知道为什么 | GET /v1/kyc 带 reject_reason / l2_reject_reason |
| 2026-08-14 | 改名换证只能重建会员(旧账号的钱与卡留在原地) | POST /v1/kyc/profile-sessions |
| 2026-08-14 | 没有换绑邮箱的路 | POST /v1/members/{id}/email-sessions(托管屏 · 两道码) |
| 2026-08-14 | 经开放 API 建的会员没有会员号,而 uid 是转账缺省的收款人类型 | 建号即分配 |
| 2026-08-14 | 卡补件没有终端用户能走的提交口(submit_url 恒空) | POST /v1/cards/applications/{id}/supplement-sessions 换一张托管屏链接;详情里改叫 submit_via |
| 2026-08-14 | 开放 API 一个邮寄地址端点都没有 → 实体卡一张都开不出来 | /v1/shipping-addresses 五个端点(新 scope addresses:read / addresses:write) |
| 2026-08-14 | 上游要求补报付款人的扫码付走廊在开放 API 上无法提交 | quotes 与 payments 都收 payer |
| 2026-08-14 | 兑换方向拧上「需强认证」后在开放 API 上永久不可成交 | 回 step_up_required 时带 hosted_url,验完带 x-step-up 重发 |
| 2026-08-14 | 转账 / 理财的 require_step_up 在开放 API 上不执行(假的安全承诺) | 两条都执行,托管屏两段式 |
| 2026-08-14 | 扫码付支付无任何二次确认 | 每一笔都要强认证,与会员端的支付票据对等 |
| 2026-08-13 | L2 没有开放的提交路径 | POST /v1/kyc/l2/sessions,与 L1 同型的托管屏 |
| 2026-08-13 | GET /v1/kyc/requirements 只有五条,缺扫码付/提现/转账 | 补齐到九条;扫码付另给 kyc_trigger_amount |
| 2026-08-13 | REJECTED 显示成 none,与「从没申请过」同形 | status 多一档 rejected |
| 2026-08-13 | 补件列表跨 L1/L2 却不带 level | 出参带 level |
怎么报一条新的
带上响应里的 request_id 找我方 —— 那个 ID 能定位到具体一次调用。确认之后会加到这一页,并给出「现在怎么写」。