搞了十几年支付集成,又扎进AI Agent开发,这两年我最深的感受是:AI Agent支付这事儿,压根儿不是"写个接口调一下"那么简单。客户觉得理所当然,老板觉得一周上线,只有一线干活的人知道,Agent每往前走一步,脚底下踩的都是过去十几年支付行业一层层堆出来的协议遗产。
这篇文章我就把这七套协议捋一遍。从最早的HTML表单跳转,到签名验签,到聚合支付,再到移动端渠道分裂,然后进入Function Calling、MCP这类属于Agent的时代协议,最后聊聊现在还没定型的A2A和Agent原生结算。你会发现一个很有意思的规律:支付行业的每一次跃迁,本质上都是"协议"的升级——协议先变,产品形态跟着变,最后才轮到商业模式的翻新。今天Agent支付之所以看着别扭,不是因为大模型不够聪明,而是七套协议还没完全咬合在一起。
1. 第一套协议:HTML表单时代的支付网关原始契约
先说最老的这套。2008年前后做电商支付,哪有什么SDK可用,支付宝给商户的对接方式就一个:你拼一个HTML表单,把订单号、金额、商品名塞进隐藏字段,然后让用户的浏览器POST跳转到支付宝的支付页面。用户付完钱,支付宝再通过浏览器GET跳回你的return_url,同时悄悄往你的服务器发一个notify_url通知。
这套机制在今天看来简陋,但在当时它就是一份完整的"协议"——不要以为协议非得是TCP/IP那种二进制握手,支付行业里,双方约定的报文格式、请求时序、回调机制、错误码定义,全部属于协议范畴。这份"HTML表单协议"虽然设计简单,却定下了支付对接的三大地基:
第一,支付流程永远是异步的。用户付款成功那一刻,你的服务器并不知道,必须靠支付平台主动回调通知你。这个"异步回调"模型一直沿用到现在,AI Agent支付也逃不开。
第二,所有关键参数必须冗余传递。商户订单号、金额这些字段,在发起请求时传一遍,回调时平台再原样返回一遍,商户必须比对两次结果是否一致。这套"对账思维"是所有支付系统的安全底线。
第三,页面跳转和服务器通知是两条独立的通道。return_url可能丢、可能被用户中途关掉,但notify_url只要服务器不宕机就一定能收到。所以正规接入永远以服务器异步通知为准,页面跳转只负责展示结果。
当年踩坑最多的地方就是有人只接了return_url,没接notify_url,结果用户付了钱订单状态不变。这套协议教育了一整代支付开发者:前端结果可以美化,后端确认必须有。
2. 第二套协议:签名、密钥与回调验签的信任体系
HTML表单协议有一个致命问题:请求是明文裸奔的。任何人只要抓个包,把金额字段从100改成1,自己就能伪造一笔支付请求。所以支付行业很快就进化出了第二套协议——签名与验签机制。
这套机制的核心逻辑并不复杂。商户有一把私钥,发起请求前把所有参数按字典序拼接,加上密钥算出一个签名值(早期是MD5,后来是RSA、HMAC-SHA256),随请求一起发出去。支付平台收到后用商户的公钥验签,如果参数被人动过哪怕一个字节,签名就对不上,直接拒绝。
我在文章开头列过那个热搜词——"微信支付 提示用户态签名signature错误"。这个词简直是支付开发者共同的记忆伤疤。我可以负责任地说,做支付签名踩坑,每个人至少经历一轮以下全部流程:参数没按ASCII码排序,验签时多了个空值字段,签名字符串里的&符号被HTML转义了,密钥被复制粘贴悄悄多了一个换行符,或者回调里收到的签名值被URL解码了两次。这些坑每一个都让人抓狂,而且错误信息永远只给你一行"signature error"。
真正理解这套协议的价值,你得明白三件事:
- 签名不是为了"加密",而是为了"防篡改"和"防伪造"。支付数据本身是可以在网络上被看到的,但签名保证它不能被改。密钥不跟着请求走,永远只存在服务器端。
- 验签的关键在于"时序"和"数据完整性"双重校验。拿到回调通知后,先验签,再查订单是否存在,再比对金额是否一致,最后确认这个回调是不是重复通知。顺序不能乱,跳过任何一步都是漏洞。
- 商户侧必须自己实现"幂等"。同一个支付成功通知,支付平台会按一定时间间隔重发好几次(比如2小时内的多次重试),你的回调接口如果不做去重,就会出现一笔订单被重复标记为已支付的问题。
这套签名协议从2009年左右开始普及,到现在仍是所有正规支付渠道的安全底座。AI Agent调用支付工具的时候,签名逻辑本身不会消失,只是从"用户浏览器里的表单"挪到了"Agent背后的API调用"里。
3. 第三套协议:聚合支付网关的通道治理
时间推到2015年前后。市面上出现了微信支付、支付宝、银联、各种银行网关,商户要接入的渠道越来越多。每家的报文格式不一样,签名算法不一样,退款规则不一样,对账文件格式更不一样。你要是同时做电商、做App、做线下扫码,光维护渠道适配层就能拖垮一个小团队。
于是第三套协议应运而生——聚合支付网关。你只对接一个网关,网关背后再去对接所有支付渠道。这类产品有第四方支付平台(比如易支付、PayJS这类,热词里提到的"易支付进件插件"就是做这个的),也有自建的支付中台(热词里提到的"支付网关设计文档PRD"就是这个方向)。
聚合网关的核心价值不在于"转发",而在于通道治理,具体体现在三层:
- 统一协议层:商户侧只需要学会网关的一套API规范,包括统一的签名方式、统一的报文结构、统一的回调格式。渠道差异被完全隔离在网关内部。
- 路由与容灾层:网关可以根据渠道的可用率、费率、风控规则动态选择走哪个通道。比如微信支付突然大面积回调延迟,网关自动把流量切到支付宝或银联通道,商户端无感知。
- 结算与对账层:网关把各渠道的对账文件拉下来,统一格式后推给商户,甚至直接生成财务报表。
我在实际项目中体会最深的是"进件"这个环节。所谓进件,就是帮商户把资料提交给上游支付渠道完成准入审核。这块以前全是人工操作——填表、盖章、拍照、等审核。后来出现了一批"进件插件"和API,把整个流程自动化:资料标准化收集、自动提交、状态跟踪、异常重试,全部通过接口完成。这个"进件"流程对Agent支付的意义极其深远,因为Agent要成为一个"法人实体"去接入支付网络时,同样需要一套自动化的身份注册与准入机制——聚合网关的进件自动化,就是Agent支付身份体系的第一块拼图。
4. 第四套协议:移动端渠道分裂的JSAPI、小程序与沙箱
移动互联网把支付协议体系撕开了口子。同样是微信支付,PC网站用的是Native扫码,公众号里用的是JSAPI,小程序里有专用的wx.requestPayment,App里又是APP支付,H5页面还有独立的H5支付。每个场景对应不同的调起方式、不同的参数要求、不同的签名规则,甚至不同的开放平台账号体系。
热词里有两个搜索特别能说明问题:"微信小程序支付开发文档"和"微信小程序可以加入支付宝支付渠道吗,如何设计"。这两个问题背后就是渠道分裂带来的真实痛点。小程序支付逻辑上并不复杂——先通过wx.login拿到code,后端换openid,再用openid和订单号调统一下单接口,拿到paySign后返回前端调起支付。但它跟"普通网站支付"完全是两套流程,你没法把PC端的Native支付代码直接挪到小程序里用。
支付宝那边也一样,但至少支付宝提供了一个非常有价值的东西——沙箱环境。"支付宝沙箱支付"这个热搜词说明大量开发者在学习阶段都靠它练手。沙箱环境模拟了真实支付的全部流程:下单、跳转、支付、回调、退款、对账,全是假数据,但流程和真环境完全一致。这对Agent支付的发展来说是至关重要的基础设施。你在沙箱里把支付流程跑通了,Agent的支付能力基本就成形了,剩下的只是换个正式环境API Key的问题。
我的建议是,做任何支付网关设计时,沙箱机制必须是一等公民,而不是上线的附属品。没有沙箱,你根本不敢让Agent去做任何自动化的支付联调测试,因为Agent可能一天触发几十笔真实验证请求。
这一阶段还有一个重要变化:移动端支付让"异步回调"变得越发不可依赖。用户可能在微信内置浏览器里切走,可能小程序直接退出,return_url几乎必丢。所以支付后端设计必须接受一个现实——前端结果显示只是装饰,后端可靠对账才是王道。Agent时代也一样,Agent不能依赖"支付完成页"来判断结果,必须轮询订单状态或依赖服务器回调。
5. 第五套协议:Function Calling与Agent支付的真正起点
上面四套协议,本质上都是"人在用支付系统"。从这套协议开始,事情变了——机器开始直接跟支付系统对话。
2023年GPT-4带火了Function Calling(函数调用,后来各家大模型也叫Tool Use / Tool Calling),它的设计极其优雅:你把一个函数的名称、功能描述、参数结构(JSON Schema格式)喂给模型,模型在对话过程中自己判断"当前需要调用哪个函数",然后生成一坨符合格式的JSON参数,由你的代码去真正执行函数,再把执行结果返回给模型继续推理。
支付接口天然就是Function Calling的完美实验场,因为它有极其明确的输入输出:下单需要订单号、金额、商品描述,输出就是支付链接或支付凭证;查单需要订单号,输出就是订单状态;退款需要订单号、退款金额、退款原因,输出就是退款受理结果。这些东西结构化程度极高,模型几乎不会搞错参数类型。
我在给Agent接支付功能时,第一次感受到代际差异是这种体验:以前做支付,要写一个PC页面让用户填表单;现在做Agent支付,你只要写一个tool定义,然后对Agent说一句"帮用户下单购买这个商品"——它就自己组装参数、自己调用Function、自己根据返回值决定下一步动作。"人填表单"到"Agent填参数"的距离,就是这场支付变革的最小单位。
但这里有一个程序员用血泪换来的忠告:Function Calling的"调用"不等于"支付成功"。Agent调用下单接口拿到了支付链接,不代表用户付了钱;Agent调用退款接口拿到了"受理成功",不代表钱真的回到用户账户。AI Agent特别容易把"请求成功"误判为"业务完成"。所以Agent侧的支付状态机必须设计得非常清晰:已创建、待支付、已支付、已关闭、已退款、退款中,Agent必须严格根据状态机流转来决策,绝不能看一次返回就下结论说"支付已完成"。
另一个关键问题是幂等性。Agent可能因为超时重试同一个下单请求两次,如果系统生成了两笔订单,那用户就被扣了双份钱。解决方式很简单:Agent每次调用支付下单时,必须传入一个业务侧生成的唯一幂等键(比如Agent的任务ID),服务端按幂等键去重。这个原则在第五套协议阶段是"最佳实践",到第七套协议阶段就变成"必须遵守的底线"了。
6. 第六套协议:MCP与Agent工具生态的标准化
Function Calling解决了"单个Agent怎么调单个工具"的问题,但很快暴露出一个麻烦事:每个Agent框架(LangChain、Semantic Kernel、Spring AI、自研框架)对工具的定义方式都不一样,支付网关接入A家的Agent要写一套MCP适配,接入B家的又要重写一套。这不就是2015年支付渠道分裂在Agent世界的翻版吗?
于是MCP(Model Context Protocol,模型上下文协议)出现了。热词里有一条搜索特别有意思:"mcp 是软件协议 硬件协议那个概念叫什么来着"——这个问题其实暴露了不少开发者对协议谱系的困惑。MCP是标准的软件协议,它解决的不是"数据怎么在物理链路上传输"(那是UART、Modbus、CAN这类硬件/工业协议干的事),而是"不同软件实体之间怎么描述能力、怎么交换请求与响应"。
MCP的架构分三层:Host(宿主程序,比如一个AI Agent应用)、Client(宿主内部持有,负责跟Server通信)、Server(把工具能力包装成标准化服务)。你在MCP Server上写一个"订单查询"工具,注册好名字和参数Schema,任何支持MCP的Agent(包括Claude Desktop、各种IDE插件、自研Agent框架)都能在对话中直接调用它,无需针对每个框架定制适配层。
我把"MCP + 支付"拆成三个标准动作:
- Tool层:把下单、查单、关单、退款、对账全部封装成MCP工具。这是最表层的,工作量不大。
- Resource层:把商户的支付配置(渠道列表、费率、账户余额)暴露成可读取的资源。Agent在决策前可以主动查一下自己还有多少可用额度,避免超支。
- Prompt模板层:给Agent提供一套"支付操作规范",告诉它什么情况下应该下单、什么情况下应该先确认用户意图、遇到支付失败应该怎么提问。
MCP对Agent支付的贡献是"标准化"——它让支付能力变成一种可插拔的基础设施。同一个支付网关,今天给电商Agent用,明天给运维Agent用(你完全可以让一个Agent自动去续费云服务器并完成支付),后天给一个"自动采购Agent"用,全部走同一套MCP协议,不用改一行支付侧代码。这也是为什么Spring AI、LangChain这些框架现在都在疯狂集成MCP——工具生态的标准化,远比单个模型的智商重要。
7. 第七套协议:A2A与Agent自主结算的原生支付网络
最后一层是现在进行时。MCP解决了Agent怎么用工具,但还没回答一个根本问题:当两个Agent互相协作时,Agent A给Agent B提供了服务,怎么结算?谁来发起支付?谁来确认履约?用的是哪套身份体系?信任怎么建立?这套规则业内现在还没有一个统一定论,但方向已经明确了——它肯定不是"让Agent去调用微信支付接口给人类付款"那么简单。
目前各路人马在推的A2A(Agent-to-Agent)协议,本质上是在设计一套"机器社会"的交易规则。相比前六套协议,它有全新问题需要解决:
身份问题:Agent不是人,没有身份证,也没有营业执照。它要怎么在支付网络里开户?是绑定一个主人的身份(Human-Agent委托模式),还是拥有独立的数字身份?目前更现实的做法是前者——Agent背后一定有一个可追溯的责任主体,无论是个人还是企业。但长期看,随着合规体系完善,会慢慢出现"数字分身"或"法人Agent"的身份形态。
授权与额度治理:Agent自动支付最大的风险不是技术,而是失控。所以Agent的支付权限必须是额度化的、场景化的、可撤销的。我在实战中习惯的做法是给Agent单独开一张"虚拟额度卡":单笔上限、单日累计上限、允许的用途白名单、超限必须人工审批。这跟企业内部给员工发一张差旅卡是同一个逻辑。没有这套治理机制,你根本不敢给Agent开真实的支付权限。
履约与争议仲裁:两个Agent之间产生交易纠纷,谁来当裁判?A说服务交付了,B说没收到。这套"机器仲裁机制"目前几乎还是空白。可行的渐进路线是先做"规则型仲裁"——把交付的关键节点通过API自动校验,节点验收通过即视为履约;复杂争议再升级到人工处理。
宏观账本与微观支付的分工:我的一个判断是,Agent之间的高频小额结算(比如每次API调用0.001元)如果走传统支付渠道,手续费会吃掉所有利润。所以未来会出现一个"结算层"设计——微观交易先在Agent网络内部记账,按日/按周生成账单,通过传统支付渠道做一次性的净额结算。这跟银行间清算的逻辑一模一样,只不过记账的主体从银行换成了Agent网络。
现状坦白讲,第七套协议还处在一个"百花齐放、一地鸡毛"的阶段。各家公司都在推自己的Agent互联协议,都想当"机器支付标准的制定者"。不像支付行业早期,HTML表单协议是事实标准,签名验签是行业公认的安全底线,到了A2A这里,连"消息该长什么样"都还没达成统一。
我个人的倾向是:短期内别押注任何单一标准,把前六套协议吃透、做好适配层,这永远不会浪费。因为无论A2A最后长成什么样,它一定是站在前面几套协议的肩上——需要签名验签保证安全,需要聚合网关做通道治理,需要Function Calling让模型学会调用工具,需要MCP把工具标准化,然后才轮到Agent之间互相协商、自动结算的那一天。协议这东西,从来不是设计出来的,是一层一层堆出来、被市场用脚投票选出来的。