在沙箱环境中对验证集成进行端到端测试

Charles Archibong, 联合创始人
使用已发布的沙箱测试 ID(其最后几位数字决定结果)来驱动代码必须处理的每个结果,然后在切换到正式密钥之前,使用签名的模拟事件测试 webhook 接收器。

要点
- 沙盒只接受已发布的测试 ID;其最后几位数字用于选择测试场景。
- 测试你将基于失败进行分支的情况,而不仅仅是测试成功路径。
- 元数据中的 sandboxOutcome 和 sandboxDelayMs 会强制指定场景并控制时间;生产环境会忽略它们。
- 使用签名模拟事件(包括重发和轮换)单独测试 webhook 接收器。
通过使用沙箱测试 ID 故意触发每一种结果,来测试代码将要处理的每一种结果,包括失败的情况。 Toden 在沙盒环境中,已发布测试 ID 的最后几位数字用于选择场景:已验证、未找到、自拍不匹配、文件过期、提供商错误等等。无需调用任何外部资源,也无需支付任何费用,因此您可以根据需要多次运行完整的测试矩阵。
然后单独测试你的 webhook 接收器,使用已签名的模拟事件、重发和失败响应。大多数在发布后发现的集成错误都存在于失败路径和接收器中,而不是存在于每个人都手动测试过的成功路径中。
沙箱的行为方式
沙盒是通过键前缀选择的:pk_test_对于客户端 SDK,sk_test_对于您的后端,根据沙盒指南 (在新标签页中打开),需要遵守以下三条规则:
仅接受已发布的测试 ID。提交的真实 ID 号码将被拒绝。
422 only_test_ids_allowed这样,真实的身份证号码就不会出现在你的测试数据中。结果均为伪造。个人信息、政府照片、文件读取和数据库检索结果均为预先设定好的。并未调用任何政府数据库或其他外部服务。
不会收取任何费用,包括信用额度不足的情况。
测试 ID 还会绕过您组织的 ID 类型允许列表,因此新组织可以立即开始测试。
沙盒环境和生产环境是完全独立的:密钥、验证、Webhook 端点和配置不会在两者之间交叉。您在沙盒环境中设置的内容,也需要在生产环境中重新设置。
测试 ID 如何选择结果
测试 ID 由零填充和场景编号组成,因此它在其 ID 类型内保持有效。对于尼日利亚人来说 BVN :
00000000001 → verified
00000000002 → not_found
00000000004 → selfie_mismatch
00000000012 → provider_error每种 ID 类型对于相同的概念都有其自身的格式:A00000001对于尼日利亚护照而言,GHA-000000001-0办理加纳卡,00000001适用于肯尼亚国民身份证。更改末尾数字即可更改场景。完整的 24 种场景以及每种身份证件类型的格式表格请参见指南。
已验证 BVN 按照文档中的示例,从后端进行测试:
curl -X POST https://api.toden.co/api/kyc/verify \
-H "Authorization: Bearer pk_test_xxx" \
-H "Content-Type: application/json" \
-d '{
"country": "NG",
"idType": "bvn",
"idNumber": "00000000001",
"userData": { "firstName": "Chidi", "lastName": "Okafor", "dateOfBirth": "1990-04-12" },
"metadata": { "requestId": "test-001" }
}'对于文档 ID,沙箱永远不会读取图像。 SDK 文档流默认使用已验证的测试用例,或者可以通过传递文档的测试 ID 来选择场景。idNumber, 例如A00000007护照过期了。
值得测试的结果,按代码功能分组
二十四个场景对于大多数集成来说都太多了,需要逐一测试。请根据每个场景在代码中执行到的分支进行分组:
你的代码分支 | 运行场景 | 要断言什么 |
|---|---|---|
经过 | 1 | 只有在您的后端收到结果后,才能授予访问权限。 |
该ID不存在 | 2 | 您要求用户检查输入的数字。 |
重新拍照 | 4 | 用户会被引导至正确的采集步骤,而不是死胡同。 |
修复输入 | 5 | 该消息与以下内容相符 |
新文件 | 7 | 系统会要求用户提供当前文档。 |
Toden '方失败了 | 12 | 用户看到的是一条通用消息;你的团队看到的是…… |
配置问题 | 17 | 警报已送达您的团队,但用户并未受到指责。 |
某些场景遵循您工作流程自身的设置,这很有用,因为它测试的是您的配置,而不是固定的答案。场景 5 和 6 默认情况下会失败,但可以通过以下方式验证:dataMatch: false当您的工作流程记录这些身份信息而不是因此失败时,情况就会发生。场景 22 和 23 遵循您的年龄限制:场景 22 返回的出生日期略微超出您的限制,场景 23 不返回任何信息,并且这两个场景都在没有年龄限制的工作流程中得到验证。场景 24 遵循您将自拍照片与文档上打印的照片进行匹配的设置,并在您的工作流程未使用该照片作为身份证明时进行验证。
强制结果和时机
两个覆盖输入metadata在生产环境中会被忽略:
sandboxOutcome强制执行任何场景,而不管测试 ID 是什么,例如"sandboxOutcome": "selfie_mismatch". 在以下情况下很有用: SDK 文档流程不会收集 ID 号。sandboxDelayMs控制验证完成所需的时间,范围从 0 到 60,000 毫秒,默认值约为 1,200 毫秒。
刻意利用延迟时间。将其设置为 0 可进行快速自动化测试。将其设置为几十秒可测试人们容易忽略的部分:应用在等待期间显示的内容、用户是否可以离开屏幕并重新返回,以及缓慢的 webhook 是否会导致屏幕卡住。
"metadata": {
"requestId": "test-slow-002",
"sandboxOutcome": "document_expired",
"sandboxDelayMs": 30000
}你在那里的时候,也提交同样的内容。requestId两次。你应该收到的是已有的验证结果,而不是第二次验证,而你的重试逻辑正是依赖于第二次验证的结果。
检验决策本身,而不仅仅是检验结果。
如果你的工作流包含决策规则,那么检查只是解决问题的一半。请在已发布的沙盒工作流中运行每个场景,并确认你的策略预期的结果:selfie_mismatch应该提交审核的事项已收到。in_review, 不是declined记住这一点verification.completed仅反映检查结果;工作流程的最终结论如下:verification.status_updated你的后端应该对此做出反应。
企业验证有其自身的沙盒环境。任何注册号均被接受,并解析为已验证的设备。RC0000001已核实RC0000002没有找到,而且沙盒公司拥有一批关键人员来开展尽职调查。
单独测试 webhook 接收器
创建一个沙盒 Webhook 端点,并在其页面上使用模拟器。该模拟器会通过真实的传输路径发送一个逼真的、已正确签名的任何事件样本,而无需进行验证。Webhook测试指南 (在新标签页中打开)推荐了一个测试顺序;以下步骤可以捕获大多数错误:
确认接收器已验证原始机身上的 V2 签名并返回
2xx迅速地。从控制面板重新发送一次交付,并确认副作用只发生一次,因为您的去重是基于事件 ID 进行的。
返回非
2xx暂时做出响应,并确认已安排重试。轮换使用密钥,并在宽限期内确认两个签名均被接受。
错开顺序传递两个事件,并确认处理程序最终仍处于正确的状态。
切换到实时密钥之前
使用测试 ID 上传的媒体文件将保留三天,然后被占位符替换,因此请勿构建依赖于原始图像的后续测试。测试矩阵通过后,环境指南 (在新标签页中打开)将列出生产环境所需的内容:
您的企业资料已获准投入生产。在此之前,生产验证和上传请求将被拒绝。
business_not_approved。您已创建实时密钥:客户端可发布密钥、后端结果密钥。
您已注册生产环境 webhook 端点并验证了其签名。
您的信用余额已充值,并已设定低余额阈值。
您已将测试密钥替换为正式密钥。
补充一条你自己的信息:指出 SDK 由于工作流仅限于一个环境,因此请在您的生产工作流 ID 中进行设置。
在向客户开放流程之前,先在生产环境中进行一次真实的验证。沙箱环境可以验证你的代码能够处理所有可能的结果;而第一次正式运行则可以验证你复制的配置是否与预期一致。
参考来源



