如果你在做内容平台、数据服务或者 API,迟早要回答一个问题:一个 AI agent 想付钱买你的东西,它能买到吗?

11 月 9 日晚上,我们在 Pickful 上做了一次实测:一个测试程序拿着测试钱包,花 0.01 USDC 买下一篇付费文章。带着付款的那次请求,服务器从验证签名、链上结算到返回正文,用了约 2.4 秒,全程没有人点按钮。

跑完这一趟,我们的判断是:这次接入里,签名和链上结算几乎都是现成的组件。真正花工夫的,是把「谁付过钱」和「给什么货」接起来。我们自己栽跟头的,是验钱这一步。

一笔交易的完整过程

这次用的是 x402 v1 的 exact 方案,在 Base 链上付 USDC。x402 借用了 HTTP 里一个闲置多年的状态码:402 Payment Required。测试程序一共发了两次请求。

第一次是问价。程序请求文章的 .md 地址,服务器不给正文,返回 402,并列出付款要求:Base 链,USDC,0.01,收款地址是这篇文章作者的钱包。

然后是签名。程序不发链上交易,而是按 EIP-712 签一份 EIP-3009 的转账授权(TransferWithAuthorization):从测试钱包转 0.01 USDC 给作者,约 10 分钟后过期,附一个一次性的随机编号。签名连同这些参数打包、编码后,放进 X-PAYMENT 请求头,发出第二次请求。

服务器收到后,先把付款信息交给 facilitator(支付服务方)验证,验过再请它结算。链上记录显示,这笔交易由 facilitator 的地址发起,gas 也由它支付,约 0.00000065 ETH。测试钱包没花 ETH,USDC 余额从 0.10 变成 0.09。

结算成功后,服务器返回 200 和 Markdown 正文。交易日志里的 USDC 转账是从测试钱包直接到作者钱包,平台账户不经手。服务器日志节选:

{"event":"paid_access","slug":"atvh","price":"0.01","outcome":"paid","status":200,"format":"md"}

付款之外的四件事:找、报、验、交

找。 人看页面上的价格标签,程序更适合读结构化数据。我们在付费文章和书的页面 JSON-LD 里标明内容收费,用 Offer 写清价格、币种和 .md 购买入口;网站写给 AI 读的说明文件 llms.txt 也加了一节,讲怎么用 x402 购买。原先那里有一句「不要访问付款接口」,现在去掉了。需要说明的是,这次测试程序是直接请求购买地址的,agent 能不能靠这些信息自己找上门,还要等真实流量来验证。

报。 402 返回的付款要求里,金额、链、币种合约、收款地址都要准确。程序照着报价构造授权,服务器收到后再核对一遍是否和报价一致。报价里的收款地址一旦错了,程序就可能签出一份付错对象的授权,所以收款地址只用作者在平台登记的钱包。

验。 这一步要分清两件事:签名有效,只说明授权成立,不说明钱已经到账。

  • 第一次购买,必须等结算成功才交货。

  • 同一个钱包复读同一篇文章,我们不再收费。服务器先验证这份付款授权确实出自这个钱包,再查这个钱包有没有买过这篇;买过就直接返回正文,跳过结算。

这里有一个实现上的取舍:复读时,程序签的仍然是一份真实有效的转账授权,只是服务器选择不去结算它。这次实测,同一钱包又读了两次,日志都记为 repeat_payer,余额一直是 0.09 USDC。

我们自己就在这一步踩过坑:早期代码只把付款头解码,取出里面写的钱包地址,发现这个地址付过款就放行,并不验证签名。可链上地址是公开的,伪造一个付款头,填上别人的地址,就能白读。这个问题已经修复,现在先验签,再查购买记录。这次实测,我们冒用刚付过款的那个钱包地址,换一把钥匙签名,服务器返回 402,理由是 invalid_exact_evm_signature,日志记为 rejected。

交。 原来付款成功后,文章返回的是整页 HTML,程序得自己从导航、推荐和脚本里把正文抠出来;书更麻烦:付款后的响应只有一段浏览器跳转脚本,获取正文还依赖浏览器会话。现在请求 .md,或者带上 Accept: text/markdown,文章返回干净的 Markdown,链接和图片都换成完整网址;书则按章节顺序给出全文。

测试漏掉了没设收款钱包的免费帖

第一版上线后,我们自己一请求免费帖的 Markdown,返回的是 422。原因是代码先检查作者有没有设收款钱包,再判断帖子收不收费。当时站上有 34,449 篇免费帖的作者没设收款钱包,这些帖子的 Markdown 入口都被错误拦下。测试数据里的作者都设了钱包,所以测试一直是绿的。

修法是调换顺序:钱包只用来收款,所以只对收费帖要求它。当晚已经修复上线。

如果你也想接 agent 支付

  • 先把交付做好。 付款可以复用现成组件,交付还要接上平台自己的内容结构和权限。正文要能直接拿到,不能依赖脚本执行和浏览器会话。

  • 首次购买看结算,复读看购买记录。 付款头里自报的地址,不能作为解锁依据。

  • 每笔请求都留一行日志。 谁来问价、谁付了钱、谁被拒、用的是什么客户端。这些记录能帮我们排查失败,也能看到真实的购买需求。

接下来,我们会记录实际成交的内容、价格和请求失败的原因,攒够样本再来分享。

本文首发于 Pickful。

#x402 #AIAgent #稳定币