—
—
| 现象 | 真凶 | 怎么修 |
|---|---|---|
| 抓包看到 402,JS 里读不到头 | 没设 Access-Control-Expose-Headers | 把 payment-required 等自定义头加进暴露列表 |
| facilitator 报 invalid nonce | nonce 复用,或签名域与链 ID 不一致 | 每次重新生成随机 nonce;核对 domain 的 chainId |
| facilitator 报 amount mismatch | 金额单位错(USDC 6 位小数) | 0.01 USDC = 10000,不是 1e16 |
| 买家没 gas 也能付款(这是对的) | EIP-3009 transferWithAuthorization 由 facilitator 代付 gas | 买家只需持有 USDC |
| 钱到账但对账对不上 | 用平台自己的记录对账,而不是链上事件 | 只认链上 Transfer 事件,容差 ±$0.02 |
| 一直不到账 | 没到起结门槛 / 还没到结算日 | 自然月汇总,次月 10 号结算,$50 起结 |
| 探活把端点判成已死 | MCP 端点返回 SSE,客户端按 JSON 解析失败 | 只按 HTTP 状态码判定,200 与 402 都算活 |
1 · 402 发了,浏览器读不到。抓包能看到响应头,JS 里却拿不到——自定义响应头必须显式加进 Access-Control-Expose-Headers,否则浏览器按安全策略直接屏蔽。
2 · 探活误判。用 JSON 客户端去探返回 SSE 的 MCP 端点,一律被判成「已死亡」;正确做法是只看状态码,200 和 402 都算活着。
3 · 金额单位。USDC 是 6 位小数,0.01 要写成 10000;写成 1e16 会被 facilitator 直接拒,且报错信息不会告诉你单位错了。
4 · 对账只认链上。平台自己的记录可能因为进程重启、内存旧值覆盖而不准,对账必须以链上 Transfer 事件为准。