x402接口已经扣款:为什么仍然返回支付未完成

 / 
2

"扣款成功但接口还是说没付完"——你查的如果是区块浏览器上的转账记录,那这俩信息本来就不在一条时间线上。

欧易OKX交易所
全球领先的加密货币平台,适合新手与进阶交易者
新手福利:注册即享20% 交易手续费减免!

昨天群里有个人贴了张截图: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"列表,确认没有堆积。

欧易OKX交易所
全球领先的加密货币平台,适合新手与进阶交易者
新手福利:注册即享20% 交易手续费减免!

验证收尾

打开你用的 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)