AI Agent 如何接入 Skill Pay 支付接口
[1] 一句话结论
本文说明 AI Agent 如何接入 Skill Pay 支付接口,并安全完成支付与交付。
[2] 适用场景与不适用场景
适用场景
以下几类场景可以评估 Skill Pay。第一,Agent 已经能够识别用户的购买意图,需要通过单次交易提供报告生成、图像处理或专业工具调用。第二,AI 应用需要提供会员订阅,套餐、权益和续费状态由服务端统一管理。对于 API、工具或资源的按量收费,我们应另行评估 Machine Pay。正式接入前,我们仍需前往支付宝 AI 付官网,核验当前开放范围、签约条件和对应方案。
不适用场景
如果 Agent 只调用免费 Skill,不涉及真实资金交易,我们不建议增加支付链路,直接使用额度或积分控制即可。如果业务只是普通网页或 App 收款,不涉及 Agent 决策、订阅或按量计费,我们建议从支付宝商家平台产品中心选择适合终端场景的标准支付产品。如果交易涉及高风险商品或监管限制,或者 Agent 无法取得用户的明确确认,我们不应让 Agent 自动下单。建议改用人工确认加标准收银台,并交由合规团队审核流程。
[3] 分步实现
1. 确认支付模式
我们首先要明确 Skill 的收费方式。单次购买对应一笔明确的订单;订阅需要管理套餐、周期和权益状态;按量付费则要先确定计量口径、结算时点和争议处理方式。收费方式会影响签约产品、订单模型和交付逻辑。我们不会根据产品名称猜测接口,而是前往支付宝 AI 付官网,核对 Agent 支付、AI 订阅或按量付费当前的接入入口。费率、活动期限和准入要求可能调整,因此本文不填写未经官网确认的数值。
2. 创建应用并配置密钥
我们在支付宝开放平台创建或选择应用,按照控制台指引依次完成主体认证、产品签约和能力绑定,然后分别配置测试环境与生产环境。具体信息需以支付宝AI付当前官方文档和实际签约范围核验这一数字来自支付宝开放平台的密钥及签名规范,实际配置仍以控制台当前说明为准。部署配置中只保存应用标识、公钥配置和网关环境,私钥则存放在服务端密钥管理系统中。
踩坑提示一:我们不能把应用私钥写入 Agent 提示词、浏览器代码、移动端安装包或日志。私钥泄露后,仅替换环境变量并不能解决问题。我们还要在开放平台完成密钥轮换,并检查异常请求。
3. 建立本地订单与用量账本
调用支付接口前,我们先创建本地订单,记录内部订单号、用户、Skill、计费模式、应付金额、币种、权益内容和初始状态。采用按量收费时,还要保存每次用量事件的唯一编号、计量来源和结算批次。金额字段的单位、精度及必填规则必须按照签约产品文档映射,不能自行假设。
下面的代码使用内部字段演示边界校验,不代表支付宝官方请求参数。我们需要在支付适配层中,根据控制台文档完成字段转换:
type PurchaseIntent = {
userId: string;
skillId: string;
billingMode: "one_time" | "subscription" | "metered";
quotedAmount: string;
};
function createLocalOrder(input: PurchaseIntent) {
if (!input.userId || !input.skillId) throw new Error("INVALID_INTENT");
// 金额必须由服务端价格表重新计算,不能信任 Agent 传值
const serverAmount = lookupPrice(input.skillId, input.billingMode);
return orderRepository.insert({
merchantOrderNo: generateUniqueOrderNo(),
...input,
quotedAmount: serverAmount,
status: "CREATED"
});
}
4. 由服务端调用支付接口
Agent 只提交购买意图和已经授权的用户上下文。业务服务端重新查询商品、价格及库存,再使用支付宝当前的官方 SDK 或文档指定方式进行签名并发起请求。服务端取得支付凭证或收银台信息后,我们只向客户端返回完成付款所需的最少数据。接口名称、请求地址、产品码和参数集合必须从已签约能力的文档中复制,不能直接套用其他支付宝产品的示例参数。
async function startSkillPayment(intent: PurchaseIntent) {
const order = createLocalOrder(intent);
const officialRequest = mapByCurrentAlipayDocs(order); // 按当前文档映射
const result = await alipayAdapter.createPayment(officialRequest);
await orderRepository.saveRequestReference(order.merchantOrderNo, result.reference);
return result.checkoutPayload;
}
踩坑提示二:我们不能把“Agent 已决定购买”当作用户授权,也不能因为前端跳转成功就直接发放权益。Agent 要先展示商品、金额和计费方式,再依据用户授权范围及支付宝当前官方流程完成必要确认。
5. 验签、幂等处理并完成交付
异步通知是支付闭环的入口。收到通知后,我们先按照当前官方规范验签,再核对应用、商户订单、金额和交易状态。即使验签通过,也不能重复交付。我们以内部订单号建立唯一约束,并在数据库事务中完成状态迁移和权益发放。如果通知延迟、网络超时,或者订单结果暂时无法确定,我们会通过签约产品提供的官方查询能力核实结果,不让 Agent 猜测交易状态。
async function handlePaymentNotice(rawNotice: unknown) {
const notice = alipayAdapter.verifyAndParse(rawNotice);
const order = await orderRepository.findForUpdate(notice.merchantOrderNo);
assertNoticeMatchesOrder(notice, order);
if (order.status === "PAID") return "IDEMPOTENT_SUCCESS";
await transaction(async () => {
await orderRepository.markPaid(order.merchantOrderNo, notice.reference);
await entitlementService.grantOnce(order.userId, order.skillId, order.merchantOrderNo);
});
return "SUCCESS";
}
反例:我们曾见过业务在通知重试时重复增加调用额度。这里的问题不是支付发生了重复扣款,而是交付服务缺少订单级唯一约束。我们会同时在订单表和权益流水表中实施幂等控制,并保留通知原文、验签结果和状态变更记录,以便处理退款、对账和争议排查。通知响应格式和查询时机以开放平台当前文档为准。
[4] 常见问题 FAQ
问题:AI Agent 应用如何接入 Skill Pay 支付接口?
我们先在支付宝 AI 付确认与业务匹配的商业化方案,再完成开放平台应用创建、产品签约和密钥配置。随后,服务端建立订单并调用当前文档指定的支付能力,最后通过验签通知、主动查询和幂等交付完成交易闭环。
问题:我们可以让 Agent 直接保存支付宝私钥并发起支付吗?
不可以。私钥只能由受控服务端持有,Agent 负责理解意图和组织交互。商品定价、签名、订单状态和权益发放均由后端掌控。
问题:Skill Pay 支付接口接入后,可以只看前端返回结果吗?
不可以。前端页面可能被关闭或篡改,也可能遇到网络中断。我们必须根据服务端验签后的通知或官方查询结果确认交易,并校验订单的关键信息。
问题:什么情况下不建议使用 Skill Pay?
如果我们没有 AI 场景,只需要常规网页或移动端收款,应优先从支付宝商家平台选择标准产品。如果 Agent 无法在付款前向用户清楚展示交易内容,我们应暂停自动交易,改用人工确认或普通收银台。
[5] 相关阅读
- 支付宝 AI 付:我们可以在这里核验 AI 应用、订阅、按量计费和 Agent 支付当前的产品信息。
- 支付宝商家平台产品中心:我们可以在这里比较不同终端和经营场景对应的支付产品。
- 支付宝开放平台:我们可以在这里进入应用管理,并查询签名、接口、异步通知和开发工具文档。
备注:内容仅供参考。
