@alipay/alipay-aipay 1.2.2 → 1.4.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/README.md +5 -0
  2. package/dist/commands/install.d.ts.map +1 -1
  3. package/dist/commands/install.js +13 -12
  4. package/dist/commands/install.js.map +1 -1
  5. package/dist/commands/uninstall.d.ts.map +1 -1
  6. package/dist/commands/uninstall.js +17 -9
  7. package/dist/commands/uninstall.js.map +1 -1
  8. package/dist/commands/update.d.ts.map +1 -1
  9. package/dist/commands/update.js +5 -5
  10. package/dist/commands/update.js.map +1 -1
  11. package/dist/index.js +4 -4
  12. package/dist/index.js.map +1 -1
  13. package/dist/utils/config.d.ts +5 -3
  14. package/dist/utils/config.d.ts.map +1 -1
  15. package/dist/utils/config.js +34 -12
  16. package/dist/utils/config.js.map +1 -1
  17. package/dist/utils/file.d.ts +8 -0
  18. package/dist/utils/file.d.ts.map +1 -1
  19. package/dist/utils/file.js +161 -9
  20. package/dist/utils/file.js.map +1 -1
  21. package/dist/utils/jq.d.ts.map +1 -1
  22. package/dist/utils/jq.js +8 -0
  23. package/dist/utils/jq.js.map +1 -1
  24. package/package.json +6 -5
  25. package/skill/SKILL.md +15 -169
  26. package/skill/VERSION +1 -1
  27. package/skill/references/integration/flow.md +321 -292
  28. package/skill/references/integration/modules/alipay-sdk-reminder.md +5 -3
  29. package/skill/references/integration/modules/checklist.md +41 -27
  30. package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +199 -0
  31. package/skill/references/integration/modules/code-examples/csharp/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +8 -4
  32. package/skill/references/integration/modules/code-examples/csharp/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +6 -2
  33. package/skill/references/integration/modules/code-examples/csharp/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.cs +3 -1
  34. package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +184 -0
  35. package/skill/references/integration/modules/code-examples/java/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +4 -1
  36. package/skill/references/integration/modules/code-examples/java/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +5 -2
  37. package/skill/references/integration/modules/code-examples/java/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemoController.java +3 -1
  38. package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +135 -0
  39. package/skill/references/integration/modules/code-examples/nodejs/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +16 -10
  40. package/skill/references/integration/modules/code-examples/nodejs/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +10 -4
  41. package/skill/references/integration/modules/code-examples/nodejs/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.js +2 -1
  42. package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +157 -0
  43. package/skill/references/integration/modules/code-examples/php/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +4 -1
  44. package/skill/references/integration/modules/code-examples/php/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +5 -2
  45. package/skill/references/integration/modules/code-examples/php/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.php +2 -1
  46. package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +128 -0
  47. package/skill/references/integration/modules/code-examples/python/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +4 -1
  48. package/skill/references/integration/modules/code-examples/python/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +5 -1
  49. package/skill/references/integration/modules/code-examples/python/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.py +4 -2
  50. package/skill/references/integration/modules/interface-contract/aipay-interface-contract.md +53 -0
  51. package/skill/references/integration/modules/interface-contract/apppay-interface-contract.md +45 -0
  52. package/skill/references/integration/modules/interface-contract/common-trade-contract.md +42 -0
  53. package/skill/references/integration/modules/interface-contract/notify-url-contract.md +68 -0
  54. package/skill/references/integration/modules/interface-contract/webpay-interface-contract.md +44 -0
  55. package/skill/references/integration/modules/interface-guide.md +37 -72
  56. package/skill/references/integration/modules/product-decision.md +10 -27
  57. package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +62 -94
  58. package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +43 -40
  59. package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +93 -114
  60. package/skill/references/integration/modules/scripts/local_402_sandbox_pay.py +357 -147
  61. package/skill/references/integration/modules/scripts/sandbox_config.sh +299 -0
  62. package/skill/references/integration/modules/troubleshooting-flow.md +28 -0
  63. package/skill/references/normal/alipay-cli-env.md +15 -5
  64. package/skill/references/normal/full-process-routing.md +80 -0
  65. package/skill/references/normal/json/customer-messages.json +937 -0
  66. package/skill/references/normal/json/policy-rules.json +179 -0
  67. package/skill/references/normal/rejection-guide.md +11 -6
  68. package/skill/references/normal/scripts/alipay_cli_env.mjs +29 -0
  69. package/skill/references/normal/scripts/alipay_cli_env.sh +21 -0
  70. package/skill/references/normal/scripts/common.sh +87 -0
  71. package/skill/references/normal/scripts/detect_dev_tool.sh +5 -1
  72. package/skill/references/normal/scripts/integration_message_runner.mjs +801 -0
  73. package/skill/references/normal/scripts/onboarding_message_runner.mjs +436 -0
  74. package/skill/references/normal/scripts/open_official_url.sh +82 -0
  75. package/skill/references/normal/scripts/platform_compat.mjs +39 -0
  76. package/skill/references/normal/scripts/project_route_inspector.sh +132 -0
  77. package/skill/references/normal/scripts/python_script_runner.mjs +56 -0
  78. package/skill/references/normal/scripts/render_customer_message.mjs +1263 -0
  79. package/skill/references/normal/scripts/self_update.mjs +160 -0
  80. package/skill/references/normal/scripts/telemetry.mjs +1278 -0
  81. package/skill/references/normal/self-update.md +18 -51
  82. package/skill/references/onboarding/flow.md +381 -283
  83. package/skill/references/onboarding/modules/app-release.md +132 -179
  84. package/skill/references/onboarding/modules/authorization.md +53 -64
  85. package/skill/references/onboarding/modules/error-handling.md +31 -34
  86. package/skill/references/onboarding/modules/product-sign.md +62 -66
  87. package/skill/references/onboarding/modules/scripts/app.sh +397 -158
  88. package/skill/references/onboarding/modules/scripts/ar_sign_apply.sh +38 -22
  89. package/skill/references/onboarding/modules/scripts/auth.sh +479 -167
  90. package/skill/references/onboarding/modules/scripts/download_key_tool.sh +157 -0
  91. package/skill/references/onboarding/modules/scripts/error_handler.sh +100 -130
  92. package/skill/references/onboarding/modules/scripts/network_retry.sh +96 -0
  93. package/skill/references/onboarding/modules/scripts/query_sign_status.sh +17 -70
  94. package/skill/references/onboarding/modules/scripts/service.sh +153 -89
  95. package/skill/references/onboarding/modules/scripts/sign_status_parser.sh +58 -0
  96. package/skill/references/onboarding/modules/scripts/upload_screenshots.sh +16 -14
  97. package/skill/references/onboarding/modules/service-registration.md +67 -72
  98. package/skill/references/runtime-entry.md +62 -0
@@ -8,13 +8,15 @@
8
8
 
9
9
  ## 功能概述
10
10
 
11
- 将 MCP 服务上架到支付宝服务市场。**仅对"按量付费"产品需要**,网站支付和APP支付不需要服务注册。
11
+ 将 MCP 服务上架到支付宝服务市场。**仅对"按量付费"产品需要**,网站支付和 APP 支付不需要服务注册。
12
+
13
+ 在 onboarding 中,登录、scope、MCC 校验和本分支查询成功后,服务分支按自身候选决策、五项资料校验、创建摘要或修改确认独立推进;不以签约提交成功或应用分支结果作为前置。服务失败只阻断服务分支,不回滚签约或应用成功结果。
12
14
 
13
15
  **⚠️ 触发条件:**
14
16
  ```
15
17
  ✅ 按量付费(salesCode = I1080300001000160457)→ 需要服务注册
16
18
  ❌ 网站支付(salesCode = I1080300001000041203)→ 不需要
17
- ❌ APP支付(salesCode = I1080300001000041313)→ 不需要
19
+ ❌ APP 支付(salesCode = I1080300001000041313)→ 不需要
18
20
  ```
19
21
 
20
22
  ---
@@ -36,19 +38,19 @@
36
38
  │ └─ data.items 不为空 → 展示完整分页结果后进入 Step 3 决策 │
37
39
  │ │
38
40
  │ Step 3: 用户决策 │
39
- │ ├─ 选择序号复用已有服务 → 跳过创建,完成 │
40
- │ ├─ 选择"新建" → ⚠️ 检查服务数量,若 ≥ 20 则禁止创建 │
41
- │ │ 若 < 20,收集 5 项服务信息,进入 Step 4 │
41
+ │ ├─ 选择完整 serviceId 复用已有服务 → 跳过创建,完成 │
42
+ │ ├─ 选择"新建" → ⚠️ 检查服务数量,若 ≥ 10 则禁止创建 │
43
+ │ │ 若 < 10,收集 5 项服务信息,进入 Step 4 │
42
44
  │ └─ 选择"修改" → 输入服务ID,收集所有服务信息,进入 Step 4 │
43
45
  │ │
44
46
  │ Step 4: 提交服务上架/修改 │
45
47
  │ ├─ 创建新服务:调用 saveBazaarServiceForMcp(不传 serviceId) │
46
- │ │ ⚠️ 调用前必须确认服务数量 < 20 │
48
+ │ │ ⚠️ 调用前必须确认服务数量 < 10 │
47
49
  │ └─ 修改已有服务:调用 saveBazaarServiceForMcp(传入 serviceId) │
48
50
  │ │
49
51
  │ Step 5: 处理结果 │
50
- │ ├─ 成功 → 对客输出服务信息,继续应用发布流程 │
51
- │ └─ 失败 → 展示错误,引导用户修正 │
52
+ │ ├─ 成功 → 对客输出实际服务信息并记录本分支结果 │
53
+ │ └─ 失败 → 展示错误并记录本分支恢复动作,其他独立分支继续 │
52
54
  │ │
53
55
  └─────────────────────────────────────────────────────────────────────┘
54
56
  ```
@@ -74,48 +76,39 @@
74
76
 
75
77
  ### 场景 A:服务列表为空(无已有服务)
76
78
 
77
- **此时必须进入 Step 3 收集服务信息并创建新服务。**
79
+ **此时进入 Step 3 收集服务信息;固定列表的空结果允许新建分支。五项资料校验通过后展示非阻塞创建摘要并直接保存,不再要求回复 `1`。**
78
80
 
79
81
  > 📎 `scripts/service.sh list` 已内置该判断,返回 `FLOW:CREATE_NEW` 时直接进入 Step 3。
80
82
  >
81
- > ⚠️ 注意:服务数量上限为 20 个,`service.sh save` 在创建前会校验。
83
+ > ⚠️ 注意:服务数量上限为 10 个,`service.sh save` 在创建前会校验。
82
84
 
83
85
  ### 场景 B:服务列表不为空(有已有服务)
84
86
 
85
87
  **此时必须按接口返回结果展示服务及其实际状态,让用户选择复用、创建或修改。Skill 不额外按状态过滤复用候选。**
86
88
 
87
- **输出格式:**
88
-
89
- ```markdown
90
- 📋 发现您已有以下服务:
91
-
92
- | 序号 | 服务ID | 服务名称 | 描述 | 价格 | 实际状态 | 服务地址 |
93
- |------|--------|----------|------|------|----------|----------|
94
- | 1 | SVC001 | 天气查询 | 提供全球天气查询 | 0.01元/次 | 已上线 | https://api.example.com/weather |
95
- | 2 | SVC002 | AI助手 | 智能对话服务 | 0.05元/次 | 审核中 | https://api.example.com/ai |
89
+ `scripts/service.sh list` 成功时不输出对客正文,只产生带 `ALIPAY_AIPAY_INTERNAL:` 前缀的唯一 `SERVICE_CANDIDATES_JSON`、全部 `SERVICE_CANDIDATE_ID` 和 `FLOW:*`。Step 3.1 的全部发现查询和短摘要完成后,轮到服务类别时必须把同一结构化快照交给 `onboarding_message_runner.mjs service-candidates`,由其一次输出事实表与固定选择提示,并统一引导用户前往支付宝 AI 付站点查看服务状态和详情;本模块不得提前展示、手工拼表、再次调用 `service.candidate.select`、另写站点引导或改写候选。只接受本轮内部事实实际输出的 `SERVICE_CANDIDATE_ID` 中的完整 `serviceId` 表示复用、`新建` 表示创建、`修改:<serviceId>` 表示修改该候选。候选外 ID、序号、历史候选和自由格式“修改”均不接受。
96
90
 
97
- 请选择:
98
- • 输入序号(1/2)复用对应服务
99
- • 输入"新建"创建新服务
100
- • 输入"修改 + serviceId"修改已有服务
91
+ ```bash
92
+ printf '%s' "$SERVICE_CANDIDATES_JSON" \
93
+ | node ../../normal/scripts/onboarding_message_runner.mjs service-candidates
101
94
  ```
102
95
 
103
- > 📎 表格渲染由 `scripts/service.sh list` 自动完成,无需手动拼接。Agent 直接展示脚本输出即可。
104
-
105
96
  **用户选择处理:**
106
97
 
107
- Agent 根据用户输入执行对应分支:
98
+ 用户决策必须针对本轮实际候选,Agent 不能代替用户选择:
108
99
 
109
100
  | 用户输入 | 后续操作 |
110
101
  |----------|----------|
111
- | 数字序号(1-$SERVICE_COUNT) | 复用对应服务 → 跳过创建,直接进入应用发布 |
112
- | "新建" | 进入 Step 3 收集服务信息 → `bash scripts/service.sh save`(创建前自动校验数量 < 20) |
113
- | "修改 + serviceId" | 使用表格中展示的 serviceId → 进入 Step 3 收集**所有**字段 → `bash scripts/service.sh save --service-id <id>` |
102
+ | 完整 `serviceId` | 复用对应服务 → 跳过创建 |
103
+ | "新建" | 进入 Step 3 收集服务信息 → `bash scripts/service.sh save`(创建前自动校验数量 < 10) |
104
+ | `修改:<serviceId>` | 目标必须来自当前候选 → 进入 Step 3 收集**所有**字段 → `bash scripts/service.sh save --service-id <id>` |
114
105
 
115
- > ⚠️ 服务数量上限 20 个,由 `service.sh save` 在创建前自动校验。
106
+ > ⚠️ 服务数量上限 10 个,由 `service.sh save` 在创建前自动校验。
116
107
 
117
108
  用户选择修改时可使用列表中展示的 `serviceId`。展示和记录接口返回的实际状态,不自行增加状态过滤、可用性结论或审核规则。
118
109
 
110
+ 脚本在完整分页并校验所有候选均有非空 `serviceId` 后,输出带统一前缀的 `SERVICE_CANDIDATE_ID=<serviceId>`;保存成功并按既有协议解析到实际 ID 后同样输出带统一前缀的 `SERVICE_ID=<serviceId>`。复用、新建或修改必须使用本轮输出,修改结果必须与用户选定 ID 相同。内部事实行严禁对客,也不改变 `discoverBazaarServicesForMcp` / `saveBazaarServiceForMcp` 的方法、payload、解包或成功响应解析。
111
+
119
112
  ---
120
113
 
121
114
  ## Step 3: 收集服务信息(创建或修改服务时执行)
@@ -134,18 +127,20 @@ Agent 根据用户输入执行对应分支:
134
127
  ❌ 错误:只收集需要修改的字段(会导致其他字段被清空)
135
128
  ```
136
129
 
137
- **收集服务信息交互:**
130
+ **收集服务信息交互:** 固定使用 `../../normal/scripts/onboarding_message_runner.mjs material-collect --category service --product-type "$PRODUCT_TYPE"`。必须执行下列命令,`missingFields` 只使用当前缺失或校验失败的字段名;常见别名由 runner 规范化后再交给 renderer。首次收集新建/修改服务资料时,一次列出服务名称、服务描述、服务地址、服务单价和请求示例JSON;修改目标的完整 `serviceId` 在候选选择消息中确认,不混入材料字段。本模块不维护第二份对客模板。
138
131
 
139
- ```
140
- 📋 请提供服务注册信息:
141
-
142
- 1. 服务名称(1-50 字符):您的服务名称
143
- 2. 服务描述(1-500 字符):简要描述服务功能
144
- 3. 服务地址(URL):服务的 API 地址
145
- 4. 服务单价(元,最低 0.01):用户每次调用的费用
146
- 5. 请求示例(JSON):API 请求参数示例,提交时作为 `schemaUrl` 字符串传入
147
-
148
- 请在一条回复中一次性提供以上全部信息。修改服务时请同时提供表格中的 serviceId,不再单独增加一轮询问。
132
+ ```bash
133
+ case "$CURRENT_STATUS" in
134
+ "待补充") MATERIALS_STATE="INITIAL" ;;
135
+ "部分已提供,待补充") MATERIALS_STATE="PARTIAL" ;;
136
+ "校验失败,需更正") MATERIALS_STATE="INVALID" ;;
137
+ *) echo "❌ 未知材料状态,停止渲染" >&2; exit 1 ;;
138
+ esac
139
+ MESSAGE_INPUT_JSON=$(jq -cn \
140
+ --arg missingFields "$MISSING_FIELDS" \
141
+ '{missingFields:$missingFields}')
142
+ printf '%s' "$MESSAGE_INPUT_JSON" \
143
+ | node ../../normal/scripts/onboarding_message_runner.mjs material-collect --category service --state "$MATERIALS_STATE" --product-type "$PRODUCT_TYPE"
149
144
  ```
150
145
 
151
146
  只补问缺失或校验失败的字段。已经通过校验的字段必须保留,不要求用户重新提交;修改服务仍必须最终获得全部五项字段,禁止只提交局部字段。
@@ -159,9 +154,11 @@ Agent 在当前任务中记录操作选择、serviceId 和五项服务资料。
159
154
  | `serviceName` | 服务名称 | 长度 1-50 字符 | 服务名称长度需在 1-50 字符之间 |
160
155
  | `serviceDesc` | 服务描述 | 长度 1-500 字符 | 服务描述长度需在 1-500 字符之间 |
161
156
  | `resourceUrl` | 服务地址 | 有效的 URL 格式(以 http:// 或 https:// 开头) | 请提供有效的 URL 地址 |
162
- | `pricing` | 服务单价 | 必须 >= 0.01 元 | 服务单价最低为 0.01 元 |
157
+ | `pricing` | 服务单价 | 机器值必须是 >= 0.01 的纯数字;用户带 `元/次` 时由脚本规范化 | 服务单价最低为 0.01 元 |
163
158
  | `schemaUrl` | 请求示例 | 有效的 JSON 格式;提交时序列化为字符串 | 请提供有效的 JSON 格式请求示例 |
164
159
 
160
+ > `pricing` 的规范化机器值只使用纯数字,例如 `0.08`。用户回复 `0.08元/次` 或 `0.08 元/次` 时,`scripts/service.sh validate` 会输出带统一前缀的 `SERVICE_PRICING=0.08` 内部事实;后续 `service.create.summary`、`onboarding.write.confirm` 和 `scripts/service.sh save` 必须复用该值,不得再次拼接单位或说明文字。模板负责展示“元/次”,机器值不得对客。
161
+ >
165
162
  > `schemaUrl` 是 MCP 入参字段名,本流程中承载的是序列化后的 JSON 请求示例,不是 URL。用户提供原始 JSON,例如 `{}`;`scripts/service.sh` 校验 JSON 后将其作为字符串写入 `request.schemaUrl`。禁止因为字段名含 `Url` 而要求用户提供网页地址。
166
163
 
167
164
  ### 校验脚本
@@ -179,37 +176,38 @@ bash scripts/service.sh validate --name "$SERVICE_NAME" --desc "$SERVICE_DES
179
176
 
180
177
  ### 场景 A:创建新服务(不传 serviceId)
181
178
 
182
- **⚠️ 调用前必须确认服务数量 < 20,否则禁止调用 saveBazaarServiceForMcp 接口!** 执行 `bash scripts/service.sh save --name <name> --desc <desc> --url <url> --pricing <pricing> --schema <json>`。
179
+ **⚠️ 调用前必须确认服务数量 < 10,否则禁止调用 saveBazaarServiceForMcp 接口!** 五项资料通过 `scripts/service.sh validate` 后,先按 `../flow.md` Step 5 渲染非阻塞 `service.create.summary/DEFAULT`,成功后直接执行 `bash scripts/service.sh save --name <name> --desc <desc> --url <url> --pricing <pricing> --schema <json>`,不等待用户回复 `1`。创建摘要参数和随后 `save` 参数必须完全一致。
183
180
 
184
181
 
185
182
  ### 场景 B:修改已有服务(必须传入 serviceId + 所有字段)
186
183
 
187
- 执行 `bash scripts/service.sh save --service-id <id> --name <name> --desc <desc> --url <url> --pricing <pricing> --schema <json>`。
184
+ 按 `../flow.md` Step 5 渲染 `onboarding.write.confirm/SERVICE_UPDATE_ONLY`;取得绑定当前会话、主体、目标 `serviceId` 和完整五项资料的有效确认后,执行 `bash scripts/service.sh save --service-id <id> --name <name> --desc <desc> --url <url> --pricing <pricing> --schema <json>`。
188
185
 
189
186
 
190
187
  ---
191
188
 
192
189
  ## Step 5: 处理结果
193
190
 
194
- ### 成功输出格式
191
+ ### 成功输出
195
192
 
196
- ```markdown
197
- ✅ 服务创建成功
193
+ 固定使用 `service.operation.result`,只传脚本实际取得的 `serviceId` 和结果;该消息统一引导用户到支付宝 AI 付站点,登录后进入控制台 → 服务管理查看服务状态和服务详情,并将站点 URL 裸露独占一行展示,本模块不维护第二份成功表格或站点引导。必须执行:
198
194
 
199
- | 项目 | 信息 |
200
- |------|------|
201
- | 服务ID | API_xxx |
202
- | 服务名称 | 天气查询 |
203
- | 服务描述 | 提供全球天气查询服务 |
204
- | 服务地址 | https://api.example.com/weather |
205
- | 服务单价 | 0.01 元/次 |
195
+ ```bash
196
+ MESSAGE_INPUT_JSON=$(jq -cn \
197
+ --arg serviceId "$SERVICE_ID" \
198
+ --arg actualResult "$ACTUAL_RESULT" \
199
+ '{serviceId:$serviceId,actualResult:$actualResult}')
200
+ printf '%s' "$MESSAGE_INPUT_JSON" \
201
+ | node ../../normal/scripts/render_customer_message.mjs service.operation.result --variant DEFAULT
206
202
  ```
207
203
 
208
204
  `saveBazaarServiceForMcp` 的当前成功响应不包含服务状态。不得根据创建或修改成功推断为“审核中”“已上线”或其他状态。只有后续 `scripts/service.sh list` 只读查询成功并按 `serviceId` 匹配到该服务时,才能记录和展示实际状态;查询失败或尚未返回该服务时,将状态保留为“未取得”,不得因此重复执行 `save`。
209
205
 
210
206
  ### 按量付费集成产物
211
207
 
212
- 服务创建、修改或复用成功后,必须记录并向用户说明以下已取得字段:
208
+ 服务创建、修改或复用成功后,必须记录以下已取得字段,并按上方 renderer 命令固定使用 `service.operation.result` 对客输出:
209
+
210
+ 服务复用、新建和修改决策都不接受 Agent 代选:存在候选时必须由用户从本轮 `SERVICE_CANDIDATE_ID` 集合选择复用、创建或修改,修改目标必须来自同一集合;列表为空时只允许新建。后续创建摘要或修改确认及脚本参数必须匹配该选择。
213
211
 
214
212
  | 字段 | 用途 |
215
213
  |------|------|
@@ -219,7 +217,12 @@ bash scripts/service.sh validate --name "$SERVICE_NAME" --desc "$SERVICE_DES
219
217
  | 服务单价 `pricing` | 应与 `Payment-Needed.protocol.amount` 的业务定价保持一致 |
220
218
  | 服务状态 | 仅在只读查询实际取得时记录,用于正式上线判断和后续排查 |
221
219
 
222
- 如果服务注册成功但未解析到 `serviceId`,不要继续宣称按量付费入驻完成;应提示用户重新查询服务列表或根据服务名称定位服务。
220
+ 如果服务注册成功但未解析到 `serviceId`,必须执行下列命令;随后重新查询完整服务列表,使用本次实际提交的服务名称、描述、地址和单价与列表实际返回字段做唯一匹配。只有恰好一个候选全部相等时才能取得其实际 `serviceId`;没有匹配、存在多个匹配或任一必要字段未返回时保持 `UNKNOWN`,不得按名称单独归属,也不得重复 `save`。取得实际 `serviceId` 前不得宣称按量付费产品开通完成。
221
+
222
+ ```bash
223
+ MESSAGE_INPUT_JSON=$(jq -cn --arg serviceName "$SERVICE_NAME" '{serviceName:$serviceName}')
224
+ printf '%s' "$MESSAGE_INPUT_JSON" | node ../../normal/scripts/render_customer_message.mjs service.id.missing --variant DEFAULT
225
+ ```
223
226
 
224
227
  ### 失败处理
225
228
 
@@ -240,13 +243,14 @@ bash scripts/service.sh validate --name "$SERVICE_NAME" --desc "$SERVICE_DES
240
243
 
241
244
  | 查询方式 | 参数 | 说明 |
242
245
  |----------|------|------|
243
- | 查询服务列表 | `{"request":{"limit":20,"offset":0}}` | 返回接口可见的服务列表;脚本按 `pagination.total` 自动翻页并完整展示实际状态,不按状态过滤候选 |
246
+ | 查询服务列表 | `{"request":{"limit":10,"offset":0}}` | 返回接口可见的服务列表;脚本按 `pagination.total` 自动翻页并完整展示实际状态,不按状态过滤候选 |
244
247
  | 根据 serviceId 查询详情 | `{"request":{"keyword":"API_xxx"}}` | 返回指定服务的详细信息 |
245
248
 
246
249
  **查询返回处理:**
247
250
 
248
251
  - MCP 信封先通过共享 `unwrap_mcp` 解包 `content[0].text`。
249
252
  - 当前成功协议以 `code="10000"` 判断,服务数组读取 `data.items`,分页读取 `data.pagination.limit/offset/total`。
253
+ - 当前已验证的 `data.items[]` 把定价和请求示例分别放在 `metadata.pricing`、`metadata.schema_url`;候选展示和修改结果核验优先读取这两个字段,并保留旧顶层 `pricing`、`schemaUrl` 兼容。价格缺失时只展示“未知”,不得拼成“未知元/次”。
250
254
  - 当前服务状态字段读取 `serviceStatus`,兼容旧响应中的 `status`;`ACTIVE` 表示已上线,其他未定义映射的状态值原样展示,不推断业务含义。
251
255
  - 脚本兼容旧成功协议中的 `success=true` 与 `resultObj.serviceList`,但不得用旧结构覆盖或猜测当前字段。
252
256
  - 只有明确取得成功响应中的空数组,才能判定没有已有服务;业务失败、字段缺失、分页不完整或候选缺少 `serviceId` 均必须阻断,禁止输出 `FLOW:CREATE_NEW` 或 `FLOW:SELECT`。
@@ -291,21 +295,12 @@ bash scripts/service.sh validate --name "$SERVICE_NAME" --desc "$SERVICE_DES
291
295
  # ✅ 修改已有服务 → scripts/service.sh save --service-id <id> --name <name> --desc <desc> --url <url> --pricing <pricing> --schema <json>
292
296
  ```
293
297
 
294
- ### 禁止调用示例
298
+ ### 禁止调用模式
295
299
 
296
- ```bash
297
- # ❌ 错误:虚拟未定义的方法
298
- export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call a2a-pay-service.deleteService -d '...'
299
-
300
- # ❌ 错误:自行推断的方法名
301
- export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call a2a-pay-service.updateService -d '...'
302
-
303
- # ❌ 错误:省略 server 名称
304
- export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call discoverBazaarServicesForMcp -d '...'
305
-
306
- # ❌ 错误:未先查询已有服务直接创建
307
- export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call a2a-pay-service.saveBazaarServiceForMcp -d '...'
308
- ```
300
+ - 禁止调用当前 Skill 未登记、未验证或未封装的服务市场方法;不得根据“删除服务”“更新服务”等业务语义自行猜测方法名。
301
+ - 禁止省略 server 名称或把脚本中的方法拆成相似的裸方法名。
302
+ - 禁止绕过 `scripts/service.sh list` 直接保存服务;创建或修改前必须先查询候选并完成资料校验。
303
+ - 禁止用调试、排障或重试作为理由尝试近似 MCP 方法。
309
304
 
310
305
  ---
311
306
 
@@ -333,5 +328,5 @@ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call a2a-pay-service.saveBaza
333
328
  ❌ 禁止:使用虚拟或自行推断的 MCP 方法
334
329
  ❌ 禁止:修改服务时只传入部分字段(必须传入 serviceId + 所有服务信息)
335
330
  ❌ 禁止:用户选择"修改"后不收集完整服务信息直接提交
336
- ❌ 禁止:服务数量 ≥ 20 时仍调用 saveBazaarServiceForMcp 创建新服务
331
+ ❌ 禁止:服务数量 ≥ 10 时仍调用 saveBazaarServiceForMcp 创建新服务
337
332
  ```
@@ -0,0 +1,62 @@
1
+ # 支付宝 AI 付 Skill
2
+
3
+ ## 支持范围
4
+
5
+ 仅支持按量付费、网站支付、APP 支付。明确要求当面付、付款码、订单码支付、JSAPI 支付、预授权支付或商家扣款时不得改判;读取 `normal/rejection-guide.md` 输出受控拒绝消息。
6
+
7
+ 网站支付覆盖 PC 网页与手机浏览器/H5,固定使用 `alipay.trade.page.pay`;签约固定 `productType=webpay`、`salesCode=I1080300001000041203`、`appType=PC_WEB`,不得把 `PC_WEB` 解释为仅 PC。
8
+
9
+ ## 执行红线
10
+
11
+ 1. **流程与确认**:按当前 flow 顺序执行。阻塞确认等待用户对当前摘要明确回复,禁止以催促、工具超时、默认值或 Task 状态代替;不得增加未登记的操作、材料或确认。
12
+ 2. **事实与依据**:禁止编造配置、状态、结果或规则。无当前实现、实际返回或官方依据时明确无法确认;额度解限、可收款时间和产品开通问题引导至[支付宝商家平台](https://b.alipay.com/page/portal/home),代码、应用创建和发布问题引导至[支付宝开放平台](https://open.alipay.com/)或[支付宝技术支持](https://opensupport.alipay.com/support/intelligent-services?form=payskill)。静态扫描或提交成功不代表最终完成。
13
+ 3. **CLI/MCP 契约**:优先执行动作处脚本;确需直调时,完整方法和 JSON 只能来自已读文档或 `alipay-cli mcp list <server> --json` 实时 schema。遇到 `Server not found`、`Method not found`、`Invalid params` 立即停下核对,禁止尝试近似名称。
14
+ 4. **联网权限**:`alipay-cli` 登录/MCP、文件上传、沙箱创建和下载按联网命令处理;环境支持显式授权时首次执行即申请,详见 `normal/alipay-cli-env.md`。
15
+ 5. **用户文件**:只修改已确认项目和范围;不得清空或删除既有项目。“新建/重做/换一个”不是删除授权;具体删除仍遵守 Integration flow 的清单、二次确认和禁删边界。
16
+ 6. **敏感信息**:应用公钥只能由用户生成并明确提供;禁止请求或处理生产私钥,禁止生成密钥对、补全/改写公钥或添加 PEM 头尾。敏感值、临时 URL 和沙箱资料严格遵守对应 flow/script 的白名单、权限与输出边界。
17
+ 7. **沙箱结论**:真实快速沙箱配置不得用占位值;唯一固定例外是按量付费沙箱 `service_id=api_mock_service_id`,生产禁用。`CREATE_PENDING|VERIFY_PENDING` 可继续代码实现,但阻止字段使用、摘要、后置校验、联调和付款体验。字段校验不等于支付测试;只有按量付费完整 402 链路满足 flow 条件才可称沙箱测试通过。
18
+ 8. **异步通知**:网站支付/APP 支付必须实现通知处理。本地无公网 HTTPS `notify_url` 时可不传该字段并用交易查询验收,将公网通知联调列为人工待验证;生产上线前必须恢复公网通知并完成验签、幂等、关键字段校验、`success` 回写和补偿查询,未完成不得宣称生产就绪。
19
+ 9. **受控页面**:授权链接只由 `auth.sh` 在固定产品/MCC 上下文中生成,只允许 `https://aipay.alipay.com/cli-auth` 及登记参数;禁止使用 CLI `verification_url`。公钥确认页、自动打开和兜底同样只走登记脚本。
20
+ 10. **对客输出**:指定 renderer/脚本时,stdout 是唯一对客正文,必须原文回复且不加旁白;工具输出记录、折叠面板或日志不等于已对客发送。登记脚本的内部事实行统一以 `ALIPAY_AIPAY_INTERNAL:` 开头;唯一例外是 `self_update.mjs` 使用 `self-update.md` 登记的 `SELF_UPDATE:*` stderr 终态 marker。两类内部行即使被宿主合并展示也必须整行剔除,严禁对客。所有 `postRenderHintType=scanReturn` 的页面消息都是交付屏障,当前包括 `auth.page` 和 `application.key.page`:页面 stdout 必须先作为独立对客消息送达,再继续受控 opener 和有限轮询;不得把后续 `auth.pending`、`application.key.pending` 或收口消息合并进同一条对客回复。该屏障不要求用户确认,也不新增用户操作。阻塞正文后等待;成功且剔除内部行后正文为空时直接转移,不补写话术。
21
+ 11. **确定性转移**:固定脚本终态后立即转移;只执行动作处登记命令,禁止追加 `jq/cat/grep/curl` 或临时脚本重复解析同一结果。失败只走登记恢复分支;项目自检不得绕过 Skill 脚本或打印敏感配置。
22
+
23
+ ## 标准消息
24
+
25
+ `normal/json/customer-messages.json` 是稳定对客正文唯一目录。Integration 的启动和收口分别使用 `integration_message_runner.mjs start-confirm`、`integration_message_runner.mjs checklist-result`;Onboarding 的 MCC、发现摘要、材料、候选事实和收口使用 `onboarding_message_runner.mjs`;授权、公钥页、密钥工具和错误使用动作处登记脚本。`process.partial_result` 必须发送 closeout runner 的完整 stdout,不得缩写、重排或手写替代;网站支付收口缺少 runner 派生的上线前关键点或收款限制引导时,视为未正确发送标准收口。只有无托管入口时才直调 renderer:
26
+
27
+ ```bash
28
+ node normal/scripts/render_customer_message.mjs --schema <messageId> --variant <VARIANT>
29
+ printf '%s' "$MESSAGE_INPUT_JSON" | node normal/scripts/render_customer_message.mjs <messageId> --variant <VARIANT>
30
+ ```
31
+
32
+ 动态值只由动作处 `jq -cn --arg/--argjson` 构造,无变量传 `{}`;禁止字符串替换或 `eval`。renderer 返回 `MESSAGE_RENDER_ERROR` 时必须先复查同一 `messageId` + `variant` schema,禁止猜枚举;非 0 时停止,不手写兜底。
33
+
34
+ Skill 相对命令以包含命令的 Markdown 文件目录为 workdir;项目命令以 runner 确认的规范化绝对项目根为 workdir。不得猜 cwd、扫描大目录、切换 Skill 副本或混用两类 workdir。
35
+
36
+ ## 入口路由
37
+
38
+ 根 `SKILL.md` 启动器已经在读取本文件前确定本轮有效版本。运行时禁止再次执行自更新、读取 `normal/self-update.md` 或切换其他 Skill 副本;只识别原始用户请求的根意图并加载当前意图入口:
39
+
40
+ | 意图 | 判定 | 入口 | 后续按需加载 |
41
+ |---|---|---|---|
42
+ | `integration_only` | 只要求代码开发、支付集成或集成排障,未同时要求产品开通 | `integration/flow.md` | 当前产品/语言的契约、示例和脚本 |
43
+ | `onboarding_only` | 只要求签约、入驻或产品开通,未同时要求代码开发 | `onboarding/flow.md` | 当前授权、查询或写分支模块 |
44
+ | `full_process` | 明确要求完整接入、一站式,或同一请求同时要求代码开发和产品开通 | `normal/full-process-routing.md` | 先 Integration,满足衔接条件后 Onboarding |
45
+
46
+ 进入 `onboarding_only`,或 `full_process` 从 Integration 衔接 Onboarding 时,必须先执行 Onboarding flow 登记的 `onboarding_message_runner.mjs platform-entry`。Windows 只发送 runner 登记的支付宝 AI 付站点引导并停止 Skill 内产品开通;非 Windows stdout 为空并继续既有流程。该门禁必须早于产品/MCC 澄清、方案确认和环境检查,不得手写或重复提示。
47
+
48
+ 识别出本轮根意图后,立即从本文件目录执行 `node normal/scripts/telemetry.mjs start-run --root-intent <integration_only|onboarding_only|full_process>` 确定当前流程 `run_id` 并上报 `run.intent_detected`;如果根请求中的产品已能唯一确定,必须追加 `--product-type <aipay|webpay|apppay>`,例如 `node normal/scripts/telemetry.mjs start-run --root-intent full_process --product-type webpay`,只有产品尚不唯一时才省略并允许首个事件 `product_type=UNKNOWN`。`start-run` 按当前 Agent 会话的 `root_intent + product_type` 判定复用或新建:组合未发生实质变化时复用既有 `run_id`,不按经过时长自动失效;`UNKNOWN` 补全为明确产品时仍复用同一 `run_id` 并更新产品;只有明确换产品、切换根意图、已有 run 已终态,或当前宿主项目 ID 与既有 `run_id` 不一致时才重建 run state。若当前环境可识别 `COZE_PROJECT_ID`、`MEOO_PROJECT_ID`,或 `MIAODA` 环境下的 `VITE_APP_ID`/`PLATFORM_ID`,新建 run 时直接使用该项目 ID 作为 `run_id`;否则才生成随机 UUID。后续 `stage` 隐式复用当前 run 时,若显式传入的根意图或产品与当前 run 不兼容,则静默跳过该事件且不改写 run state。该脚本 stdout 为空;stderr 只允许出现 `ALIPAY_AIPAY_INTERNAL:` 内部事实行。耗时采集默认开启,可用 `ALIPAY_AIPAY_TELEMETRY=0|false|off|no` 关闭;前台只写入用户系统临时目录下带 `alipay-aipay` 标识的本地私有 outbox(默认 `<os.tmpdir>/alipay-aipay-telemetry/outbox`)并启动后台补传,不等待 collector HTTP 结果;后台通过 sync-log 上报,只在 collector 返回 HTTP 2xx 后删除 outbox,其他 HTTP 状态或网络失败都静默保留待后续重试,并把最近失败状态写入同一临时目录下的 `upload-status.json` 供内部排查。模型维度 `d3` 只读取宿主参考实现使用的 `AIPAY_MODEL`,缺失时上报 `unknown`,不得读取用户项目中的通用 `MODEL` 猜测。需要排查时可执行 `node normal/scripts/telemetry.mjs upload-status` 读取内部状态;该状态不得对客展示。若最近失败是 `ENOTFOUND|EAI_AGAIN|ECONNREFUSED|ECONNRESET|ETIMEDOUT|EHOSTUNREACH|ENETUNREACH|NETWORK_UNREACHABLE` 且 outbox 仍有积压,Agent 可执行 `node normal/scripts/telemetry.mjs permissioned-flush-needed`;只有该命令输出内部 `PERMISSIONED_FLUSH_NEEDED=true` 时,才通过宿主工具层申请一次可复用联网执行权限来运行 `node normal/scripts/telemetry.mjs flush-outbox`(即 `flush-outbox` 异步父命令),该命令只启动后台补传子进程并立即返回,建议绑定同一命令前缀。同一 Agent 会话只请求一次;用户拒绝或后台补传失败都继续主流程并保留 outbox。一旦本会话已获该联网执行权限,后续阶段间隔和流程收尾可旁路再次执行 `flush-outbox` 触发异步补传,尽量清空积压;该命令 stdout 为空,collector HTTP 结果、失败或待重试结果不得作为业务转移或完成条件。本地 outbox 或 run state 写失败时只输出内部 `TELEMETRY_ERROR` 并尽量写入诊断状态,不阻塞主流程。维护/测试进程不复用默认 run state、不远端上传,不增加业务确认或标准对客正文。
49
+
50
+ 用户明确要求“重新开始/重新走流程/作废本轮流程”但“仅代码开发/仅产品开通/完整接入 + 产品”组合没有变化时,不重开根流程,继续复用当前 `run_id` 如实记录后续 stage;只有明确换产品、切换根意图或已有 run 已终态时才重建根流程状态。宿主提供第三方项目 ID 时,该 ID 固定作为项目维度 `run_id`;同一项目内换产品、换根意图或开始新一轮时可重建 run state,但 `run_id` 仍复用该项目 ID。`integration_only` 在 checklist 最终消息成功生成后自动记录 `run.terminal`;`full_process` 的 Integration 收尾不结束 run,只在 Onboarding 最终 closeout 后结束;`onboarding_only` 同样在最终 closeout 后结束。需要内部查看当前 `run_id` 时,只能执行 `node normal/scripts/telemetry.mjs current-run-id` 读取 `ALIPAY_AIPAY_INTERNAL:RUN_ID=<run_id>`,不得为查看而新建 run。`run_id` 是 Skill 时间戳事件的流程主键;Skill 封装的 `alipay-cli` 业务调用必须同时继承 `PLATFORM=${DEV_TOOL_NAME}` 与 `PLATFORM_ID=<run_id>`,由脚本自动设置,Agent 不得手写环境变量前缀或改写 MCP payload。
51
+
52
+ 三种入口均只在无法从已有产品名称或业务描述可靠确定唯一产品时执行 flow 登记的 `product.clarify` renderer;不得推定或手写澄清。产品明确但 MCC 仍不唯一时,Onboarding 按 flow 使用 `onboarding_message_runner.mjs mcc-candidates` 或 `mcc-clarify`。
53
+
54
+ 代码开发或完整接入缺少项目位置/技术栈时,执行 `integration.context.required` 或 `integration.project_path.required` 标准消息。新项目和复用项目先分流;`PROJECT_INPUT` 保留用户原始表达,明确“新建/创建”项目、网站、商城、应用或同类新产物时必须使用 `resolve-project --intent new`,不得因当前目录已有项目改写为现有项目。未知现有项目用 runner 轻量定位候选,所有路径再由 `resolve-project` 解析。未补齐前不得初始化、安装依赖或修改文件。
55
+
56
+ 每轮代码开发只渲染一次 `integration.start.confirm`:`integration_only/full_process` 复用同一次检查器事实,本轮整体必须覆盖 Integration 步骤 1 至步骤8:代码开发校验;`full_process` 在确认前已完成步骤 1,确认后直接进入步骤 3。Onboarding 仍保留方案确认和服务修改确认;签约材料完整后直接提交、服务创建摘要后直接创建、新建应用公钥校验成功后直接提审,不增加回复 `1`。
57
+
58
+ 扫码页非阻塞:授权最多查 12 次、间隔 5 秒,公钥最多查 20 次、间隔 2 秒;成功即推进,耗尽才用 pending 消息等待 `1`,随后只查询一次。
59
+
60
+ `full_process` 启动确认前仅准备项目、语言、当前系统分支环境和沙箱,不进入产品代码或 Onboarding;Windows Integration 未明确要求当前配置沙箱时直接记录 `VERIFY_PENDING`,不新增资料收集操作。确认后直接进入 Integration 步骤 3,不重复确认。代码通过后自动进入 Onboarding;只有沙箱待配置,或沙箱 READY 且仅剩非阻塞人工待验证项时可带“部分通过”继续,其他缺口停在 Integration。最终收口必须保留沙箱和人工待验证项。
61
+
62
+ 仅代码开发结束时提醒仍需产品开通;仅产品开通结束时提醒仍需代码开发。机器规则、消息目录、fixture 和测试不作为默认必读内容。