"扣款成功但接口还是说没付完"——你查的如果是区块浏览器上的转账记录,那这俩信息本来就不在一条时间线上。
昨天群里有个人贴了张截图:USDC 转出去了,链上确认了,但调用那个数据接口还是返回 402。他觉得自己被多扣了钱。我让他把完整的请求响应日志贴出来,结果发现他签完名之后,没把 PAYMENT-SIGNATURE 带回给原来的服务器。
x402 不是"先转账,再拿货"。它是一笔待签名的授权,跟着请求一起走,服务器确认了才触发结算。扣款显示在链上,但服务器那一侧根本没收到你付过钱的凭证。很多人在这一步被绕晕,因为钱包里 USDC 确实少了,就以为流程走完了。
步骤 1:确认你是不是少了"回执"这一步
把浏览器开发者工具(F12)的 Network 标签打开,找到你调那个接口的请求记录。
看两样东西:
请求头里有没有
PAYMENT-SIGNATURE响应头里有没有
PAYMENT-RESPONSE
完成标准: 看到 PAYMENT-RESPONSE 里有 settlement 相关字段,才算服务器认了这笔支付。(来源:x402 协议规范,GitHub,2026-04-01)
如果只有链上转账成功,但没有这组 header 交互,就等于你把钱扔进了一个邮箱,但没告诉卖家你塞了多少钱进去。
步骤 2:排查钱包扣了但接口没认的原因
情况 A:没把签名带回原请求(最常见)
表现: 钱包弹窗让你签名,你点了,看到转账成功就关了页面。
问题在哪: 签名只是授权,流程在 facilitator 那边。正确的 x402 流程是:第一步拿 402 报价 → 第二步签名但不广播 → 第三步带着 PAYMENT-SIGNATURE 重试原请求 → 服务器验证通过后才触发链上结算。(来源:Cloudflare x402 协议说明,2025-09-22)
怎么做: 必须用钱包配套的客户端(比如 purl 或 SDK)来发请求,它会自动完成"重试时带上签名"这一步。手搓 curl 很容易漏掉这个回传动作。(来源:Stripe x402 文档,2026-03-04)
情况 B:签名过期了(validBefore)
表现: 扣款成功,但接口返回 402,日志里有 invalid_exact_evm_payload_authorization_valid_before。
怎么做: 打开 x402trace explain 工具分析捕获的日志,看具体的过期时间戳。(来源:x402trace NPM 包文档,2026-05-29)
完成标准: 看到类似 validBefore expired 97s ago, fix: re-sign with later validBefore 的提示,说明需要重新发起一次完整的 402 流程,不能用旧签名重试。
情况 C:网络配错了(testnet 签名丢到 mainnet)
表现: 钱包扣了测试网的 USDC,但接口连的是主网 facilitator。
怎么做: 检查钱包当前连接的网络,和接口要求的 network 字段是否一致。invalid_payload 在 x402-relay 里持续 15 天以上的一个典型根因就是网络不匹配——客户端对着 testnet 签名,却发给 mainnet 的结算端点。(来源:x402-sponsor-relay Issue #110,2026-02-22)
情况 D:origin 返回了 4xx/5xx,结算被跳过
表现: 签名验证通过了,但数据源本身报错了(比如 500)。这时候 x402 协议会跳过结算,不会真正扣款。(来源:AWS WAF 文档,Amazonaws,2025-10-15)
怎么做: 先看原始接口返回的 HTTP 状态码。如果是 500 之类的错误,链上显示的那笔"扣款"其实没真正完成,过一会儿会回滚。别重复签名,先修接口本身。
高危提醒:x402 的支付授权是 单次使用 的。同一个 PAYMENT-SIGNATURE 如果被重复提交,协议会返回新的 402 拒绝。(来源:AWS WAF 文档,Amazonaws,2025-10-15)如果你的脚本在报错后自动重试且每次都生成新签名,可能产生多笔待结算授权。去 facilitator 后台查一下"pending settlements"列表,确认没有堆积。
验证收尾
打开你用的 facilitator 的 /settle 或 /verify 接口日志(或者对应的 Dashboard),查一下你这笔 payment-identifier 的状态。
完成标准: 状态从 pending 变成 settled,并且上游接口返回了 2xx 和数据内容。如果只有链上记录但没有 settlement 记录,说明你卡在了"签名 → 回传"这个环节,重新走一遍带 PAYMENT-SIGNATURE 的重试。
下一步衔接动作: 在你的代理逻辑里加一行判断——收到 402 后必须等待 PAYMENT-RESPONSE 的 settlement 字段为 true,才算支付完成。不要以钱包弹出"成功"为准。预估等待时间:Injective 上约 650ms 一个区块,其他 EVM 链取决于网络拥堵情况。(来源:Injective x402 文档,2026-08-03)



