快速参考里唯一查不到的是一个错误码属于哪个 API 族
——而有几个错误码在不同 API 族里含义不同。这就是下面的第一个问题。
同一个错误码在 Waffo 每个 API 上的含义都一样吗?
不一样。 错误码的数字部分是按 API 族划分的,不是全局的。尤其有三个错误码 是陷阱:
因此,
/api/v1/payout/create 上的 A0013 表示你之前带该
payoutRequestId 的请求仍在处理中——请等待,然后先查询该请求,再重新提交;而
/api/v1/order/cancel 上的 A0013 是终态,不得重试。
务必按你所调用端点所属的 API 族来解读错误码。
前缀的含义在所有地方都是稳定的:A 商户相关,B 用户相关,C
系统相关,D 风控拒绝,E 未知(持续查询直到得到最终状态)。
Payout 时我必须传哪些收款人字段,哪些要放进 payoutMethodProperty?
字段要求是一个收款国家 × Payout 方式的矩阵,而不是 API 本身的属性。
正因为如此,规范中把 payeeFirstName、payeeMiddleName、payeeLastName 和 payeeIDType 声明为
conditional。
有两条身份规则写在矩阵之外的字段定义本身里:
对于其他所有通道,收款人字段由下游校验而非按国家规则校验,
所以请把你持有的信息全部传上。随着通道的接入,矩阵中会不断增加行
——把它当作下限而不是上限,让拒绝结果告诉你到底缺了什么。
哪些字段应放在 payoutMethodProperty 里而不是顶层?
payoutMethodProperty 是一个 JSON 字符串(最长 512 个字符),不是对象,而且它是
唯一接受银行路由信息的地方:
收款人的账户标识本身不在
payoutMethodProperty 里——它是
payoutInfo.payoutMethodUserAccountNo,其格式取决于
payoutMethodType:BANK_ACCOUNT 为银行账号,EWALLET 为
钱包自身的账号或公开用户标识。payoutMethodName 在 EWALLET 时为钱包
名称,在 BANK_ACCOUNT 时为空。
创建 / 查询 / 通知循环本身请参见 Payout FAQ。
Payout 的 purpose 可以取哪些值?
/api/v1/payout/create 上的 purpose 在向中国大陆 Payout 时为必填,此时
必须是下列值之一;对于其他通道它是可选的,会按你传入的原样透传给
收款方。可接受的值:
请选择真正符合该笔付款性质的值。某些通道——尤其是中国大陆——
会据此进行校验。
相邻的两个自由文本字段经常与它混淆。
description(最长 128
个字符)会打印在收款人的银行或钱包账单上,所以请保持简短:银行
和钱包会截断它,实际上限大约是 16 个英文单词或 10 个中文字符。
extendInfo(最长 128 个字符,JSON)会原样回传给你,
不会到达收款人。
/api/v1/order/create 上哪些”可选”字段对某些支付方式来说会变成必填?
收单规范把 goodsInfo、addressInfo 和 userInfo 的大部分字段标记为
可选,因为是否必填取决于实际使用的支付方式。
按 payMethodType 汇总如下:
请把这张表当作评估工作量的信息,而不是契约:同一个
payMethodType 在不同
市场之间可能不同,这也是为什么有几个单元格写着视市场而定。BNPL 是唯一
在所有提供它的地方都要求完整逐项商品清单的类型。
如果你使用 Waffo 托管的收银台,通常可以忽略这张表。 当所选
方式需要你未提供的用户信息时,买家会被重定向到收银台,
由收银台收集。只有在流程中没有收银台时,这张表才重要。
关于权威做法——提交、读取返回的缺失字段列表、重新发送——以及
可能被要求的全部字段路径,请参见
按支付方式划分的条件必填字段。
orderAction.actionData 里有什么?
当 orderStatus = AUTHORIZATION_REQUIRED(即买家还有事情要做)时,
/api/v1/order/create 和 /api/v1/order/inquiry 会返回 orderAction。
actionType 为 WEB(把买家重定向到 webUrl)或 DEEPLINK(打开 deeplinkUrl)。
actionData 是重定向之外的另一种选择:它携带原始的支付凭据,让
你可以渲染自己的收银台页面。任何一次响应中只会出现与所选支付
方式相关的子集,所以请把每个字段都视为可选,有什么就渲染什么。
支付凭证字段
金额与汇率字段
银行转账字段
虚拟账户(按订单生成的
bankAccount)仅凭账号即可对账;
共享收款账户则凭 referenceNumber 对账。如果两者都返回了,
两个都要展示,并把 referenceNumber 视为买家必须输入的内容。
完整错误码表——Payout
/api/v1/payout/create、/api/v1/payout/inquiry 以及 Payout 通知。
注意 Payout 没有的错误码:没有
A0015–A0047。如果你在
Payout 端点上看到其中之一,说明你看错表了。
完整错误码表——收单
/api/v1/order/create、/inquiry、/cancel、/refund、/capture、
/api/v1/refund/inquiry 以及支付和退款通知。
收单族是最宽的一族,
快速参考
中还包含本规范版本之外的其他收单错误码。两者不一致时,
以快速参考为较新的列表。
完整错误码表——订阅
/api/v1/subscription/create、/inquiry、/cancel、/manage、/change、
/change/inquiry、/update 以及订阅通知。
有两个错误码是这一族独有的,值得单独处理:
A0025(订阅
必须运行超过一个周期)和 A0028(在首期付款完成结算之前请求管理
URL)。
完整错误码表——提现、余额与交易限额规则
/api/v1/account/balance/inquiry、/api/v1/account/history/inquiry、
/api/v1/withdraw/consult、/create、/inquiry、提现通知,以及
/api/v1/risk/transactionlimit/create、/update、/inquiry。
A0100–A0102 只存在于这里,并且只出现在交易限额规则
端点上。它们不在通用快速参考中,所以 A0100 不是
写错了的 A0010。
我收到了一个不在上述任何表格里的错误码,它是什么?
Waffo 在签名公共 API 上返回的每个错误码都符合以下形式之一:0,或
单个字母 A–E 后跟四位数字。任何其他形式的值——更长的
字符串、不同的前缀、混合的字母数字标识——都不属于公共
错误契约,你的集成不应基于它做分支判断。把它连同
paymentRequestId / payoutRequestId 一起记录下来,并
联系支持;在通过查询调用获得确定状态之前,
按 E0001 的方式处理该笔交易。
对于形式符合公共规范、但就是不在你所调用 API 族表格里的错误码也一样:
查询订单以获得其真实状态,而不是从错误码推断结果。