代理付款
软件代理正在参与购物。用户可以要求助手购买门票,由助手决定具体的购买步骤。 传统支付 API 通常依赖用户在场并点击确认;代理支付需要明确工具访问、授权和结账流程。 以下四种协议分别解决不同的问题。
| 协议 | 解决的问题 | 应用位置 |
|---|---|---|
| MCP | 代理如何访问支付工具? | 代理与业务系统之间 |
| AP2 | 如何证明用户授权了支付? | 请求中的已签署授权凭证 |
| ACP | 如何在其他平台的聊天中完成结账? | 购物平台与商户端点之间 |
| A2A | 一个代理如何委托另一个代理? | 代理之间 |
这些协议可以组合使用:ACP 结账流程可以携带 AP2 授权凭证, A2A 任务可以委托另一个代理发起结账。 SDK 提供这四种协议的商户侧实现。
MCP 给经纪人你的付账台
月台载人 MCP 用于商家的服务器。它不在公共注册簿上,所以它安装了 从其存储器中:
npm install -g --install-links "git+ssh://git@git.gaml.store/heth_project/4pay-payments-mcp.git"
--install-links 不是可选的:没有它 npm 将自身在全局期间的临时克隆链接起来
安装然后删除, 留下一个断裂的符号链接和一个欢乐 added N packages.
// .mcp.json
{
"mcpServers": {
"fourpay": {
"command": "4pay-payments-mcp",
"env": {
"FOURPAY_API_URL": "https://sandbox.4pay.online",
"FOURPAY_API_KEY": "${FOURPAY_API_KEY}",
"FOURPAY_ORGANIZATION_ID": "${FOURPAY_ORGANIZATION_ID}",
"FOURPAY_ENV": "test"
}
}
}
}
十个工具: create_payment, create_payout, get_payment, list_payments, refund_payment,
cancel_payment, create_payment_link, list_payment_links, list_saved_cards,
generate_order_id.
有第二个 MCP 服务器, @4pay.online/mcp-server给那些 运行 该平台 :
终端、线路规则、限制、 FX。这是一个不同的程序,而不是模式。
拥有路由工具的代理商迟早会尝试"固定"的直播路由,同时
无法及时可靠地防止这种情况;
名单里写着 商人得到的 @4pay.online/payments-mcp.
** 一个服务器,一个环境。** env 这不是一个工具参数——一个可以选择它可以
被说服选择错误。如果两者兼有需要,请运行第二个服务器。
无 MCP
代理人不需要协议即可接受付款。 SDK 输出业务与 任何模型的函数调用定义:
import { paymentTools, executePaymentTool } from "@4pay/sdk/agentic";
const policy = {
env: "test",
currency: "EUR",
maxAmount: "50000", // 500.00 — enforced here, not in the prompt
allowRefunds: false, // refunds move money outwards; that is a human's decision
};
const tools = paymentTools(policy); // hand these to the model
const result = await executePaymentTool(pay, policy, name, args); // run what it picks
量是小单位字符串,在到达平台前拒绝小数:模型是
流利,不准确,和 40.00 不是一个可以让一个人计算的数字。
AP2 - 证明人类同意
An AP2 授权是一份签名的声明,说明 其中有两件对商人很重要:
- an 意图授权 - 长期许可,用户在场时签名:* 购买这些许可 门票如果跌到下面 120 EUR*;
- a 任务 - 一个签名的,逐项的手推车: 这个商人,这些线,这个总数,直到这个为止 即刻。
充电前验证 :
import { ap2 } from "@4pay/sdk/agentic";
const cart = ap2.verifyCartMandate(jws, { keys: issuerKeys, merchantId: "merchant-1" });
ap2.assertWithinIntent(cart, intent); // did the human ever allow a purchase like this?
const transaction = await pay.createPayment(
ap2.cartMandateToPayment(cart, { env: "prod", jws, modality: "human_absent" }),
);
verifyCartMandate 请检查date=中的日期值 (帮助)
过期——以及 ** 总和等于其行总和**最后一个抓住了攻击
无人期待:一辆三件东西的推车 300 备注a total of 1。两者都签名;只有一个是
没错
任务随后随即前往 merchant_meta.ap2,所以它背后的权威会留下
随附在报告和争端中。
月台确实如此 ** 没有** 向卡片网络发送支付授权 AP2 证书——没有铁路 如果一个方案开始需要它,那就是平台的改变,而不是 SDK 变化。
委托代币——让代理人实际支付
核查一项授权证明人类是同意的。 需要用 * 来付钱, 并给它一个卡号 将击败这一点。
A 授权代号 组织是针对自己的一个 工具——钱包、开具的账户、开具的卡片——而代理人收到的不是 证明但有一套限制: 用这种货币,在这个商人身上,不超过这个数额, 直到此刻, 多次* 。 乐器从未在符号中命名, 也不能是 。 从它恢复过来。
你像其他支付方法一样收取费用:
POST /api/v1/transactions
{
"params": {
"type": "payment",
"amount": "12000",
"currency": "EUR",
"txid": "order-12345",
"env": "prod",
"money_storage": {
"type": "delegated_token",
"token": "dpt_…",
"mandate": "eyJhbGciOiJFUzI1NiIs…"
}
}
}
mandate 是 Cart 任务 JWS (a) 具有可选性质——一个组织可签发授权代币。
其本身的条件,没有 AP2 当它出现时, 平台验证它 服务器侧
收费前:指代该组织的注册发行人钥匙的签名,即商家。
改为:其终止时,合计数等于行数之和。 SDK's
verifyCartMandate 仍然有用 早期的失败 在您自己的代码, 但它不再是
东西站在一个伪造的车 和收费。
三次检查都按部就班,每一次都拒绝在用完之前:
- 指示书本身——未过期、未撤销、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完
- 你的伴侣,如果它被限制在一个范围内;
- 任务,如果你发送一个;
- 组织本身的限度,即普通的平台限度:终端的最小限度和 每日、每周和 每月金额。代理支付途径他们自己的终端,所以这些适用于他们和 没有别的了。
权利在结算时消耗,在与分类账变动相同的数据库交易中。 因路由、限制或反欺诈而拒绝付款,使持单人没有任何损失:许可 给的不是用于别人的拒绝。
超过终端或反欺诈限额的付款被拒付
平时... 201 Created 与 "status": "rejected" 因为到那时交易就已经存在了。
读取 status和其他地方一样
一项值得规划的后果是:权利被消耗在实际留下的金额上 工具,而不是你寄出的金额。当组织的终端加收其费用时。 顶端 购买,这是两个不同的数字, 和一个收费 匹配在信物内 在创建 超过时仍可拒绝时间和解 。 询问您的操作员收费方式 在您请求的符号大小之前配置 。
拒绝在交易存在之前到达,因此——与路由故障不同—— HTTP 状态告诉 实话实说吧:
| 状态 | 体质 error | 含义 |
|---|---|---|
403 | module_not_active | 该组织没有启动代理商业 |
404 | delegated_token_invalid | 没有这样的标志 |
409 | spent, expired, revoked | 这项权利已经存在,不再适用 |
422 | amount_exceeds_scope, currency_mismatch, partner_mismatch | 这笔费用不在批准范围之内 |
422 | human_confirmation_required | 该组织要求一个人在场,而授权则另有规定。 |
422 | instrument_inactive, instrument_currency_mismatch | 右后方的卡片或账户无法支付 |
422 | instrument_not_owned | 其持有人不拥有的票据的正确名称 |
记录发起人的交易 一个人 人类在场的代理人 或代理人单独行事,与代理人及其授权一起行事。 平台,从未从请求中取出: 对信任呼叫者的代理付款的限制 自己说自己是特工 只会限制诚实的人
委托书由组织而不是由你签发,在反对他们之前,确认 代理商开机 与你整合的组织 和终端 已存在用于您打算收费的工具—— 钱包、 账户和卡片被路由 单独, 和每个需要自己的。
ACP ——在别人的聊天中进行销售.
与 ACP买家从未到达你的现场 代理商 阅读产品饲料,造车,结算航运和税收,然后支付。
月台为您主持谈话。 您发布产品;平台服务于种子和 保存退出状态 :
GET /api/v1/acp/feed what you sell
POST /api/v1/acp/checkout_sessions start a checkout
GET /api/v1/acp/checkout_sessions/:id where it stands
POST /api/v1/acp/checkout_sessions/:id change the cart or the buyer
POST /api/v1/acp/checkout_sessions/:id/cancel abandon it
代理平台调用这些 ưμ㼯A API 钥匙,卖主就是钥匙的主人
- 从来没有一个政党的名字在体内。
平台价格是推车,不是代理
代理发送SKU和数量,它们的成本来自你的饲料,在每一个请求中, 包括更改后的重新编号,这不是礼貌——这是替换的唯一地点。 可见: a AP2 以代理人提供的价格签署的授权是完全有效的,因为 发行人签了它交给的
只有你出版的产品才会出现 只有它们才能买到 feed_enabled 默认为
关闭:目录行不是商店窗口,除非你说。
幂等性
发送 Idempotency-Key 关于会话创建。 代理在超时重试—— 这是正常的协议 。
—— 重复返回同一会话而不是第二个顺序。
已签名的请求
如果代理平台对请求签名,请发送 x-agent-signature(对以下内容的签名进行 base64 编码:
生体)和 x-agent-key-id。该密钥将对照持有该密钥的同一信托登记册进行核查。
ưμ㼯A AP2 发行者密钥,算法来自注册,而不是请求.
签名是可选的—— API 密钥是主要证书,但签名不验证
拒绝使用 401。经检查的签名如果可能是错误的,将比没有更糟糕。
回来的是什么
届会载有: status (not_ready_for_payment → ready_for_payment → completed, or
canceled),计价项目,总额,以及 messages - 协议一级对什么是
(b) 缺少或无法提供,拟逐字向买方显示。
付款本身是平台上的普通交易:授权代币、付款链接或 已保存的卡片。 没有第二个货币路径 ACP 这是故意的——收费和分类账是 准确计算在一个地方。
顺序更新
过 order_update_url 创建会话时( 只有https), 平台会张贴命令事件
返回代理平台,提供与其他 Webhook 相同的交货担保: 使用
返回和死字队列。关于你命令的命运,任何问题都不要取决于该平台的存在
钱一动就能拿到
ACP委托付款流可以由代理商将买方的单用途代币薄制成 拥有支付提供者。 平台今天不接受第三方金库代币 。 它接受什么 is a ** 它自己发行的代币** ——见上文——它涉及在座者在座者在座者在座者在座者在座者完成 组织已经持有的文书。
A2A ——一个代理人雇佣另一个.
A2A 是代理对代理的工作任务: 您的代理发布一张卡片 说出它能做什么,另一个则送它一个任务,和投票,直到它完成。 金钱本身——它载有 * 要求 *。
import { a2a } from "@4pay/sdk/agentic";
const agent = new a2a.A2APaymentAgent({
client: pay,
env: "prod",
url: "https://agent.example/a2a",
maxAmount: "50000", // a ceiling, because whoever has the URL can send tasks
});
app.get("/.well-known/agent-card.json", (_, res) => res.json(agent.agentCard));
app.post("/a2a", async (req, res) => res.json(await agent.handle(req.body)));
三种技能: create_payment, payment_status, refund_payment.
将认证置于其前. An A2A 端点可以被持有它的人达到 URL,以及 它的工具移动金钱。 SDK 执行上限; 其余的是你的经纪人mesh的工作。
横跨四边的规则
** 同上,不是任选的。** 特工们重试 超时 断线 重试
每笔报酬都包含着 txid,并重复它返回原始的相对
超过两次充电。 SDK 使用拖车代号、 退出会话代号或您的命令代号
相应.
** 一个天花板属于代码。** 提示是建议,任何客户类型都是不信任的
最终将尝试的输入。 maxAmount 在请求离开前检查。
退款是默认取消的。 他们把钱往外转移,决定权属于一个人。
charged 是唯一的定居地位。 其他一切——包括状况 SDK 从来没有
代理是乐观的读者;不要让任何人告诉客户。
他们的顺序被设置,因为 HTTP 呼叫成功 。
实例
| 示例 | 协议 |
|---|---|
agent-tools/ | 函数调用, 没有协议 |
acp-merchant/ | ACP 退出结束点 |
a2a-agent/ | A2A 代理卡和 JSON-RPC |
ap2-checkout/ | AP2 任务核查 |
四艘飞船都在里面 SDK 归档 跑到沙盒那边去