跳转到主内容

代理付款

软件代理正在参与购物。用户可以要求助手购买门票,由助手决定具体的购买步骤。 传统支付 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 仍然有用 早期的失败 在您自己的代码, 但它不再是 东西站在一个伪造的车 和收费。

三次检查都按部就班,每一次都拒绝在用完之前:

  1. 指示书本身——未过期、未撤销、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完、未用完
    • 你的伴侣,如果它被限制在一个范围内;
  2. 任务,如果你发送一个;
  3. 组织本身的限度,即普通的平台限度:终端的最小限度和 每日、每周和 每月金额。代理支付途径他们自己的终端,所以这些适用于他们和 没有别的了。

权利在结算时消耗,在与分类账变动相同的数据库交易中。 因路由、限制或反欺诈而拒绝付款,使持单人没有任何损失:许可 给的不是用于别人的拒绝。

超过终端或反欺诈限额的付款被拒付 平时... 201 Created 与 "status": "rejected" 因为到那时交易就已经存在了。 读取 status和其他地方一样

一项值得规划的后果是:权利被消耗在实际留下的金额上 工具,而不是你寄出的金额。当组织的终端加收其费用时。 顶端 购买,这是两个不同的数字, 和一个收费 匹配在信物内 在创建 超过时仍可拒绝时间和解 。 询问您的操作员收费方式 在您请求的符号大小之前配置 。

拒绝在交易存在之前到达,因此——与路由故障不同—— HTTP 状态告诉 实话实说吧:

状态体质 error含义
403module_not_active该组织没有启动代理商业
404delegated_token_invalid没有这样的标志
409spent, expired, revoked这项权利已经存在,不再适用
422amount_exceeds_scope, currency_mismatch, partner_mismatch这笔费用不在批准范围之内
422human_confirmation_required该组织要求一个人在场,而授权则另有规定。
422instrument_inactive, instrument_currency_mismatch右后方的卡片或账户无法支付
422instrument_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 归档 跑到沙盒那边去