你的代理帮你安排了一件线下小事:请附近一个你认识且信任的人,去门口拍张照确认快递送到,报酬3欧元。对方说做完了,钱得有人付。
![]()
你大概不想让代理替你保管资金,也不想每次手动输入地址和金额。开源示例 agent-hires-local-helper 给出的是一条中间路线:代理准备付款,你在自己的钱包里签名。
夹在中间的是 send21(面向人和AI代理的加密支付链接与API)。它负责创建付款草稿,不持有私钥、不签名、不广播。代理的密钥可以创建和读取草稿,但没有任何密钥能移动资金。
流程怎么走
先是一张任务卡:任务内容、地点、约定金额,以及以四位一组呈现的帮手收款地址。这个地址是对方此前给过一次的,存在 helper.json 里,代理从那里读取,改不了。
任务完成后,代理做两项MCP检查并生成一份草稿:通过 send21 的 MCP 服务器核对地址规则,再用同一把限定范围的密钥,通过 REST API 创建付款草稿。
接着由所有者复核。你能看到金额、二维码、完整地址、它是否与保存的地址一致,以及代理做过什么的平实清单。只有一个按钮:打开付款,在你的钱包里签名。
最后是已付款状态,依据签名过的 draft.confirmed webhook,或草稿状态变为 Confirmed。
为什么是草稿,不是支付链接
send21 有两个构件。支付链接是请求别人付钱给你,它要求使用所有者本人已批准的收款地址;草稿则可以付给任何已批准的地址。帮手的地址不是你的,所以付给它要用草稿。
这在默认账户上同样成立——收款地址策略为 ApprovedOnly,前提是你已经批准了帮手的地址。
代码里,代理先调 get_account_status 拿到 receivingAddressPolicy,再查地址簿,比对地址与网络,看是否有 verifiedAt。若策略是 ApprovedOnly 且地址未获批准,代理会停下并告知所有者,什么都不创建——因为代理无权批准地址。
创建草稿走 POST /drafts,而不是 MCP 的 create_draft 工具,原因是 singleOutput: true 让它成为任何钱包都能扫的一个二维码付款,send21 的费用记在账户上;create_draft 会把费用放进单独的输出,适合批量钱包。
幂等键是值得抄走的部分
用任务id做 Idempotency-Key,是这套示例里最该复制到任何代理里的设计。代理会重试:webhook 触发两次、消息被重复处理、有人按了两次“完成”。同一个键,send21 返回原来的草稿而不是再建一份;同一个键配上不同的收款方、金额、币种或网络,则会被拒绝。
运行 npm run agent 能看到效果:问两次,拿回同一个草稿id。草稿没有 orderId 或 reuseOpenForOrder,那两个只属于支付链接,所以任务id放在键和备注里。
法币价格锁定15分钟。若锁定在草稿仍有效期内到期,代理会重新报价(POST /drafts/{id}/requote),而不是另建一份。
发送前还会检查资产与网络:USDT 只在 Solana 或 Ethereum 上,USDC 例如在 Solana、Polygon 或 Arbitrum 上。示例运行用的是 Solana 上的 USDT。
草稿创建后,示例会逐字符比对草稿的 receiverAddress 与保存的地址。只有你在 send21 地址簿里验证过的条目才显示为预先批准,否则界面写的是“与你保存的帮手地址一致”。
webhook 怎么验
任务在服务端被标记为已付款,依据是签名过的 webhook,绝不来自浏览器。先验签名:取 X-Send21-Signature-V2 里的时间戳与签名,时间戳与当前时间相差超过300秒即拒绝,再用 HMAC-SHA256 计算期望值并做定时安全比较。
签名有效还不够,付款必须是这个任务的付款:检查 delivery 是否已处理过(重试会复用 X-Send21-Delivery),事件是否为 draft.confirmed,draftId、币种、网络、以基础单位计的金额是否与草稿一致。草稿靠 draftId 匹配,因为 orderId 只为支付链接付款设置。未签名的投递返回401。
想不付钱就看到已付款界面,npm run local-paid 会用本地密钥签一条测试投递并发送两次(第二次按已处理忽略),界面标注“本地测试 webhook”,不会被误认为真实付款。
它不做什么
没人检查工作成果。“完成”只意味着有人按了任务完成。send21 不在中间保管资金,也不判断结果,这套东西适用于你认识并信任的帮手。
它也不负责找帮手。人是你带来的,地址也是你带来的。
新账户的地址规则要注意:API 密钥只能使用所有者在 send21 应用里用通行密钥或验证器码批准过的地址,帮手的地址不在其中,代理就会停下。先批准帮手的地址。示例测试跑在一个允许内联地址的账户上,所以界面显示的是“与你保存的帮手地址一致”。
它还是个演示:内存里一个任务,没有数据库,webhook 需要公网 HTTPS 端点。账户密钥使用真实网络,草稿在有人签名前不移动任何资金;建议先用自己的地址小额测试并取消草稿(npm run agent -- --cancel),测试网演示在浏览器里运行,无需账户。
最后,地址仍要在钱包里核对。复核界面有帮助,但钱包的确认屏才是最终依据,钓鱼或伪造的链接依然是风险。
想跑起来:克隆 send21-examples 仓库,进入 examples/agent-hires-local-helper,安装依赖,npm test 无需密钥和网络,从 send21.io/api-keys 取限定范围的密钥填入 .env,npm start 起在本地3022端口,npm run agent 在终端里跑一遍代理流程。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.