Skip to main content
已有三个页面涵盖认证机制: 本页是范围矩阵和排查树——哪个凭证可以调用 哪个接口,以及不能调用时如何解读错误。

一共涉及几个密钥?分别由谁持有?

四样东西,其中只有两样是您需要保密的: 运营上真正重要的关系:**一个 API key 恰好对应一个 公钥。**您发送的 X-API-KEY 决定您的签名用哪个公钥 校验——所以 API key 和私钥是配对的, 只换其中一个会失败。

为什么我的 Integration 页面显示多个 API key 和公钥?我该用哪个?

因为凭证按操作类别划分范围,您使用的每个类别各持有一个。 您要找的行是其 API Operation Type 与 您正在发起的调用匹配的那一行。 每个类别确切覆盖哪些接口: 这张表明确了两个细节:
  • **余额查询同时在 Payout 和 Withdraw 范围内。**它是 用两种凭证都能访问的唯一接口,所以余额检查 永远不会迫使您增加范围。
  • **账户历史仅限 Withdraw。**Payout 凭证无法读取。

我用 Payin key 调了 Payout 接口,报权限错误,为什么?

因为范围是按请求路径强制执行的,不是按商户。凭证 有效——只是不允许调用该接口,请求被 以 A0004 Permission denied(HTTP 401)拒绝。 调试时要记住的区别:A0004 的意思是”这个 key,错误的 接口”。它不表示您的 key 错了、签名错了,或 账户缺少该产品。请在上表中查找该接口,然后使用 其操作类型包含该接口的凭证行。

为什么 Withdraw 不能和 Payin 或 Payout 组合?我两个都需要。

因为提现是把您自己已结算的资金转出,而 Payin 和 Payout 是把客户的钱转入或付给第三方。让提现使用独立 凭证,意味着您的收银台服务或 Payout 服务持有的 key 永远无法用来转出您的余额,一个泄露也不意味着 另一个泄露。 Portal 对此是强制而非提醒:选择 Withdraw 会清除 Payin 和 Payout,选择其中任一个会清除 Withdraw。 所以如果您通过 API 使用提现,请规划至少两个凭证—— 一个用于支付流量,另一个单独用于提现——并把它们 存放在密钥管理器的不同位置,使用不同的访问列表。这 正是分离的意义所在;把两者放在同一个环境文件里就前功尽弃。 提交第二个凭证与第一个是同样的自助流程; 见 生产公钥与 API 操作类型。

你们按什么顺序检查我的 API key、范围、签名和 IP?

按以下顺序,了解它能告诉您当多处出错时 您会先看到哪个错误:
  1. **X-API-KEY 是否存在?**否则 → A0001。
  2. **它是否是已知的、Active 的凭证?**否则 → A0001。
  3. **该凭证的操作类型是否允许此接口?**否则 → A0004。
  4. **X-SIGNATURE 是否能用该凭证的公钥验证通过?**否则 → A0002。
  5. **如果您启用了白名单,来源 IP 是否在其中?**否则 → A0046。
实际影响:**签名错误且来自非白名单 IP 的请求 报的是 A0002,不是 A0046。**所以不要因为从未见过 A0046 就断定白名单没问题——您可能只是从来没有 通过签名检查。请按上述顺序修复错误。

“invalid API key”和”invalid signature”有什么区别?

它们指向同一对中的不同两半,各有自己的检查清单: 密钥轮换后,A0002 几乎总是意味着 X-API-KEY 和签名 私钥不再彼此对应——请把两者作为一次变更一起切换。

“merchant status abnormal”或”contract does not allow this operation”是认证问题吗?

不是。那些是账户和协议状态,出现在您的 凭证已被接受之后: 排查捷径:任何 A0001 / A0002 / A0004 / A0046 都是您可以自行修复的凭证 问题。A0006、A0010 和 A0018 是权限 问题,需要 Waffo 侧的配置变更或不同的 请求。完整列表见 错误码。

我必须发送 API 版本请求头吗?

是的,对原始 HTTP 调用:发送 X-API-VERSION: 1.0.0。SDK 会自行管理 该请求头——不要在那里设置或覆盖它。 一个值得点名的陷阱,因为从变更日志很容易搞错:您在 API 版本历史中 看到的版本号标识的是文档和 契约修订,不能放进这个请求头。请求头的值是 1.0.0。见 API 概览。

激活或轮换密钥后多久能用?

给它一小段时间——不是即时的。只有 Active 的凭证能验证 签名,请求路径上使用的查询按间隔刷新—— 所以刚变为 Active 的密钥在一个短窗口内仍可能被拒绝, 而刚停止有效的密钥在同一窗口内仍可能可用。 对轮换的启示:新版本变为 Active 后,等过 该窗口再切流量,并保留旧凭证 直到新凭证验证过真实流量。因为多个版本可以同时 Active,您永远不需要一个两者都不可用的空档。 IP 白名单的行为不同且更快——见下文。

我能在多个商户账户间共用一个 API key 吗?

不能。每个 API key 属于单一商户账户,用账户 A 的凭证 认证的请求只能操作账户 A 的数据。 查询属于账户 B 的订单会失败,即便 key 本身 完全有效。 如果您运营多个商户 ID,请为每个账户保留一套凭证,并 始终用创建该对象的账户的凭证调用。从一开始 就把这种路由建好,比事后改造便宜得多——见 多品牌与子商户设置。

IP 白名单接受什么?编辑多快生效?

如果 20 条不够,请合并为 CIDR 段而不是逐个列出 主机——一个 /24 可替代多达 254 条,稳定的网段 也比每次扩容都变化的列表更省维护。 启用方法和确切的 Portal 字段见 Portal 自助安全配置。

我的服务器在代理后面,或者是动态 IP,实际匹配的是什么?

匹配的地址是请求到达 Waffo 时 forwarded-for 链中的第一个条目—— 即发起客户端地址,而不是最后一跳。如果该值无法解析为 IPv4 地址, 检查记为”无法判定”而不是不匹配。 这一区别决定结果,并且有三种执行策略: Portal 只暴露总开关;策略本身由 Waffo 设置。所以如果您的出口是动态的、多区域的,或在 多层之后容器化,请先让集成支持把您设为仅观察, 观察记录到的不匹配,等列表完整后再切换到执行。 盲开执行,是配置正确的集成 出现故障的常见方式。 如果您的出口确实无法固定到一组网段,白名单 对您来说就是错误的控制手段——它是可选的且默认关闭,而签名 验证已经在每个请求上强制执行。

我怎么知道自己的出口 IP 是什么?

不是从 Waffo——Waffo 看到的地址是您的基础设施 呈现的地址,可靠的来源是您自己的平台:云环境的 NAT 网关或 负载均衡配置,那也是唯一能保证它保持稳定的 地方。 无法从配置获取时的两条实用路径:
  • 向您的平台团队询问支付服务所在环境的出口网段, 并将网段而不是您观察到的地址加入白名单。 观察到的地址在下次扩容时就会过时。
  • 先以仅观察模式运行(如上所述),让不匹配记录本身 告诉您在拦截任何请求之前哪些地址在使用。

我的 Portal 密码传输时加密了吗?Waffo 员工能看到吗?

您的密码在提交前就在浏览器中加密,使用 Waffo 公钥,在 TLS 之上——所以表单永远不会把明文密码放到 线路上,即便在加密通道内也不会。设置或 修改密码时同样如此。 存储侧只保留单向哈希,所以没有 可恢复的副本可读:Waffo 没有任何人能取回您的密码, 密码重置会给您一个链接,而不是告诉您旧值。 密码规则、过期、锁定和登录历史见 Portal 登录、链接与账户状态 和商户 Portal 操作。

我怀疑私钥泄露了,该按什么顺序做?

先轮换,再调查——并记住泄露的私钥让 他人可以冒充您签署请求,其严重程度正如字面所示。
  1. 生成新密钥对,并从 Portal 提交新公钥。您 现有的凭证在审核期间继续有效,所以这一步不会 造成停机。
  2. 新版本变为 Active 后,从 Integration 页面读取其 API key, 把 X-API-KEY 和签名私钥一起切换。
  3. 停止使用旧凭证,并从您自己的日志确认没有 流量仍携带旧 API key。
  4. **如果尚未开启,打开 IP 白名单。**它是唯一一个 能让被盗凭证无法从您的基础设施之外使用的控制手段, 这也是要在需要之前就配置好它的理由。
  5. 审查您自己的处理方式:私钥不得出现在源代码管理、 镜像、日志或浏览器中。 上线检查清单要求它 存放在环境配置或密钥管理服务中。
  6. 告知集成支持发生了什么、何时发生,以便 Waffo 侧 可以审查旧凭证上的活动。
注意第 2 步的失败模式,因为它最常见:用新密钥对 复用旧 API key,会让您仍然对着旧公钥验证,于是您的 新签名失败,而 Portal 看起来配置正确。

我能抓请求和响应报文来调试签名问题吗?

可以,也应该——但请抓原始字节,而不是解析后 重新序列化的副本,因为经过您 JSON 库的一次往返本身就是 签名无法验证的头号原因之一。 记什么、不记什么: 上线检查清单把第二列作为要求而不是建议: 日志不得记录完整密钥或敏感支付信息。短期的、 受访问控制的调试抓取才是正确形态——不是永久的 日志行。