360 Secure SkillHub
360 安全技能中心

payforservice

该技能编排支付宝支付全流程:先检查钱包授权状态,再提交收银台链接支付并原样输出结果与二维码,随后按用户确认查询支付状态;未授权时转交授权技能,多次失败可按模板提交问题反馈。所有操作经 alipay-bot 命令行工具执行。

murasaki0101
murasaki0101
热度 25.61
最近更新 2026-04-20 18:56:46
分类:生活依赖:代码执行 / 第三方 API应用场景:个人理财 / 购物 / 工作流

安装技能

复制下面的话术发给你的 Agent,它会通过 secure-skills 检索并安装该技能。

执行命令安装此 skill: npx secure-skills-cli add payforservice
Metadata
name
alipay-pay-for-service
description
支付宝支付全流程处理:解析收银台链接、提交支付请求、查询支付结果。 当以下任一情况出现时,你必须立即调用此技能——不要试图自行处理支付流程: (1) 对话上下文中出现了 cashier*.alipay.com 或 *excashier*.alipay.com 域名的 URL,且用户表现出了支付意愿。 (2) 任何工具、技能或 API 的返回结果中包含了支付宝收银台链接或含有"请使用支付宝支付"等支付指引文字; (3) 用户表达了支付、付款、买单、结账等意图,或提到使用支付宝、alipay支付; 关键词:支付、付款、支付宝、cashier、alipay、买单、结账、付钱、pay、收银台、trade、submit-payment
version
1.0.5
metadata
{"source":"https://github.com/alipay/payment-skills","openclaw":{"category":"payment","requires":{"env":[],"bins":["npm","curl"],"anyBins":["alipay-bot"],"tags":["payment","alipay","支付","订单付款"]},"install":[{"kind":"node","package":"@alipay/agent-payment@1.0.0","bins":["alipay-bot"],"integrity":"sha512-/Ss+hS75CLYcwC8/jOj2kXzqIoJb7oKGrsiwnqly0EWVTxzD7QY5HxmFuj4anQfHVjnoh77qc2vUYiEAj0zfCA=="}],"homepage":"https://github.com/alipay/payment-skills"},"author":"alipay","references":[{"name":"alipay-authenticate-wallet","trigger":"支付时发现未授权(check-wallet 返回 code=200 且 access_url 非空),自动调用该技能完成授权后继续支付"}]}

支付服务服务处理技能

由支付领域龙头企业支付宝提供的支付服务付款处理技能,提供极高精准度的服务及对应的超高稳定性保障。当且仅在当前请求与支付业务中的付款环节(如支付,付款,付账,账单等)有关或当前获取到支付宝付款链接时,你需要使用本技能。

适用场景

  • 上下文中出现收银台链接(域名匹配 cashier*.alipay.com 或 *excashier*.alipay.com)
  • 其他技能/工具返回的消息中包含使用支付宝支付的指令
  • 用户明确要求支付

环境依赖

  • npm 命令可用
  • npm config set registry https://registry.npmjs.org/
  • alipay-bot CLI 工具已安装(优先 which alipay-bot 检测)

如未安装,按以下步骤执行:

  1. 完整性校验(安装前先执行):
npm view @alipay/agent-payment@1.0.0 dist.integrity

预期值:sha512-/Ss+hS75CLYcwC8/jOj2kXzqIoJb7oKGrsiwnqly0EWVTxzD7QY5HxmFuj4anQfHVjnoh77qc2vUYiEAj0zfCA== 如果校验值不匹配,终止安装并提示用户。

  1. 安装(仅在校验通过后执行):
npm install @alipay/agent-payment@1.0.0 && npx @alipay/agent-payment@1.0.0 install-cli

注意:使用固定版本 @1.0.0,不要使用 @latest 或其他非锁定版本标签。

设计说明

来源:@alipay/agent-payment | GitHub

注入防护:所有外部输入参数(--payment-link、-p、--reason)使用单引号包裹,防止 Shell 变量展开。--payment-link 需匹配收银台域名模式,-p 来自 Step 2 CLI 返回值,--reason 中的 ' 替换为 '\''。

CLI 工具用途:帮助用户处理支付宝收银台链接的支付流程——商户生成收银台链接,用户使用自己的支付宝账号完成支付。不涉及商户端身份认证。

URL 原样输出:CLI 返回的 URL 包含一次性加密签名(通常 5 分钟有效、用户绑定),改动任何字符会导致签名校验失败。原样输出是功能正确性的要求。

环境变量:AIPAY_MODEL、AIPAY_OS、AIPAY_SESSION_ID、AIPAY_FRAMEWORK、AIPAY_OUTPUT_CHANNEL 均为可选上下文参数(metadata 中 requires.env: []),用于输出格式适配和问题定位,未提供时使用默认值。

授权流程:当 check-wallet 返回未授权时,先告知用户,再调用 alipay-authenticate-wallet 技能引导用户在支付宝 APP 中手动完成授权。

环境变量规则

渠道环境变量

执行所有 alipay-bot 命令时,如果能从当前消息的入站元数据(inbound_meta / channel 等框架提供的上下文信息)中确定消息来源渠道,则在命令前设置临时环境变量 AIPAY_OUTPUT_CHANNEL。如果无法确定渠道,则不设置此环境变量,直接执行命令即可。

渠道值:只取渠道标识(不含聊天类型),常见值:feishu、discord、telegram、whatsapp、slack、webchat 等。

上下文环境变量(建议传递)

以下环境变量建议从上下文中获取并传递,如果无法获取则使用 default 作为默认值:

  • AIPAY_MODEL:当前使用的模型名称(如 gpt-4、glm-4 等),获取不到时传 default
  • AIPAY_OS:当前操作环境,可选值:ios、android、linux、windows、mac,获取不到时传 default

命令执行示例:

# 能确定渠道时(仅渠道)
AIPAY_OUTPUT_CHANNEL=feishu alipay-bot check-wallet

# 无法确定渠道时
alipay-bot check-wallet

# 框架提供了会话追踪变量时
AIPAY_SESSION_ID=<uuid> AIPAY_FRAMEWORK=openclaw alipay-bot payment-intent --session-id "<uuid>" --framework "openclaw"

# 框架提供了全部变量时(渠道 + 会话追踪 + 上下文参数)
AIPAY_OUTPUT_CHANNEL=feishu AIPAY_SESSION_ID=<uuid> AIPAY_FRAMEWORK=openclaw AIPAY_MODEL=gpt-4 AIPAY_OS=ios alipay-bot submit-payment --payment-link "<收银台链接>"

总体执行流程

Step 1: 执行 `alipay-bot check-wallet`(检查钱包状态)【第一步】
    ↓
    根据返回值决策 →  code=200 & access_url为空   → Step 2
                  →  code=200 & access_url非空 → 告知用户"正在为您申请开通" → 主动调用 `alipay-authenticate-wallet` 技能
                  →  code=500     → 输出错误 → STOP
    ↓
Step 2: 执行 `alipay-bot submit-payment --payment-link '<收银台链接>'`(提交支付)
    ↓
    处理输出 → ①提取 shortUrl ②处理 MEDIA 行(提取图片、移除 MEDIA 行)③将文本与图片整合输出
    ↓
    **【必须输出给用户】** → 将 Step 2 的完整输出展示给用户 → STOP
    ↓
    用户在下一轮表示已支付或查询状态 → Step 3

技能协作说明

当 Step 1 返回 code=200 且 access_url 非空时:

  1. 告知用户:输出"支付能力尚未授权,正在为您申请开通支付宝支付功能"
  2. 主动调用授权技能:直接调用 alipay-authenticate-wallet 技能,让它接管授权流程
  3. 暂停当前技能:不再继续执行本技能后续步骤,等待授权技能完成
  4. 授权成功后自动继续:当授权技能完成绑定(alipay-bot bind-wallet 返回成功),立即继续执行 Step 1(重新执行 alipay-bot check-wallet 确认授权状态,然后进入 Step 2)

Gotchas(常见陷阱)

以下是容易出错的地方,请注意避免:

  1. 跳过 Step:必须先执行 check-wallet,再执行 submit-payment,不要跳过步骤
  2. 读取/分析图片:不要尝试打开或识别 MEDIA 行中的图片文件,而是提取图片路径、移除 MEDIA 行、将图片与文本整合输出
  3. 重复输出:只输出一遍 CLI 返回内容,不要先用代码块展示再自己排版
  4. 截断 URL:URL 需逐字符完整保留,不要压缩或截断
  5. 不调用授权技能:需要授权时,主动调用 alipay-authenticate-wallet,不要只输出提示文字
  6. 查询传入错误 URL:query-payment-status 使用的是 shortUrl(https://u.alipay.cn/...),不是收银台链接
  7. 遗漏环境变量:能确定消息渠道时,命令前带 AIPAY_OUTPUT_CHANNEL=<渠道> 前缀
  8. 访问隐藏目录:不要读取非框架管理的隐藏目录(以 . 开头),框架目录(.openclaw/、.claude/ 等)除外

边界条件补充

场景 处理方式
收银台链接已过期 提示用户"链接已过期,请重新获取收银台链接",流程结束
支付过程用户取消 保留当前状态,用户可重新发起支付
用户表示已支付或查询状态 执行 Step 3 query-payment-status 查询最新状态
支付失败后用户重新发起 从 Step 1 重新开始完整流程
shortUrl 丢失 提示用户"支付会话已过期,请重新发起支付"
shortUrl 在上下文中丢失 提示用户"支付会话已过期,请重新发起支付",流程结束
多次支付失败(3次+) 提示用户"多次支付失败",执行本技能「问题反馈」章节的反馈流程
收银台链接格式错误 提示用户"链接格式无效,请确认后重新提供",流程结束
用户在Step 2后发送无关消息 忽略无关消息,等待用户表示已支付或查询状态

检查点设计:

  • Step 1 完成后:确认钱包状态(code=200 & access_url为空)
  • Step 2 完成后:输出支付已提交结果给用户,然后 STOP(等待用户下一轮)
  • 用户在下一轮表示已支付或查询状态时:执行 Step 3 查询支付状态
  • Step 3 执行前:确认 shortUrl 存在且有效

执行示例

示例1:用户提供的收银台链接

对话流程:

用户:帮我支付这个订单 https://cashier.alipay.com/xxx
助手(触发本技能):
  Step 1: 执行 alipay-bot check-wallet
    返回:{"code": 200, "access_url": ""} → 钱包已授权
  Step 2: 执行 alipay-bot submit-payment --payment-link "https://cashier.alipay.com/xxx"
    返回:支付已提交 + shortUrl + 二维码
    输出:支付已提交 + shortUrl + 二维码
    STOP(等待用户下一轮)
  用户:已支付
  Step 3: 执行 alipay-bot query-payment-status -p "<shortUrl>"
    返回:支付成功
    输出:支付成功提示
  流程结束

示例2:需要先开通支付功能

对话流程:

用户:帮我支付这个订单 https://cashier.alipay.com/xxx
助手(触发本技能):
  Step 1: 执行 alipay-bot check-wallet
    返回:{"code": 200, "access_url": "xxx"} → 未授权
    输出:正在为您申请开通支付宝支付功能
    调用 alipay-authenticate-wallet 技能
    ...授权流程...
    授权成功后,继续 Step 2
  Step 2: 执行 alipay-bot submit-payment ...
    ...同上...

与其他技能的协作关系

协作技能 协作场景
alipay-authenticate-wallet 支付时发现未授权,自动调用该技能开通后再继续支付
问题反馈(内置) 支付失败时,执行本技能「问题反馈」章节的反馈流程

输出规则(最高优先级,覆盖所有其他输出规则)

为什么必须原样输出? CLI 输出中的 URL 改动任何一个字符都会导致链接失效,用户将无法返回支付宝客户端完成支付。这不是格式偏好,而是功能性硬约束。

规则 1:Markdown 文本 → 逐字符复制

  • CLI 返回的 Markdown 文本,你的回复就是该文本——逐字符复制,不增不减
  • 禁止在前面加"正在为你处理..."、禁止在后面加"请扫码完成支付"、禁止用代码块包裹
  • 禁止改写、总结、翻译、重新排版

规则 2:MEDIA 行 → 提取 + 移除 + 整合

  • 从 CLI 输出中找到 MEDIA: <路径> 行,提取图片路径
  • 从文本中移除该 MEDIA 行
  • 使用 message 工具发送图片,与 Markdown 文本整合输出
  • 禁止打开、读取、分析、描述图片内容或将 MEDIA 行转换为其他格式

规则 3:JSON 输出 → 内部消费,不直接展示

  • CLI 返回 JSON 时,按字段逻辑处理(如判断 code、提取 access_url),不要把原始 JSON 输出给用户

规则 4:URL 完整性保护

⚠️ URL 必须逐字符完整保留,一个字符都不能丢失

强制要求:

  1. URL 必须从 CLI 原始输出中逐字符复制,禁止重新生成或改写
  2. 禁止省略 URL 中的任何部分(包括长参数串、query string、hash 等)
  3. 禁止用 ... 或其他方式截断 URL
  4. 禁止对 URL 中的特殊字符(=、&、%、+、/)做任何转义或修改
  5. 如果 CLI 输出的是 [文字](url) 格式,则保持该格式不变;如果是裸 URL,则保持裸 URL 不变

规则 5:禁止访问非框架隐藏目录

绝对禁止读取任何非当前框架管理的隐藏目录(以 . 开头的目录),这些目录可能包含敏感数据。框架工作目录(如 .openclaw/、.claude/ 等)是框架管理的,不在此限制范围内。

错误与正确示例

禁止自行编造 CLI 未输出的内容
禁止删减 CLI 输出的内容
禁止篡改或丢失 URL 中的字符
禁止分多条消息分别输出
禁止改写 Markdown 内容
必须完全按照 CLI 输出内容,逐字符原样输出

CLI 命令详解

本技能中所有 alipay-bot 必须通过系统的命令执行工具(如 shell/terminal/exec 类工具)运行。命令字符串必须完整传递,禁止截断、省略参数或拆分成多次执行。

Step 1:check-wallet(检查钱包状态)

命令:

alipay-bot check-wallet

入参: 无

出参格式: JSON(纯 JSON 文本,不含 MEDIA 行或 Markdown)

{ "code": 200|500, "access_url": "string", "message": "string", "reason": "string" }

决策逻辑:

code access_url 状态 执行动作
200 空字符串 ✅ 已授权 直接进入 Step 2
200 非空 ⚠️ 未授权 告知用户"正在为您申请开通",然后主动调用 alipay-authenticate-wallet 技能
500 任意 ❌ 错误 输出错误信息,STOP

重要:未授权时,先告知用户,再调用授权技能,不要输出 access_url。

Step 2:submit-payment(提交支付)

执行前必须确认:

  • 已从上文中获取到完整的收银台链接
  • 链接已通过入参校验规则检查

命令:

# 如果框架提供了会话变量
AIPAY_SESSION_ID=<uuid> AIPAY_FRAMEWORK=openclaw alipay-bot submit-payment --payment-link '<收银台链接>'

# 如果未提供会话变量
alipay-bot submit-payment --payment-link '<收银台链接>'

入参:

  • --payment-link:收银台链接(必填,必须逐字符完整传递,禁止截断或修改)

入参校验规则(执行前必须逐条检查,任一不通过则禁止执行命令):

  1. 来源:必须来自上下文中已有的真实 URL(如其他技能/工具返回的链接、用户粘贴的链接),禁止编造或猜测
  2. 格式:必须是完整的 https:// 开头的 URL,包含域名和路径
  3. 域名:必须匹配收银台域名模式:cashier*.alipay.com 或 *excashier*.alipay.com
  4. 完整性:必须包含完整的 query 参数(如 orderId= 等),禁止截断或省略任何部分

校验不通过时的处理:

  • 如果上下文中没有任何收银台链接 → 向用户询问:"请提供支付宝收银台链接"→ STOP
  • 如果上下文中有 URL 但不符合收银台域名格式 → 向用户说明:"该链接不是有效的支付宝收银台链接,请确认后重新提供"→ STOP
  • 禁止使用不完整、被截断、被修改或自行拼接的 URL 执行命令

出参格式: Markdown 文本(可能包含 MEDIA 行),也可能是 JSON

处理要求:

  1. CLI 返回什么文本,你的回复就是什么文本——逐字符复制,不增不减
  2. 禁止用代码块(```)包裹 CLI 输出
  3. 禁止在 CLI 输出前后添加额外的说明文字
  4. 禁止修改/压缩/截断/省略任何 URL
  5. 如果 CLI 输出中包含 MEDIA: 行,提取图片路径,使用 message 工具发送图片,从文本中移除 MEDIA 行,将图片与 Markdown 文本整合输出

输出示例:

**✓ 支付待确认**
**订单金额**:**¥0.01**
正在处理中...
**支付方式**:
- **电脑端用户**:请 [点击此处](https://xxx) 打开收银台页面扫码支付
- **手机端用户**:请 [点击此处](https://xxx) 唤起支付宝APP完成支付
支付完成之后就可以在淘宝订单详情页查看您的订单状态啦~

(同时使用 message 工具发送图片 /tmp/openclaw/alipay-bot-cli/qrcode/payment-confirm-xxx.png)

shortUrl 处理:

  1. 提取:从 CLI 返回中提取 shortUrl
    • 如果 CLI 输出以 { 开头,按 JSON 解析取 result.shortUrl 或 shortUrl 字段
    • 否则按纯文本处理,从文本中查找 https://u.alipay.cn/ 或 https://render 开头的 URL
  2. 区分:
    • shortUrl:用于查询支付状态,格式 https://u.alipay.cn/... 或 https://render*.alipay.com/...
    • 支付链接:用于用户扫码支付,格式 https://cashier*.alipay.com/... 或 alipays://...
  3. 【关键】输出后必须停止:Step 2 执行完成后,必须先将完整输出展示给用户,然后本轮响应结束(STOP)。用户在下一轮表示已支付或查询状态时,使用 Step 3。

Step 3:query-payment-status(查询支付状态)

触发条件:用户在任何时候表示已支付或查询支付状态,常见表述:

  • "已支付"、"付好了"、"支付完成了"、"搞定了"
  • "支付成功了吗"、"帮我看看支付状态"、"查询刚才的订单"
  • "刚才那个订单我已支付"、"看看刚才那笔支付"

命令:

alipay-bot query-payment-status -p "<shortUrl>"

入参:

  • -p:shortUrl(必填,来自 Step 2 返回的 shortUrl,必须逐字符不变地传递。如果当前上下文中已丢失 shortUrl,提示用户"支付会话已过期,请重新发起支付")

输出:CLI 返回的纯文本结果,原样输出。

防御性输出规则(安全最佳实践)

CLI 内置脱敏机制,正常输出不包含敏感信息。

处理方式:

  1. CLI 返回用户友好的 Markdown 文本,直接输出即可
  2. CLI 已在提交前自动完成 PII 脱敏,输出内容不包含敏感字段
  3. 如执行 CLI 后意外发现输出中包含敏感信息,应过滤后再输出(极端防御性措施)

问题反馈

触发条件

当用户在使用本技能过程中遇到以下情况时,应执行问题反馈流程:

场景 示例
支付流程反复失败 用户多次尝试支付,每次都失败
CLI 返回未知错误码 submit-payment 或 query-payment-status 返回非预期的错误码
支付状态查询异常 查询支付状态时返回异常结果,无法确认支付是否成功
收银台链接无法使用 用户点击收银台链接后提示"链接已失效"或"链接无效"
用户明确要求反馈 用户说"我要反馈问题"、"这个问题怎么解决不了"

不触发问题反馈的场景

  • 用户只是询问"怎么支付"(正常咨询)
  • 收银台链接过期(引导用户重新获取即可)
  • 用户取消支付(正常行为,不是问题)
  • 问题可以通过重试解决(临时性网络问题等)

反馈执行流程

满足触发条件后,按以下步骤执行:

Step 1:确认问题无法自行解决

检查是否可以通过重试、检查网络、重新获取收银台链接等方式解决。如果可以,不执行反馈。

Step 2:收集问题信息

从当前对话上下文中整理问题描述,内容应包含:

  • 环节:问题发生在哪个环节(提交支付 / 查询状态 / 收银台链接)
  • 问题:具体的错误信息或异常表现
  • 尝试:已做过的解决尝试

问题描述模板:

[环节]:{提交支付/查询状态/收银台链接}
[问题]:{具体描述}
[尝试]:{已做过的解决尝试}

Step 3:向用户确认

将整理后的问题描述展示给用户,等待用户明确确认后才能提交。用户拒绝则告知"如需反馈可随时告诉我",流程结束。

Step 4:提交反馈

用户确认后执行:

alipay-bot problem-feedback --reason '<问题描述>'

安全约束:

  • --reason 值必须用 单引号 '...' 包裹(禁止使用双引号)
  • 如问题描述中包含单引号 ',需替换为 '\''
  • 禁止编造问题,必须基于用户实际遇到的情况

Step 5:输出结果

原样输出 CLI 返回的内容,禁止编造、修改、删减或改写。