跳转到主要内容
集成安全相关内容由三个页面分担:

我能自己添加生产环境公钥吗?

可以。在 Settings → Integration 的 Merchant Sign Configuration Details 表格上方有一个 Configure 按钮。你可以自己从 Portal 提交密钥,不需要给任何人发邮件传文件。 自助提交和 Waffo 审核不是二选一——两者都有。当你确认时,对话框会明确说明:once submitted, it will enter the review process。密钥会立即以 Pending 状态注册为一个新版本,到达 Active 后才可使用。整个过程中你现有的密钥持续验证你的流量,所以一次提交永远不会中断线上支付。

公钥字段到底接受什么格式?

它很严格,对话框会显示一个对照所需长度的实时字符计数器,让你在提交前就能判断: 392 不是建议值。只有当你的输入正好是该长度时字段才通过校验,超过时计数器会变红。实际含义是:只取你 PEM 文件中单行的 Base64 主体,别的一律不要。 直接粘贴 PEM 文件会因为头、尾和换行而长度不对。上线检查清单 展示了如何把 PEM 精简为该字段需要的值,认证与签名 FAQ 有生成密钥对的 openssl 命令。 校验会产生三种不同的拒绝,告诉你上面哪一项不满足:长度不匹配、非法字符(不是合法 Base64 的内容——通常是多余的空格或包裹行),以及算法不匹配(一个合法的 Base64 字符串,但根本不是 2048 位 RSA 公钥)。

为什么 Portal 要我对一个挑战字符串签名?

为了证明你持有与所上传公钥配对的私钥。没有这一步,任何能打开该表单的人都可以注册一个自己并不掌控的密钥。 对话框内的流程:
  1. 粘贴你的公钥。先进行格式检查。
  2. 通过后,会出现一个 Ownership Verification 区块,其中有一个挑战字符串,带复制按钮。
  3. 在本地用与你刚粘贴的公钥配对的私钥、使用 SHA256withRSA 对该字符串签名,并将结果 Base64 编码。
  4. 把签名粘贴到 Signature Result。
在操作类型、合法公钥和签名三者齐备之前,Confirm 保持禁用。随后签名会用你提交的公钥验证——不匹配的密钥对在提交时就被拒绝,所以你会立刻知道,而不是等审核之后。 对挑战字符串严格按显示原样签名。

API 操作类型有哪些?

操作类型限定一个密钥对——以及随之签发的 API 密钥——允许用于什么。对话框中的按钮如下: 你可以同时选择 Payin 和 Payout,Portal 会将其注册为一个覆盖两者的合并范围。之后你在表格中看到的是一行 Payin-and-Payout,而不是两行。

为什么我不能把 Withdraw 和 Payin 或 Payout 组合?

因为 Withdraw 是不同类别的操作:它把你自己已结算的资金转出,而不是把客户的钱收进来或付给第三方。Waffo 把它放在独立的凭据上,这样你的收银台或 Payout 服务所用的密钥永远不能用来转出你的余额,一个被攻破也不意味着另一个被攻破。 对话框是强制执行而不是警告:选择 Withdraw 会清除 Payin 和 Payout,选择其中任一个会清除 Withdraw。不存在任何包含 Withdraw 与其他项的组合。所以如果你通过 API 操作提现,请计划至少两套凭据——一套用于支付流量,另一套单独用于提现——并把它们放在密钥库的不同位置。

密钥轮换如何做到零停机?

关键机制:提交永远不会原地修改密钥。 每次被接受的提交都会创建一个新版本,每个版本都有自己的 API 密钥。哪个公钥来验证某个请求,由该请求上的 X-API-KEY 决定——一个 API 密钥,一个公钥。 这正是干净轮换得以实现的原因,因为同一操作类型下可以同时有多个版本处于 Active:
  1. 生成新密钥对。旧的保持原位并继续使用。
  2. 从 Portal 提交新公钥。它以 Pending 状态作为新版本出现。你的流量继续用旧密钥验证,不受影响。
  3. 当它到达 Active 时,从 Merchant Sign Configuration Details 表格中读取其 API 密钥。
  4. 在你的集成中,把 X-API-KEY 和签名私钥一起切换,作为一次变更。它们是一套;只换其一会产生 A0002。
  5. 在新凭据上验证流量,然后停止使用旧的。
由于步骤 4 期间两个版本都是 Active,你可以逐个服务切换,或跑一个金丝雀,而不会出现两套凭据都不可用的窗口。又因为两者是配对的,回滚只是把请求头和私钥切回去。 不要跳过步骤 3。用现有 API 密钥搭配新提交的公钥是最常见的轮换失败——旧 API 密钥仍指向旧公钥,所以你的新签名验证失败,而 Portal 中一切看起来配置正确。

怎么让一把 API key 立即失效?

在生产环境 Settings → Integration 的 Historical Versions 表格中,找到状态为 Active 的版本,点操作列的 Revoke(撤销)。确认弹窗会显示 API key 掩码、操作类型和版本,勾选「我已了解撤销后该 API Key 无法恢复」后才能点「永久撤销」。
  • 撤销立即生效,之后使用该 key 的新 API 请求都会被拒绝。撤销不能恢复,记录仍保留在 Historical Versions 中,状态显示为 Revoked。
  • 撤销只影响这一把 key。同一公钥如果还配置在其他 API key 上,那些 key 不会一起撤销;私钥泄露时,请为每把相关的 key 提交新公钥、切换流量,再逐一撤销。
  • 提示「结果尚未获取,请刷新页面核实该 Key 的状态」时,说明网络等原因没有拿到结果,撤销可能成功也可能没有。刷新页面,以列表中的状态为准。
  • 提示「该 Key 的状态已变化,无法撤销,列表已刷新」时,说明这把 key 已经不是 Active,按刷新后的状态处理。
  • Sandbox 没有 Historical Versions,也没有撤销操作。

为什么没有 Revoke 按钮,或者按钮是灰的?

  • 按钮是灰的:同一操作类型至少要保留一把有效的 API key。这把是该类型最后一把时不能撤销,鼠标悬停会提示「该类型至少需要保留一把有效 API Key,请先添加并激活新的 Key」。先提交新公钥,等它变为 Active 后再撤销旧的。类型按精确匹配计算,Payin-and-Payout 的 key 不算作 Payin 的有效 key。
  • 没有按钮:只有 Active 版本可以撤销,Pending、Rejected、待配置公钥和 Revoked 版本都没有该操作;用于卡信息采集的客户端凭据不提供撤销;你的操作人账号没有撤销权限时也看不到按钮,请联系账户的 Admin。

列表里的「待配置公钥(Pending public key)」是什么?

这是 Waffo 开通生产环境时为某个操作类型预先生成的 API key,还没有配置公钥,暂时不能用于调用接口。目前不能在 Portal 中为它提交公钥,需要联系 Waffo 完成配置;配置完成后它变为 Active,API key 本身不变。

我能提交同一个公钥两次吗?

不能。已在同一操作类型下注册的公钥会被拒绝,而不是创建重复版本。这是为了防止不小心「轮换」到你正在使用的密钥上,那样看起来像一次成功的轮换,实际什么都没变。 同一密钥可以在不同操作类型下提交,不过每个范围使用独立的密钥对是更好的做法——这正是划分范围的意义。

我能持有的密钥数量有限制吗?

有,每个操作类型下最多 100 个公钥,超出上限的提交会被拒绝并提示“公钥数量超过上限”。请有计划地轮换,并在重新提交前先修复被拒绝提交的原因。

我在哪里能看到过去的提交记录以及某次为什么被拒?

Historical Versions,在同一页面配置表格的下方。每行是一次提交: 被拒不是终点:阅读原因,修复,再作为新版本提交(受上述每个操作类型的公钥数量上限约束)。列表分页显示,最新的在前,所以长期的轮换历史仍然可读。

密钥被激活或被拒时,会收到通知吗?

无论哪种情况,系统都会发邮件通知。激活邮件确认操作类型和遮蔽形式的已激活密钥;拒绝邮件包含原因。 提交者从 Portal 得知结果,通知邮件不一定发到提交者本人的邮箱。请查看 Historical Versions,而不是等转发的邮件。

Sandbox 需要配置公钥吗?

不需要,也不能。Configure 按钮和 Historical Versions 只在 Sandbox 之外出现——在 Sandbox 中,Waffo 在开通 Sandbox 时为你生成密钥对,Sandbox 密钥材料直接显示在 Integration 页面上,你可以立即开始签名。 上线时的两个后果:
  • 不要在生产环境复用 Sandbox 密钥材料。 生成一对新的;生产环境公钥必须是你提交的、且私钥只有你持有的那一对。
  • API 域名和凭据一起切换。 每个环境有自己的 API 地址和 API 密钥;地址在你所在环境的 Integration 页面上显示。

为什么我的生产环境公钥是遮蔽的,而 Sandbox 私钥不是?

因为它们不是同一类秘密。在生产环境中,页面默认遮蔽密钥材料并提供显示/隐藏控件,这样在共享屏幕或录制的通话中打开 Integration 页面不会暴露它。复制操作在不解除遮蔽的情况下始终可用,所以你永远不需要仅仅为了把值移到密钥库而显示它。 你的生产环境私钥永远不在这个页面上,也不应该在——Waffo 不持有它。如果你丢失了它,Portal 中没有任何操作能恢复:生成新密钥对并按上文轮换。

Merchant Sign Configuration Details 表格里有什么?

你持有的每个操作类型一行,把凭据与其使用的 URL 关联起来: URL 列是配置而不是密钥材料,修改无需审核——其校验规则和范围见 Portal 自助安全配置。如果你持有用于卡信息采集的客户端凭据,它会在此表格中以独立一行出现。
轮换后签名仍然失败?按 认证与签名 FAQ 中的 A0002 检查清单逐项排查——轮换后的失败几乎总是因为 API 密钥和私钥已经不再互相匹配。