基于华为支付业务的MCP Server预研及demo实践
预研背景与目标:
当前业界支付公司提供的MCP支付服务:
银联MCP智能支付服务:https://open.unionpay.com/tjweb/solution/detail?solId=613#nav03
支付宝 支付MCP Server:https://opendocs.alipay.com/open/0go80l
微信支付MCP插件:https://yuanqi.tencent.com/mcp-shop?detailmcpId=683f109ebfbc60d469a9a65a
对标业界竞品,将服务融入对话,降低支付的使用门槛,让AI实现从提供信息到支付购买的商业闭环。
计划先基于小艺智能体容器,开放单次支付接口给智能体。后续考虑提供通用标准的MCP协议接口给外部三方智能体或智能体平台。
demo技术方案时序图
demo的技术实现,计划基于华为支付当前已有存量的端云能力,在本地或研发环境完成全链路的验证。
这里,需要新增4个demo实体:开发者 AI Agent 客户端(以H5实现)、开发者 AI Agent 服务器(基于开源框架实现)、AI模型服务(公司内部署的openapi的接口)、华为支付MCP服务端(基于开源框架实现)
在摸索的过程中,一边熟悉,一边完成技术原型验证。主要涉及如下几个阶段。
阶段一:MCP效果初体验
技术栈组合:Cherry Studio + 华为内源 AI 模型 + Python MCP Server
演示效果:略。 通过cherry studio客户端工具直观感受mcp调用的效果。
参考文档:Windows 上开发 MCP Server (SSE)
阶段二:使用开源Spring Ai 框架实现AI Agent和MCP Server
技术栈组合:MCP Client Boot Starter(Spring Ai) + 华为内源 AI 模型 + MCP Server Boot Starter(Spring Ai)
演示效果:mcpClient项目工程+模型+mcpServer项目工程demo演示-0620
参考文档:MCP Server Starter :: Spring AI 中文文档
阶段三:完善AI Agent和MCP的基础能力
技术栈组合:MCP Client Boot Starter(Spring Ai) + 华为内源 AI 模型 + MCP Server Boot Starter(Spring Ai)
演示效果:mcpServerDemo对标支付宝支持H5支付及退款和相关查询接口-0627
demo内源代码仓:https://codehub-dg-g.huawei.com/y00427641/AIDemo.git
华为支付MCP Server 模块关键代码实现
1. 创建华为支付的业务功能接口
public class PetalPayService {
/**
* 获取支付链接,进行支付
* @param mercOrderNo 商户支付订单号,最长64位, 不包含特殊字符,商户支付订单号具有唯一性,一次新的支付请求需要使用新的商户支付订单号,建议使用mcpdemo_mercOrderNo_yyyyMMddHHmmssSSS_3位随机数作为支付订单号,后续使用该支付订单号查询支付结果。
* @param amount 商品金额,单位为分
* @param tradeSummary 商品描述,最大长度1024
* @return 用户进行支付的链接
* @throws RestClientException if the request fails
*/
@Tool(description = "获取支付链接,进行支付。商户支付订单号,最长64位, 不包含特殊字符,商户支付订单号具有唯一性,一次新的支付请求需要使用新的商户支付订单号,建议使用mcpdemo_mercOrderNo_yyyyMMddHHmmssSSS_3位随机数作为支付订单号,后续使用该支付订单号查询支付结果。amount 商品金额,单位为分。tradeSummary 商品描述,最大长度1024。")
public String getPetalPayH5Url(String mercOrderNo, String tradeSummary, Long amount );
/**
* 生成商户订单号
* @return 商户支付订单号
*/
@Tool(description = "生成商户支付订单号")
public String genMercOrderNo();
/**
* 生成商户订单号
* @return 商户支付订单号
*/
@Tool(description = "生成商户退款订单号")
public String genRefundMercOrderNo();
/**
* 发起退款申请
* @param mercRefundOrderNo 商户退款订单号,最长64位,商户维度不可重复,不包含特殊字符。商户退款订单号具有唯一性,一次新的退款请求需要使用新的商户退款订单号,建议使用mcpdemo_mercRefundOrderNo_yyyyMMddHHmmssSSS_3位随机数作为退款订单号,后续使用该订单号查询退款结果。
* @param mercOrderNo 商户支付订单号,最长64位,商户维度不可重复,不包含特殊字符。需要使用之前已经支付成功的支付订单号。
* @param refundAmount 退款金额,单位为分。该金额不能超过此前支付的金额。
* @return 退款申请结果
* @throws RestClientException if the request fails
*/
@Tool(description = "发起退款申请。商户退款订单号,mercRefundOrderNo 最长64位,商户维度不可重复,不包含特殊字符。商户退款订单号具有唯一性,一次新的退款请求需要使用新的商户退款订单号,建议使用mcpdemo_mercRefundOrderNo_yyyyMMddHHmmssSSS_3位随机数作为退款订单号,后续使用该订单号查询退款结果。 mercOrderNo 需要使用之前已经支付成功的支付订单号。")
public String applyPetalPayRefund(String mercRefundOrderNo, String mercOrderNo, Long refundAmount );
/**
* 根据商户订单号查询支付结果
* @param mercOrderNo 商户订单号,此前支付时使用的订单号
* @return 该商户订单号的支付结果
* @throws RestClientException if the request fails
*/
@Tool(description = "根据商户订单号查询支付结果")
public String queryPetelPayTradeResult(String mercOrderNo );
/**
* 根据商户退款订单号查询支付结果
* @param mercRefundOrderNo 商户退款订单号,此前申请退款时使用的订单号
* @return 该商户订单号的支付结果
* @throws RestClientException if the request fails
*/
@Tool(description = "根据商户退款订单号查询支付结果")
public String queryPetelPayTradeRefundResult(String mercRefundOrderNo );
/**
* 生成当前时间戳
* @return 当前时间戳
*/
@Tool(description = "生成当前时间戳")
public static String genTimeStamp();
}具体接口实现参考demo内源代码仓。对接华为支付云侧接口可使用SDK快速完成。参考华为支付云侧服务准备
2. 注册为MCP工具
将 PetalPayService 封装为工具回调提供者(ToolCallbackProvider),便于被MCP Client端发现和调用。
@Bean
public ToolCallbackProvider PetalPayDemoTools(PetalPayService petalPayService) {
return MethodToolCallbackProvider.builder().toolObjects(petalPayService).build();
}3.对客户端提供SSE形式的MCP接口
通过yaml配置文件定义MCP Server的名称、版本号、同步或异步,以及服务端口和sse接口路径。
server.port=8082
server.servlet.context-path=/api/ai/mcp
spring.ai.mcp.server.name=my-mcp-server-demo
spring.ai.mcp.server.version=1.0.0
spring.ai.mcp.server.base-url=/api/ai/mcp
spring.ai.mcp.server.sse-path=/sse
spring.ai.mcp.server.type=sync4. MCP工具优化
上文为了快速Agent + MCP的效果,MCP服务直接将商户和华为支付的逻辑写在了一起。这里进行了优化,区分了PetalDemoService和MerchantDemoService。
PetalPayDemoService只包装华为支付的开放接口;MerchantDemoService则处理订单生成,接口参数签名的逻辑。逻辑如下。
public class PetalPayDemoService {
@Tool(description = "花瓣支付预下单,获取接口")
public String PetalPayPrecreate(PreOrderCreateRequest preOrderReq, String payMercAuth)
}public class MerchantDemoService {
/**
* 获取支付链接,进行支付
* @param mercOrderNo 商户支付订单号,最长64位, 不包含特殊字符,商户支付订单号具有唯一性,一次新的支付请求需要使用新的商户支付订单号,建议使用mcpdemo_mercOrderNo_yyyyMMddHHmmssSSS_3位随机数作为支付订单号,后续使用该支付订单号查询支付结果。
* @param amount 商品金额,单位为分
* @param tradeSummary 商品描述,最大长度1024
* @return 用于花瓣支付的预下单的参数
* @throws RestClientException if the request fails
*/
@Tool(description = "构建花瓣支付的预下单入参")
public PetalPayMCPRequest<PreOrderCreateRequest> getPetalPayParams(String mercOrderNo, String tradeSummary, Long amount );
/**
* 生成商户订单号
* @return 商户支付订单号
*/
@Tool(description = "生成商户支付订单号")
public String genMercOrderNo();
}然后使用cherry studio桌面工具模拟智能体应用。对接AI模型服务(qwq-32b)和上文的华为支付MCP服务和商户demoMCP服务。
用户输入述求“我要购买5元的游戏礼包”
最终智能体自主调用三个MCP接口完成云侧的支付预下单。智能体答复如下。整个思考流程和自主调用MCP的表现,还是很智慧的:

商户侧 AI Agent 模块关键代码实现
1. AI模型服务对接
公司内部研发环境提供的都是openapi兼容的ai模型服务,因此使用spring ai框架中openai的sdk。
涉及配置如下:
spring.ai.openai.base-url=http://10.34.239.193:8989
spring.ai.openai.api-key=sk-xxx
spring.ai.openai.chat.options.model=QwQ-32B-Clientpom.xml依赖中,也对应使用openai的sdk
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>2. MCP Server服务对接
使用sse类型的mcp接口,涉及配置如下:
spring.ai.mcp.client.type=SYNC
spring.ai.mcp.client.toolcallback.enabled=true
spring.ai.mcp.client.request-timeout=180s
spring.ai.mcp.client.sse.connections.server1.url=http://127.0.0.1:8082
spring.ai.mcp.client.sse.connections.server1.sse-endpoint=/api/ai/mcp/sse3. 面向AI Agent客户端提供会话聊天
为了便于连续对话,给端侧提供了一个会话初始的接口,并使用sessionId作为Agent上下文的记忆id。
OpenAiChatOptions chatOptions = USER_CHATCLIENT_CACHE.get(finalConversationId, () -> {
return defaultChatOptions;
}); // 获取用户会话配置,finalConversationId既是sessionid,也是agent上下文的记忆id。
ChatResponse chatResponse = chatClient.prompt(new Prompt(request.getInputText(), chatOptions)).advisors(a -> a.param(ChatMemory.CONVERSATION_ID,
finalConversationId)).call().chatResponse();
return OutputTextResponse.buildSuccessRsp(chatResponse.getResult().getOutput().getText());4. 流式输出
参考api说明:https://springdoc.cn/spring-ai/api/chatclient.html#_%E6%B5%81%E5%BC%8F%E5%93%8D%E5%BA%94
Flux<String> outputText = chatClient.prompt(new Prompt(request.getInputText(), chatOptions)).advisors(a -> a.param(ChatMemory.CONVERSATION_ID,
finalConversationId)).stream().content();不过在实际验证中,发现在使用流式输出时,AI模型在需要调用MCP工具时就会停止,只是返回需要调用MCP工具的函数名及参数相关,却不会自主去调用。这里我尝试将MCP Client和MCP Server的同步异步模式都组合调整进行验证,都没能支撑调用MCP工具。这部分问题的解决暂时搁置。
阶段四: AI Agent和MCP部署服务器
因为当前Spring AI开源框架要求使用JDK17以上,spring框架要求在6.0以上。 但终端云服务这边统一使用的nuwa框架,对spring框架最多只能支持到5.3+,因此无法直接在nuwa项目中集成Spring ai。 目前暂时直接使用的spring的boot starter项目进行的编译,然后直接传到服务器上启动服务。
终端云服务目前已规划了AI原生工程平台,开发框架也是基于Spring ai开源项目。相关材料如下:
AI原生工程平台架构-v1.5.pptx
NUWA AI原生应用开发框架设计方案.pptx
AI原生应用开发框架交内源代码仓:
https://codehub-dg-g.huawei.com/nuwa-community/nuwa-ai-framework-demo.git
演示效果:
aiagent+mcp手机端演示完整的支付退款及查询流程【测试环境】
aiagent+mcp手机端演示完整的华为支付退款及查询流程【现网环境】
aiagent+mcp电脑端演示完整的支付退款及查询流程
内网在线体验地址:
研发环境体验地址:https://petalpaydemo.hwcloudtest.cn:44086/PetalPayDemo/aiagent
AgentServer地址:https://petalpaydemo.hwcloudtest.cn:44086/api/ai/agent/
MCPServer地址:https://petalpaydemo.hwcloudtest.cn:44086/api/ai/mcp/ 【可使用cherry studio等桌面ai工具接入尝试】
界面效果:
(说明:以上体验地址,需要在公司内网访问,笔者不会长期维护,服务不保证实时可用。)
附相关链接材料:
公司内网大模型信息:https://wiki.huawei.com/domains/116903/wiki/247376/WIKI202506287303861
银联MCP智能支付服务:https://open.unionpay.com/tjweb/solution/detail?solId=613#nav03
支付宝 支付MCP Server:https://opendocs.alipay.com/open/0go80l
微信支付MCP插件:https://yuanqi.tencent.com/mcp-shop?detailmcpId=683f109ebfbc60d469a9a65a
演示效果:mcpClient项目工程+模型+mcpServer项目工程demo演示-0620
参考文档:MCP Server Starter :: Spring AI 中文文档
演示效果:mcpServerDemo对标支付宝支持H5支付及退款和相关查询接口-0627
demo内源代码仓:https://codehub-dg-g.huawei.com/y00427641/AIDemo.git
AI原生工程平台架构-v1.5.pptx
NUWA AI原生应用开发框架设计方案.pptx
AI原生应用开发框架交内源代码仓:
https://codehub-dg-g.huawei.com/nuwa-community/nuwa-ai-framework-demo.git
演示效果:
aiagent+mcp手机端演示完整的支付退款及查询流程【测试环境】
aiagent+mcp手机端演示完整的华为支付退款及查询流程【现网环境】
aiagent+mcp电脑端演示完整的支付退款及查询流程
研发环境体验地址:https://petalpaydemo.hwcloudtest.cn:44086/PetalPayDemo/aiagent
AgentServer地址:https://petalpaydemo.hwcloudtest.cn:44086/api/ai/agent/
MCPServer地址:https://petalpaydemo.hwcloudtest.cn:44086/api/ai/mcp/ 【可使用cherry studio等桌面ai工具接入尝试】
