@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
@@ -1,37 +1,25 @@
1
1
  # 应用发布模块
2
2
 
3
- > 本文档定义应用发布的完整流程、MCP调用规范和关键处理逻辑。
4
- > 被引用文档:`onboarding/flow.md` → Step 3.1 应用查询 + Step 5.3 应用发布
5
- > 本文档位于 `references/onboarding/modules/`,文中的 `scripts/...` 路径相对本目录;从技能包根目录执行时对应 `references/onboarding/modules/scripts/...`。
3
+ > Onboarding Step 3.1/5.3 的应用发布模块。文中 `scripts/...` 相对本目录。
6
4
 
7
5
  ---
8
6
 
9
7
  ## 功能概述
10
8
 
11
- 负责应用发布全流程,包括查询已有应用、复用/创建应用、公钥设置、审核提交。应用类型支持 `WEBAPP` 和 `MOBILEAPP`。
12
-
13
- **触发条件:**
14
- - 用户说"发布应用"、"创建应用"
15
- - onboarding 登录授权完成后触发应用列表查询;需要签约时,应用复用/创建等后续操作仍在签约提交成功后执行
16
-
17
- > APP支付对应移动应用发布:应用列表查询和应用创建使用 `MOBILEAPP`;网站支付和按量付费继续使用 `WEBAPP`。
9
+ 负责查询、复用/创建、设钥和提审。登录、scope、MCC 通过后查询;应用分支不依赖签约提交。APP 支付使用 `MOBILEAPP`,网站支付/按量付费使用 `WEBAPP`。
18
10
 
19
11
  ---
20
12
 
21
13
  ## 流程骨架
22
14
 
23
15
  ```
24
- 前置阶段 0: 初始化 .gitignore(防止密钥文件泄露)
25
- ↓
26
16
  前置阶段 1: 检查 CLI 登录态
27
17
  ↓
28
18
  阶段 2: 登录后查询已有应用 (queryApplicationList)
29
19
  ↓
30
- 阶段 3: 与签约状态/其他资源合并展示,用户一次选择并提供条件资料
31
- ↓
32
- onboarding 且当前未签约: 先返回主流程完成 Step 5.1 签约提交
20
+ 阶段 3: 三分支短摘要后进入应用类别,用户一次选择并提供应用条件资料
33
21
  ↓
34
- 签约提交成功,或已签约/已提交签约: 执行应用分支
22
+ 应用查询、资料和当前候选选择均满足: 执行应用分支
35
23
  ├─ 【复用】选择已有上线应用 → 查询安全密钥
36
24
  │ ├─ RSA2 应用公钥已生效 → 导出 alipayPublicKey → 完成
37
25
  │ └─ RSA2 应用公钥未生效 → 停止复用成功结论,由用户选择设钥或返回应用决策
@@ -48,17 +36,16 @@ onboarding 且当前未签约: 先返回主流程完成 Step 5.1 签约提交
48
36
 
49
37
  ---
50
38
 
51
- ## MCP调用
39
+ ## 当前主流程 MCP 调用
52
40
 
53
- | 方法 | 用途 |
41
+ | MCP 方法 | 用途 |
54
42
  |------|------|
55
- | `queryApplicationList` | 查询同类型已有应用 |
56
- | `createApplication` | 创建应用 |
57
- | `queryApplicationInfo` | 查询应用信息 |
58
- | `queryApplicationDetail` | 查询应用详情 |
59
- | `createKeyConfirmPage` | 创建密钥确认页 |
60
- | `queryApplicationSecurityKey` | 查询应用安全密钥 |
61
- | `submitApplicationAudit` | 提交应用审核 |
43
+ | `apprelease.queryApplicationList` | 查询同类型已有应用 |
44
+ | `apprelease.createApplication` | 创建应用 |
45
+ | `apprelease.queryApplicationInfo` | 复用路径校验应用信息 |
46
+ | `apprelease.createKeyConfirmPage` | 创建密钥确认页 |
47
+ | `apprelease.queryApplicationSecurityKey` | 查询应用安全密钥 |
48
+ | `apprelease.submitApplicationAudit` | 提交应用审核 |
62
49
 
63
50
  ## 应用类型规则
64
51
 
@@ -68,7 +55,7 @@ onboarding 且当前未签约: 先返回主流程完成 Step 5.1 签约提交
68
55
  |------|-------------|-----------|----------|--------------|--------------|
69
56
  | 按量付费 | `aipay` | `I1080300001000160457` | `WEBAPP` | `{"request":{"appTypes":["WEBAPP"]}}` | `{"request":{"applicationType":"WEBAPP","createScene":"cli"}}` |
70
57
  | 网站支付 | `webpay` | `I1080300001000041203` | `WEBAPP` | `{"request":{"appTypes":["WEBAPP"]}}` | `{"request":{"applicationType":"WEBAPP","createScene":"cli"}}` |
71
- | APP支付 | `apppay` | `I1080300001000041313` | `MOBILEAPP` | `{"request":{"appTypes":["MOBILEAPP"]}}` | `IOS` 需补充 `mobilePlatform`+`bundleId`;`ANDROID` 需补充 `mobilePlatform`+`appPackage`+`appSign`;`ALL` 需三项都传 |
58
+ | APP 支付 | `apppay` | `I1080300001000041313` | `MOBILEAPP` | `{"request":{"appTypes":["MOBILEAPP"]}}` | Skill 仅支持 `IOS`、`ANDROID`、`ALL`;HarmonyOS 移动应用须前往支付宝开放平台控制台创建 |
72
59
 
73
60
  `scripts/app.sh` 的应用类型解析规则:
74
61
 
@@ -78,11 +65,12 @@ onboarding 且当前未签约: 先返回主流程完成 Step 5.1 签约提交
78
65
 
79
66
  `MOBILEAPP` 平台字段规则:
80
67
 
81
- - `alipay-aipay` 当前要求 APP支付创建 `MOBILEAPP` 前必须明确 `mobilePlatform`,禁止用最小入参创建 `MOBILEAPP`。
82
- - `mobilePlatform` 允许 `IOS`、`ANDROID` 或 `ALL`;`ALL` 表示同时支持 iOS 和 Android。
68
+ - `alipay-aipay` 当前要求 APP 支付创建 `MOBILEAPP` 前必须明确 `mobilePlatform`,禁止用最小入参创建 `MOBILEAPP`。
69
+ - `mobilePlatform` 只允许 `IOS`、`ANDROID` 或 `ALL`;`ALL` 只表示同时支持 iOS 和 Android。
83
70
  - `mobilePlatform=IOS`:必须同时传 `bundleId`。
84
71
  - `mobilePlatform=ANDROID`:必须同时传 `appPackage` 和 `appSign`。
85
72
  - `mobilePlatform=ALL`:必须同时传 `bundleId`、`appPackage` 和 `appSign`。
73
+ - HarmonyOS 移动应用禁止调用 `scripts/app.sh create`,也不得向 `createApplication` 传入推测的 HarmonyOS 平台或审核字段。必须执行 `printf '%s' '{}' | node ../../normal/scripts/render_customer_message.mjs application.harmony.manual_create --variant DEFAULT`,引导用户前往支付宝开放平台控制台创建。
86
74
  - 用户说“bundle_id”时,映射到脚本参数 `--bundle-id`,MCP 请求字段为 `bundleId`。
87
75
  - `appSign` 是 Android 应用签名摘要字段,只在创建 `MOBILEAPP` 时作为 `createApplication` 入参采集;它不是应用公钥、支付签名串或私钥。
88
76
  - 采集 `appSign` 时只要求用户提供其 Android 应用对应的签名摘要值;不得引导用户通过支付宝开放平台官方密钥生成工具、签名工具或格式转换工具获取,也不得把阶段 4 的应用公钥生成引导套用到 `appSign`。
@@ -98,13 +86,12 @@ onboarding 且当前未签约: 先返回主流程完成 Step 5.1 签约提交
98
86
 
99
87
  | 方法 | 必需参数 | 参数结构 | 是否需要 ctx |
100
88
  |------|----------|----------|--------------|
101
- | `queryApplicationList` | `appTypes` | `{"request":{"appTypes":["WEBAPP"]}}` 或 `{"request":{"appTypes":["MOBILEAPP"]}}` | ❌ 不需要 |
102
- | `createApplication` | `applicationType`, `createScene`;APP支付创建 `MOBILEAPP` 时还必须按平台传字段 | `WEBAPP`: `{"request":{"applicationType":"WEBAPP","createScene":"cli"}}`;`MOBILEAPP IOS`: `{"request":{"applicationType":"MOBILEAPP","createScene":"cli","mobilePlatform":"IOS","bundleId":"..."}}`;`MOBILEAPP ANDROID`: `{"request":{"applicationType":"MOBILEAPP","createScene":"cli","mobilePlatform":"ANDROID","appPackage":"...","appSign":"..."}}`;`MOBILEAPP ALL`: `{"request":{"applicationType":"MOBILEAPP","createScene":"cli","mobilePlatform":"ALL","bundleId":"...","appPackage":"...","appSign":"..."}}` | ❌ 不需要 |
103
- | `queryApplicationInfo` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
104
- | `queryApplicationDetail` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
105
- | `createKeyConfirmPage` | `appId`, `signType`, `publicKey` | `{"request":{"appId":"...","signType":"RSA2","publicKey":"..."}}` | ❌ 不需要 |
106
- | `queryApplicationSecurityKey` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
107
- | `submitApplicationAudit` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
89
+ | `apprelease.queryApplicationList` | `appTypes` | `{"request":{"appTypes":["WEBAPP"]}}` 或 `{"request":{"appTypes":["MOBILEAPP"]}}` | ❌ 不需要 |
90
+ | `apprelease.createApplication` | `applicationType`, `createScene`;APP 支付通过 Skill 创建 `MOBILEAPP` 时还必须按受支持平台传字段 | `WEBAPP`: `{"request":{"applicationType":"WEBAPP","createScene":"cli"}}`;`MOBILEAPP IOS`: `{"request":{"applicationType":"MOBILEAPP","createScene":"cli","mobilePlatform":"IOS","bundleId":"..."}}`;`MOBILEAPP ANDROID`: `{"request":{"applicationType":"MOBILEAPP","createScene":"cli","mobilePlatform":"ANDROID","appPackage":"...","appSign":"..."}}`;`MOBILEAPP ALL`: `{"request":{"applicationType":"MOBILEAPP","createScene":"cli","mobilePlatform":"ALL","bundleId":"...","appPackage":"...","appSign":"..."}}` | ❌ 不需要 |
91
+ | `apprelease.queryApplicationInfo` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
92
+ | `apprelease.createKeyConfirmPage` | `appId`, `signType`, `publicKey` | `{"request":{"appId":"...","signType":"RSA2","publicKey":"..."}}` | ❌ 不需要 |
93
+ | `apprelease.queryApplicationSecurityKey` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
94
+ | `apprelease.submitApplicationAudit` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
108
95
 
109
96
  ### 正确调用示例
110
97
 
@@ -116,41 +103,25 @@ onboarding 且当前未签约: 先返回主流程完成 Step 5.1 签约提交
116
103
  # ✅ 创建指定平台移动应用 → scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform IOS --bundle-id <bundleId>
117
104
  # ✅ 创建 Android 移动应用 → scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform ANDROID --app-package <appPackage> --app-sign <appSign>
118
105
  # ✅ 创建 iOS + Android 移动应用 → scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform ALL --bundle-id <bundleId> --app-package <appPackage> --app-sign <appSign>
119
- # ✅ 设置公钥 → scripts/app.sh key <appId> <publicKey>
120
- # ✅ 确认公钥 → scripts/app.sh verify-key <appId> [publicKey]
121
- # ✅ 提交审核 → scripts/app.sh audit <appId>
106
+ # ❌ HarmonyOS 移动应用不通过 Skill 创建 → 执行 renderer 命令输出 application.harmony.manual_create,并前往支付宝开放平台控制台
107
+ # ✅ 设置公钥 → scripts/app.sh key --defer-open <appId> <publicKey>,页面 stdout 独立送达后 scripts/app.sh open-key-page <appId>
108
+ # ✅ 新建应用确认公钥并提审 → scripts/app.sh verify-key-and-audit <appId> [publicKey]
109
+ # ✅ 复用应用确认公钥 → scripts/app.sh verify-key <appId> [publicKey]
110
+ # ✅ 独立提审恢复 → scripts/app.sh audit <appId>
122
111
  ```
123
112
 
124
- 其他未封装为独立脚本的 MCP 方法(queryApplicationInfo、queryApplicationDetail)请根据参数结构对照表构建调用。`queryApplicationSecurityKey` 的公钥确认、支付宝公钥导出已封装在 `scripts/app.sh verify-key|reuse|audit` 中。
113
+ 表中全部方法都由 `scripts/app.sh` 的公开子命令或其内部复用、校验路径调用。参数表用于维护时核对冻结契约,不授权 Agent 绕过脚本直调 MCP;当前脚本没有对应入口时必须停止,不得根据参数表自行构造调用。
125
114
 
126
- ### 禁止调用示例
115
+ ### 禁止调用形态
127
116
 
128
- ```bash
129
- # ❌ 最常见错误:添加 ctx,且省略必需的 appTypes
130
- export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
131
- -d '{"request":{"pageSize":10,"pageNum":1},"ctx":{}}' \
132
- --json 2>/dev/null
133
-
134
- # ❌ 错误:添加 ctx 参数(应用相关 MCP 调用不需要 ctx)
135
- export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
136
- -d '{"request":{"appTypes":["WEBAPP"]},"ctx":{}}' \
137
- --json 2>/dev/null
138
-
139
- # ❌ 错误:受 ar-sign 上下文影响使用错误的参数结构
140
- export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
141
- -d '{"request":{"salesProductCodes":["<salesProductCode>"]},"ctx":{}}' \
142
- --json 2>/dev/null
143
-
144
- # ❌ 错误:省略 request 包裹层
145
- export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
146
- -d '{"appTypes":["WEBAPP"]}' \
147
- --json 2>/dev/null
148
-
149
- # ❌ 错误:APP支付仍按 WEBAPP 查询/创建应用
150
- export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
151
- -d '{"request":{"appTypes":["WEBAPP"]}}' \
152
- --json 2>/dev/null
153
- ```
117
+ 运行时只执行 `scripts/app.sh`,不得把下列错误形态展开成可执行命令:
118
+
119
+ - 应用请求增加 `ctx`;
120
+ - 应用列表省略必需的 `request.appTypes`,或省略 `request` 包裹层;
121
+ - 把签约查询的 `salesProductCodes` 混入应用列表请求;
122
+ - APP 支付按 `WEBAPP` 查询或创建应用。
123
+
124
+ 这些条目只用于说明参数边界,不是排障候选。脚本返回参数错误时停止当前应用分支并核对冻结契约,禁止逐项尝试错误形态。
154
125
 
155
126
  ### 应用模块与签约模块参数结构对比
156
127
 
@@ -173,56 +144,50 @@ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicat
173
144
 
174
145
  **⚠️ 重要:在创建应用前必须先查询当前主体下是否已有可复用的应用。** 执行 `scripts/app.sh list --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"`。
175
146
 
176
- 在 onboarding 中,本查询必须在登录授权成功后与签约状态查询连续执行,不等待签约提交。查询结果与签约状态合并展示,新建分支的条件资料也与未签约材料一次性收集。只读查询前置不代表可以提前创建应用;需要签约时仍先提交签约。
147
+ 在 onboarding 中,本查询必须在登录、scope 和 MCC 校验成功后与其他适用只读查询连续执行,不等待签约提交。查询结束后先进入三分支短摘要,轮到应用类别时一次收集当前应用决策所需条件资料。创建应用必须完成应用分支自己的候选重查;用户针对当前候选明确选择 `新建` 即为创建意图确认,重查未变化且条件字段齐备时直接创建,不以签约提交成功作为前置,也不增加第二次回复 `1`。
177
148
 
178
149
  `productType` / `salesCode` 在此只用于校验上下文并选择 `WEBAPP` 或 `MOBILEAPP`。`queryApplicationList` 请求只按应用类型查询,因此返回项只能表述为“与当前产品所需应用类型匹配的候选应用”,不得表述为已绑定当前支付产品。
179
150
 
180
151
  ### 返回结果处理
181
152
 
182
- `scripts/app.sh list --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"` 自动完成以下处理,输出应用列表并引导用户选择。`FLOW:CREATE_NEW` 只表示当前类型应用列表确实为空;`FLOW:SELECT` 表示存在可复用上线应用;`FLOW:PENDING_APPLICATIONS` 表示只存在不可复用的非上线应用,需要用户明确等待或新建:
153
+ `scripts/app.sh list --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"` 自动完成查询、清洗和校验。成功时不输出对客正文,只产生带 `ALIPAY_AIPAY_INTERNAL:` 前缀的唯一 `APP_CANDIDATES_JSON`、`APPLICATION_TYPE`、`FLOW:CREATE_NEW|SELECT|PENDING_APPLICATIONS` 和可复用候选的完整 `APP_CANDIDATE_ID`。Step 3.1 的全部发现查询和短摘要完成后,轮到应用类别时必须把该结构化快照交给 `onboarding_message_runner.mjs application-candidates`,由其一次输出事实表和适用的 `ONLINE_OR_NEW` 或 `PENDING_OR_NEW` 固定选择提示。禁止提前展示、手工拼表、压缩成纯 appId 列表、拆开渲染或另写提示。用户选择只接受本轮内部事实登记且已在事实表展示的完整 `APP_CANDIDATE_ID`,不接受序号、历史候选或 Agent 自报值:
183
154
 
184
- 保留本次查询的候选 `appId` 和实际状态,供用户序号选择和新建前重查比对。不保存与决策无关的完整接口响应。
155
+ ```bash
156
+ printf '%s' "$APP_CANDIDATES_JSON" \
157
+ | node ../../normal/scripts/onboarding_message_runner.mjs application-candidates --application-type "$APPLICATION_TYPE"
158
+ ```
185
159
 
186
160
  | 结果 | 处理方式 |
187
161
  |------|----------|
188
162
  | 查询失败 | 直接返回错误并停止应用分支;仅当前会话仍有效的独立业务/服务/结构错误可继续其他只读查询、候选展示和独立资料采集。认证失败或授权不匹配按 `../flow.md` Step 3.1 立即停止查询组并重新授权;应用查询恢复前禁止应用复用或创建 |
189
163
  | 命中 ON_LINE 应用 | 返回已有上线应用列表,让用户选择"复用上线应用"或"新建应用" |
190
- | 无同类型应用 | 记录新建分支并一次性收集条件资料;onboarding 未签约时等待签约提交成功后再创建 |
164
+ | 无同类型应用 | 记录新建分支,轮到应用类别时一次性收集条件资料;满足应用分支写前条件后创建 |
191
165
  | 存在同类型应用但均非 ON_LINE | 展示应用 ID、名称和实际状态,说明当前不可复用;等待用户选择暂不新建或明确新建,禁止自动进入创建 |
192
166
 
193
167
  ### ⛔ 应用复用强制原则
194
168
 
195
169
  <important>
196
- 只有状态为 `ON_LINE` 的应用才允许作为可复用候选。非 `ON_LINE` 应用可以作为不可复用的状态提示展示,用于防止重复创建,但禁止出现在复用序号中。
170
+ 只有状态为 `ON_LINE` 的应用才允许作为可复用候选。非 `ON_LINE` 应用可以作为不可复用的状态提示展示,用于防止重复创建,但禁止作为复用目标。
197
171
 
198
- - 可复用候选和复用序号只允许包含 `ON_LINE` 状态的应用
172
+ - 可复用候选和允许回复的完整 appId 只允许包含 `ON_LINE` 状态的应用
199
173
  - 用户指定某个 `appId` 要复用时,必须先查询该应用状态
200
174
  - 状态不是 `ON_LINE` 时,禁止复用
201
175
  - 用户坚持要求复用非 `ON_LINE` 应用时,直接拒绝该复用请求;是否新建必须由用户在看到现有非上线应用后明确选择,不得自动进入新建
202
176
  - 复用已有 `MOBILEAPP` 时不采集、不传入 `mobilePlatform`、`bundleId`、`appPackage`、`appSign`;平台字段只属于新建 `MOBILEAPP` 的 `createApplication` 入参
203
177
  </important>
204
178
 
205
- ### 用户选择输出格式
206
-
207
- ```
208
- 📋 发现您已有以下上线应用:
209
-
210
- | 序号 | 应用ID | 应用名称 | 状态 |
211
- |------|--------|----------|------|
212
- | 1 | 2021001234567890 | 我的网站应用 | 已上线 |
213
- | 2 | 2021001234567891 | 我的测试应用 | 已上线 |
179
+ ### 用户选择绑定
214
180
 
215
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
216
- 请选择操作:
217
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
181
+ 存在 `ON_LINE` 候选时允许回复当前完整 appId 或 `新建`;只有非上线应用时允许 `新建`、`暂不新建`;列表为空时只进入新建。选择复用后,后续 `reuse/key/verify-key/audit` 必须逐字使用同一 appId;选择新建后,`key/verify-key-and-audit/audit` 必须逐字使用本轮 `create` 返回的 appId。创建前重新执行相同 `app.sh list`,并只通过本模块“创建前列表重查”的 runner 比较前后候选;候选变化时旧选择失效。
218
182
 
219
- 【复用】输入序号 1 或 2 → 复用对应应用
220
- 【新建】输入 "新建" → 创建新应用
183
+ 选择“新建”后需要应用公钥;如果是 APP 支付,首次材料提示必须执行下方固定 runner,一次展示所有可创建平台组合并在一条回复中收集所选组合全部资料,禁止先单独询问 `mobilePlatform`。用户可以在选择“新建”的同一条回复中提前提供这些字段和应用公钥,Agent 不得在每个字段之间逐轮询问。创建前只能由固定列表 runner 再查询一次;候选快照未变化且字段齐备时直接调用创建脚本,变化时旧决策失效并重新渲染选择提示,不展示第二份创建确认摘要。
221
184
 
222
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
185
+ ```bash
186
+ printf '%s' '{}' \
187
+ | node ../../normal/scripts/onboarding_message_runner.mjs material-collect --category application --state APP_MOBILE_INITIAL --product-type "$PRODUCT_TYPE"
223
188
  ```
224
189
 
225
- 展示候选应用时同步说明:选择“新建”后需要应用公钥;如果是 APP支付,还需要一次性提供平台及对应字段。用户可以在选择“新建”的同一条回复中提前提供这些字段,Agent 不得在每个字段之间逐轮询问。
190
+ renderer 固定解释 `IOS`、`ANDROID`、`ALL` 及所需资料。用户回复后按所选组合一次校验;缺少字段使用 `PARTIAL`,校验失败使用 `INVALID`,并只使用 `iOS Bundle ID(bundleId)`、`Android 应用包名(appPackage)`、`Android 应用签名摘要(appSign)` 三个对客字段名。内部 `mobilePlatform/bundleId/appPackage/appSign` 仍按既有脚本参数映射,不改变 MCP 请求。
226
191
 
227
192
  ### 复用成功后流程
228
193
 
@@ -250,30 +215,40 @@ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicat
250
215
  - 支付宝公钥导出:检查 `alipayKeyList` 中 `signType="RSA2"` 的项并读取非空 `alipayPublicKey`。
251
216
  - `securityKeys` 仅作为旧返回结构兼容来源。不得因为 `alipayKeyList[].certInfoDTO` 为空,就忽略 `securityConfigList[].partnerPublicKey` 并误判应用未配置公钥。
252
217
 
253
- > 复用应用的完整处理(查询密钥 + 确认 RSA2 应用公钥 + 导出支付宝公钥)已封装在 `scripts/app.sh reuse <appId>` 中。应用公钥未确认时输出 `FLOW:REUSE_NO_KEY`;RSA2 项未返回 `alipayPublicKey` 时输出 `FLOW:ERROR`;已取得支付宝公钥但未能写入本地时,仍输出 `FLOW:REUSE_SUCCESS` 和 `ALIPAY_PUBLIC_KEY_EXPORT_STATUS=MANUAL_CONFIGURATION_REQUIRED`。
218
+ > 复用应用的完整处理(查询密钥 + 确认 RSA2 应用公钥 + 导出支付宝公钥)已封装在 `scripts/app.sh reuse <appId>` 中。带 `ALIPAY_AIPAY_INTERNAL:` 前缀的 `FLOW:REUSE_NO_KEY` 表示应用公钥未确认,`FLOW:ERROR` 表示 RSA2 项未返回 `alipayPublicKey` 等错误,`FLOW:REUSE_SUCCESS` 与 `ALIPAY_PUBLIC_KEY_EXPORT_STATUS=MANUAL_CONFIGURATION_REQUIRED` 表示已取得支付宝公钥但本地写入失败。这些机器事实只用于分支和最终标准收口,stdout 成功时为空,禁止对客。
254
219
 
255
- `FLOW:REUSE_NO_KEY` 是阻断结果,脚本返回非零退出码,禁止输出复用成功或把该 `appId` 记为可用于集成的完成产物。向用户合并说明当前所选 `ON_LINE` 应用尚未确认 RSA2 应用公钥,并让用户选择:
220
+ `FLOW:REUSE_NO_KEY` 是阻断结果,脚本返回非零退出码,禁止输出复用成功或把该 `appId` 记为可用于集成的完成产物。对客必须执行下列 renderer 命令,本模块不维护第二份缺钥话术:
256
221
 
257
- 1. 为当前 `appId` 设置应用公钥:按“阶段 4: 设置应用公钥”的标准引导和确认规则执行 `scripts/app.sh key`,用户完成页面确认后自动执行 `scripts/app.sh verify-key`;确认成功后重新执行 `scripts/app.sh reuse <appId>`,由脚本再次校验应用状态并导出支付宝公钥。
258
- 2. 返回应用决策:重新选择其他 `ON_LINE` 应用、新建应用或暂不继续。
222
+ ```bash
223
+ MESSAGE_INPUT_JSON=$(jq -cn --arg appId "$APP_ID" '{appId:$appId}')
224
+ printf '%s' "$MESSAGE_INPUT_JSON" | node ../../normal/scripts/render_customer_message.mjs application.reuse.no_key --variant DEFAULT
225
+ ```
259
226
 
260
- 不得自动生成、补全或持久化用户公钥,不得在用户未选择设钥且未提供完整 `publicKey` 时调用 `createKeyConfirmPage`。重新执行 `reuse` 前不得推定应用仍为 `ON_LINE`;由脚本重新查询实际状态。
227
+ 执行该消息后不再等待用户回复 `1/2`。目标 `appId` 已由用户从当前候选中选定,随后直接进入“阶段 4: 设置应用公钥”的标准工具引导和官方页面确认规则;如果用户在消息后明确要求换应用或新建应用,再返回应用决策。
261
228
 
262
- ### 复用成功输出格式
229
+ 为当前 `appId` 设置应用公钥时,用户提供完整应用公钥后执行 `scripts/app.sh key --defer-open <appId> <publicKey>`;其非阻塞 stdout 必须作为独立对客消息送达后,立即执行 `scripts/app.sh open-key-page <appId>`,再执行 `scripts/app.sh verify-key` 的生产固定最多 20 次有限查询,未成功的相邻查询间隔 2 秒。确认成功后重新执行 `scripts/app.sh reuse <appId>`,由脚本再次校验应用状态并导出支付宝公钥;20 次均未确认时才输出 `application.key.pending`,且不得与前面的 `application.key.page` 合并在同一条对客回复中。用户输入 `1` 后以 `ALIPAY_AIPAY_RECOVERY_QUERY_ONCE=1` 做一次实际查询,不重启自动轮询。
263
230
 
264
- ```
265
- ✅ 应用复用成功
231
+ 不得自动生成、补全或持久化用户公钥,不得在用户未提供完整 `publicKey` 时调用 `createKeyConfirmPage`。重新执行 `reuse` 前不得推定应用仍为 `ON_LINE`;由脚本重新查询实际状态。
266
232
 
267
- | 项目 | 信息 |
268
- |------|------|
269
- | AppId | <appId> |
270
- | 应用状态 | ON_LINE(已上线) |
271
- | 支付宝公钥本地配置 | <导出成功:~/.config/<appId>-alipayPublicKey.keytext;本地写入失败:待手动配置> |
233
+ ### 复用结果输出
234
+
235
+ 固定使用 `application.operation.result`,只传实际 `appId`、状态和下一步;本模块不维护第二份成功表格。必须执行:
236
+
237
+ ```bash
238
+ MESSAGE_INPUT_JSON=$(jq -cn \
239
+ --arg appId "$APP_ID" \
240
+ --arg actualStatus "$ACTUAL_STATUS" \
241
+ --arg nextAction "$NEXT_ACTION" \
242
+ '{appId:$appId,actualStatus:$actualStatus,nextAction:$nextAction}')
243
+ printf '%s' "$MESSAGE_INPUT_JSON" \
244
+ | node ../../normal/scripts/render_customer_message.mjs application.operation.result --variant DEFAULT
272
245
  ```
273
246
 
247
+ `full_process` 中若该应用操作结果后马上进入 onboarding Step 6 最终收口,不单独输出本消息再追加总收口;必须把同样的 `APP_ID`、`ACTUAL_STATUS`、`NEXT_ACTION` 交给 `onboarding_message_runner.mjs closeout` 处理,且 `ACTUAL_STATUS` 必须与最终收口的 `APPLICATION_RESULT` 枚举原文一致。应用已上线且配置完整时不再展开“应用分支结果”;待审核、待设置公钥、需人工配置、失败或结果未知时合并展示为“应用分支结果”。`onboarding_only`、应用分支仍需等待用户补材料/确认,或该结果不是紧邻最终收口时,仍按上方命令输出。
248
+
274
249
  ### 按量付费集成产物
275
250
 
276
- 应用创建、审核提交或复用成功后,必须记录并向用户说明:
251
+ 应用创建、审核提交或复用后,固定使用 `application.operation.result` 输出实际状态和下一步;若紧邻 `full_process` 最终收口,则由 closeout runner 按完成态压缩、非完成态展开的规则处理。必须记录:
277
252
 
278
253
  | 字段 | 用途 |
279
254
  |------|------|
@@ -291,22 +266,33 @@ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicat
291
266
 
292
267
  ### 创建前列表重查
293
268
 
294
- 在展示最终“创建应用”外部写操作摘要前,自动重新执行 `scripts/app.sh list --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"`:
269
+ 在实际创建应用前,自动重新执行 `scripts/app.sh list --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"`:
295
270
 
296
- - 候选 appId 和状态与 Step 3.1 一致:不重复询问用户,继续展示创建摘要。
297
- - 出现新的 `ON_LINE` 或非 `ON_LINE` 应用,或原候选状态变化:展示最新候选,清除旧的应用决策,等待用户基于新状态选择复用、新建或暂不新建。
271
+ - 将本次唯一 `APP_CANDIDATES_JSON` 记为 `RECHECK_APP_CANDIDATES_JSON`,把 Step 3.1 和本次快照交给固定 `application-recheck` runner;禁止 Agent 手工比较、排序或拼表。
272
+ - runner stdout 为空:候选未变化,不重复询问用户;条件字段齐备后直接执行创建。
273
+ - runner stdout 非空:候选发生变化;把 stdout 原文发给用户,清除旧的应用决策,等待用户基于新状态选择复用、新建或暂不新建。
298
274
  - 重查失败:禁止调用 `createApplication`,仅将应用分支标记为待恢复。
299
275
 
300
- 该重查只在 `CREATE` 分支执行,不增加正常复用分支的工具成本,也不替代外部写操作确认。
276
+ 该重查只在 `CREATE` 分支执行,不增加正常复用分支的工具成本。用户针对重查前的当前候选列表明确选择 `新建` 即完成创建意图确认;重查结果未变化且条件字段齐备时直接执行创建,不再追加回复 `1`。结果变化时旧选择失效,必须展示新候选并重新选择。
277
+
278
+ ```bash
279
+ MESSAGE_INPUT_JSON=$(jq -cn \
280
+ --argjson previousCandidates "$APP_CANDIDATES_JSON" \
281
+ --argjson currentCandidates "$RECHECK_APP_CANDIDATES_JSON" \
282
+ '{previousCandidates:$previousCandidates,currentCandidates:$currentCandidates}')
283
+ printf '%s' "$MESSAGE_INPUT_JSON" \
284
+ | node ../../normal/scripts/onboarding_message_runner.mjs application-recheck --application-type "$APPLICATION_TYPE"
285
+ ```
301
286
 
302
287
  执行规则:
303
288
 
304
289
  - 按量付费/网站支付:执行 `scripts/app.sh create --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"`。
305
- - APP支付 iOS:执行 `scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform IOS --bundle-id "<bundleId>"`。
306
- - APP支付 Android:执行 `scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform ANDROID --app-package "<appPackage>" --app-sign "<appSign>"`。
307
- - APP支付 iOS + Android:执行 `scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform ALL --bundle-id "<bundleId>" --app-package "<appPackage>" --app-sign "<appSign>"`。
290
+ - APP 支付 iOS:执行 `scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform IOS --bundle-id "<bundleId>"`。
291
+ - APP 支付 Android:执行 `scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform ANDROID --app-package "<appPackage>" --app-sign "<appSign>"`。
292
+ - APP 支付 iOS + Android:执行 `scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform ALL --bundle-id "<bundleId>" --app-package "<appPackage>" --app-sign "<appSign>"`。
293
+ - APP 支付 HarmonyOS:禁止执行 `scripts/app.sh create`。执行 `printf '%s' '{}' | node ../../normal/scripts/render_customer_message.mjs application.harmony.manual_create --variant DEFAULT`,引导用户前往 `https://open.alipay.com/` 的“控制台” → “创建移动应用”;该人工分支不收集或编造平台字段、审核材料或 MCP 参数。
308
294
 
309
- APP支付缺少平台或对应字段时,先向用户补问,禁止调用 `createApplication`。
295
+ APP 支付 iOS、Android 或二者同时创建时,首次一次展示并收集平台与对应完整资料;缺少或校验失败时只补问受影响字段,禁止调用 `createApplication`。用户选择 HarmonyOS 时不再补问创建字段,直接进入人工创建分支。
310
296
 
311
297
  **一次性新建资料包**:在 onboarding 中优先使用 Step 4 已收集并校验的字段,不重复询问:
312
298
 
@@ -319,13 +305,17 @@ APP支付缺少平台或对应字段时,先向用户补问,禁止调用 `cre
319
305
 
320
306
  Agent 在当前任务中记录应用操作和对应平台字段;用户改变应用类型或移动平台时,清除不再适用的旧平台字段并只补问新条件下的缺失项。应用公钥原文不得写入资料清单,只记录是否已经准备。`scripts/app.sh create` 会先在本地校验应用类型和平台条件字段,校验通过后才调用 MCP。
321
307
 
308
+ ### HarmonyOS 人工创建边界
309
+
310
+ HarmonyOS APP 支付代码开发仍属于 Integration 支持范围,但 onboarding 不通过 Skill 创建 HarmonyOS 移动应用。对客必须执行 `printf '%s' '{}' | node ../../normal/scripts/render_customer_message.mjs application.harmony.manual_create --variant DEFAULT`;用户完成平台操作后重新查询 `MOBILEAPP` 列表。只有实际返回 `ON_LINE` 候选时才能进入既有复用校验;否则应用分支保持人工待办,不调用 `app.sh key/verify-key/verify-key-and-audit/audit`,也不影响签约及其他独立分支按实际结果推进。
311
+
322
312
  | 结果 | 处理方式 |
323
313
  |------|----------|
324
314
  | 创建成功且解析到非空 appId | 获取 appId,进入阶段 4 设置应用公钥 |
325
315
  | 返回成功但未解析到 appId | 按返回结构异常阻断,禁止进入公钥设置流程 |
326
- | 创建失败 | 返回错误,停止后续流程 |
316
+ | 创建失败 | 返回错误并停止应用分支后续动作;签约及其他独立分支仍按实际结果推进 |
327
317
 
328
- 如果 `createApplication` 返回 `APP_MAX_ERROR` / `应用数量达到上限`,不要继续调整 `appSign`、`bundleId`、`mobilePlatform` 等创建参数,也不要重复新建。应明确告知用户当前主体应用数量已达到上限,优先返回阶段 2 复用已有 `ON_LINE` 应用;如必须新建,引导用户前往支付宝开放平台处理应用配额或联系支付宝技术支持。
318
+ 如果 `createApplication` 返回 `APP_MAX_ERROR` / `应用数量达到上限`,不要继续调整 `appSign`、`bundleId`、`mobilePlatform` 等创建参数,也不要重复新建。原样使用 `error_handler.sh` 的固定脱敏错误输出;随后返回阶段 2,只允许复用本轮实际查询到的 `ON_LINE` 应用;没有该候选时应用分支保留人工待办。Agent 不得自行改写配额错误、恢复建议或支持渠道。
329
319
 
330
320
  ---
331
321
 
@@ -345,28 +335,33 @@ Agent 在当前任务中记录应用操作和对应平台字段;用户改变
345
335
  **必须行为:**
346
336
  ```
347
337
  ✅ 必须:引导用户前往支付宝开放平台官方密钥生成工具
348
- ✅ 必须:使用标准引导话术(见下方)
338
+ ✅ 必须:使用下方登记的标准消息 ID
349
339
  ✅ 必须:只接受用户明确输入的完整 publicKey
350
340
  ✅ 必须:提醒用户妥善保管私钥,切勿泄露给任何人
351
341
  ```
352
342
 
353
- **标准引导话术:**
354
- 请前往支付宝开放平台密钥生成工具( https://opendocs.alipay.com/common/02kipk )
355
- 下载并使用官方工具生成应用公私钥对,生成后将应用公钥复制提供给我继续后续流程。
356
- 官方工具生成的私钥格式默认为PKCS#8,部分开发语言仅支持PKCS#1,如果需要转换成PKCS#1,可使用官方工具-格式转换。
357
- **私钥请妥善保管,切勿泄露给任何人。**
343
+ **标准引导消息:** 当目标 `appId` 已确定且用户尚未准备应用公钥时,直接执行 `scripts/download_key_tool.sh`。脚本按当前操作系统自动下载 macOS/Windows 官方安装包到用户 `Downloads` 目录,并在脚本内部使用 `../../normal/json/customer-messages.json` 的 `key_tool.download.result` 展示实际路径、安装引导和 `https://opendocs.alipay.com/isv/02kipk` 手动下载兜底;Linux、目录不可用、网络不可达、依赖缺失、跳转不可信或包校验失败时,在脚本内部使用 `key_tool.download.fallback` 提示用户前往同一地址手动下载。脚本 stdout 是该动作唯一对客正文,不输出 `DOWNLOADED`、`PATH=`、`DOWNLOAD_FAILED`、`DOWNLOAD_REASON` 等机器标记;Agent 不得手写替代下载结果文案,也不得绕过脚本改用非官方下载地址。此动作不另询问是否下载;宿主自身的网络或文件权限审批不属于 Skill 业务确认。
344
+
345
+ 下载动作只保存经过校验的官方安装包并报告实际路径,不安装、不启动、不生成密钥。用户仍需自行使用官方工具,并且只能向 Agent 提供应用公钥;私钥必须由用户自行妥善保管。与官方工具并列的本地 OpenSSL 命令生成方式仍处于待定状态,本 Skill 禁止输出或执行这类命令。
358
346
 
359
347
  ### 执行步骤
360
348
 
361
- 1. **引导用户生成密钥**:使用上述标准引导话术
349
+ 1. **引导用户准备密钥**:用户尚未准备应用公钥时自动下载当前操作系统适用的官方工具并展示安装包路径;用户已经准备公钥时跳过下载
362
350
  2. **接收用户公钥**:只接受用户明确输入的完整 `publicKey`
363
- 3. **创建密钥确认页**:执行 `bash scripts/app.sh key <appId> <用户提供的公钥>`。
364
- 4. **用户扫码确认**:输出扫码链接时,**必须同步告知用户"有效期10分钟"**
365
- 5. **查询确认结果**:用户确认后自动执行 `bash scripts/app.sh verify-key <appId> <用户提供的公钥>` 确认设置成功;该脚本会短轮询 `queryApplicationSecurityKey`,避免支付宝侧短暂延迟导致误判
351
+ 3. **创建密钥确认页**:执行 `bash scripts/app.sh key --defer-open <appId> <用户提供的公钥>`。
352
+ 4. **用户在官方页面确认**:URL 完整校验通过后先展示同一裸 URL 和“扫码完成后请回到 Agent 对话页面”;Agent 将页面 stdout 作为独立对客消息送达后立即执行 `bash scripts/app.sh open-key-page <appId>` 由受控 helper 自动打开 `confirmPageUrl`。该消息非阻塞,打开失败、无 GUI 或宿主要求权限时仍保留复制链接兜底
353
+ 5. **查询确认结果**:页面 stdout 独立送达后立即自动执行有限查询;新建应用用 `bash scripts/app.sh verify-key-and-audit <appId> <用户提供的公钥>`,复用应用用 `bash scripts/app.sh verify-key <appId> <用户提供的公钥>`。最多查询 20 次,未成功的相邻查询间隔 2 秒;成功立即停止,耗尽后才等待用户输入 `1`
366
354
  6. **按来源分支恢复**:
367
- - 新建应用:公钥校验成功后,按 `../flow.md` Step 5 展示当前有效登录会话、可用的脱敏主体标识、产品、`appId` 和提审动作摘要;CLI 未返回主体标识时同时要求用户确认当前登录账号就是操作目标。用户明确确认该摘要后执行 `bash scripts/app.sh audit <appId>`。不再询问是否校验,但公钥校验失败时禁止进入提审确认;`audit` 在提交前尝试导出支付宝公钥,本地文件写入失败不阻塞已确认的提审,但必须提示后续集成需要手动配置支付宝公钥。
355
+ - 新建应用:组合命令复用最终成功的密钥响应校验 RSA2 应用公钥、取得支付宝公钥并直接提审,不再询问;guard 失败禁止提审。本地写入失败不阻塞提审,但提示后续手动配置。
368
356
  - 复用缺公钥恢复:公钥校验成功后重新执行 `bash scripts/app.sh reuse <appId>`,重新校验应用状态并导出支付宝公钥;不进入新建应用的提审分支。
369
357
 
358
+ 有限轮询耗尽后,只有用户在 `application.key.pending` 后输入 `1` 才执行对应的单次查询命令;二选一,不得同时执行:
359
+
360
+ ```bash
361
+ ALIPAY_AIPAY_RECOVERY_QUERY_ONCE=1 bash scripts/app.sh verify-key-and-audit "<新建应用appId>" "<同一publicKey>"
362
+ ALIPAY_AIPAY_RECOVERY_QUERY_ONCE=1 bash scripts/app.sh verify-key "<复用应用appId>" "<同一publicKey>"
363
+ ```
364
+
370
365
  ### ⛔ createKeyConfirmPage 返回结果处理规范(最高优先级)
371
366
 
372
367
  **`createKeyConfirmPage` 调用返回的结果中可能包含二维码链接和 `alipays://` 协议的深度链接,这些信息禁止展示给用户!**
@@ -376,26 +371,15 @@ Agent 在当前任务中记录应用操作和对应平台字段;用户改变
376
371
  ❌ 禁止展示:调用返回中的 alipays:// 协议链接
377
372
  ❌ 禁止展示:调用返回中的任何二维码图片或二维码链接
378
373
 
379
- ✅ 必须:将 confirmPageUrl 以 markdown 链接格式输出给用户
380
- ✅ 必须:告知用户请点击链接或扫码确认公钥设置
374
+ ✅ 必须:将 confirmPageUrl 以裸 URL 独占一行输出给用户
375
+ ✅ 必须:告知用户在支付宝官方确认页面完成公钥设置
381
376
  ✅ 必须:“无法跳链”提示放在确认链接前,确认链接独占一行
382
- ✅ 必须:等待用户确认后再继续后续步骤
377
+ ✅ 必须:页面消息独立送达后立即进入受控有限查询,成功后自动继续
383
378
  ```
384
379
 
385
- **正确输出格式:**
386
-
387
- ```markdown
388
- 📋 应用公钥设置中...
380
+ **标准输出:** 用户明确提供完整应用公钥后,直接执行 `app.sh key --defer-open`,不再展示或等待一次写摘要确认。`app.sh key --defer-open` 在脚本内部调用 renderer 输出非阻塞 `application.key.page` 的 `READY` 变体,并保存同一次 `confirmPageUrl` 供 `app.sh open-key-page` 使用;Agent 必须先把 `app.sh key --defer-open` 剔除内部事实后的 stdout 作为独立对客消息送达,再立即执行 `app.sh open-key-page <appId>`,随后继续脚本内有限查询。Agent 不得手写或手动渲染该消息来替代 `app.sh key --defer-open`。`open-key-page` 打开失败不新增对客正文,不影响已交付 URL。对客消息保留同一实际 `confirmPageUrl` 裸 URL、复制访问兜底和“扫码完成后请回到 Agent 对话页面”;自动打开成功、后续轮询成功或后续 stdout 为空都不能替代这次 URL 交付。只有 20 次均未确认时,`application.key.pending` 才要求输入 `1`,且不得与 `application.key.page` 合并在同一条对客回复中;其他输入按问题、修改或补充处理。没有准确依据时不得推定确认页过期、有效期或旧链接失效;只有用户主动反馈当前页面或扫码有问题时,才重新执行同一 `app.sh key --defer-open <appId> <publicKey>` 生成新确认页并重新进入固定 open + 轮询。完整模板只在消息目录维护,本模块不维护第二份文本。
389
381
 
390
- 请点击以下链接确认公钥设置:
391
-
392
- 提示:无法跳链时,请复制下方链接到网页浏览器打开。
393
- [点击确认公钥设置](https://aipay.alipay.com/public-key-confirm?keyConfirmToken=xxx)
394
-
395
- 确认完成后,请告诉我"好了"继续后续流程。
396
- ```
397
-
398
- 确认链接必须独占一行并放在“无法跳链”提示之后,禁止将提示文案拼接到 Markdown 链接或 URL 后。
382
+ 确认链接必须独占一行并放在“无法跳链”提示之后,禁止将提示文案拼接到 URL 后。
399
383
 
400
384
  **禁止输出格式:**
401
385
 
@@ -405,37 +389,28 @@ Agent 在当前任务中记录应用操作和对应平台字段;用户改变
405
389
 
406
390
  **处理方式:**
407
391
 
408
- > 📎 公钥设置调用 `bash scripts/app.sh key <appId> <publicKey>`,脚本自动提取 `confirmPageUrl` 并按标准 Markdown 格式输出。
392
+ > 📎 公钥设置调用 `bash scripts/app.sh key --defer-open <appId> <publicKey>`,脚本自动提取并校验 `confirmPageUrl`,通过 renderer 输出标准消息;Agent 将 stdout 独立送达后调用 `bash scripts/app.sh open-key-page <appId>` 受控打开同一页面。
409
393
 
410
394
  ### alipayPublicKey 本地写入失败非阻塞
411
395
 
412
- 以脚本输出为准记录导出结果:`ALIPAY_PUBLIC_KEY_EXPORT_STATUS=EXPORTED` 时同时记录 `ALIPAY_PUBLIC_KEY_FILE`;`ALIPAY_PUBLIC_KEY_EXPORT_STATUS=MANUAL_CONFIGURATION_REQUIRED` 只表示已取得支付宝公钥但本地写入失败,正式集成前需手动配置。RSA2 项未返回 `alipayPublicKey` 时直接报错,不得记录为导出失败。禁止根据固定路径推断文件已经存在。
413
-
414
- ```bash
415
- # 导出路径,由 app.sh reuse/audit 自动写入
416
- ~/.config/${APP_ID}-alipayPublicKey.keytext
417
-
418
- # 导出时机
419
- # 1. 复用已有上线应用时
420
- # 2. 提交应用审核前
421
- ```
396
+ 以脚本带统一前缀的内部事实为准:`EXPORTED` 必须同时有实际 `ALIPAY_PUBLIC_KEY_FILE`;`MANUAL_CONFIGURATION_REQUIRED` 只表示已取得公钥但写入失败。RSA2 响应缺 `alipayPublicKey` 直接报错。脚本将 `~/.config` 收紧为 `0700`、文件为 `0600`;只有本次 `APP_ID`、FLOW/导出标记、文件和权限一致才记录成功。这些值只进入内部事实和标准收口,禁止对客或按固定路径、历史推断。
422
397
 
423
398
  ---
424
399
 
425
400
  ## 阶段 5: 提交应用审核
426
401
 
427
- **⚠️ 只有确认应用公钥存在后,才继续提交审核。`scripts/app.sh verify-key` 和 `scripts/app.sh audit` 会通过 `queryApplicationSecurityKey` 判断 RSA2 公钥配置:**
402
+ **⚠️ 只有确认应用公钥存在后才提审。成功路径使用 `scripts/app.sh verify-key-and-audit`,恢复入口 `audit` 仍独立执行同一密钥 guard:**
428
403
 
429
- 执行 `audit` 前还必须按 `../flow.md` Step 5 展示当前有效登录会话、可用的脱敏主体标识、产品、`appId` 和“提交应用审核”动作摘要,并取得针对该摘要的明确执行确认。CLI 未返回主体标识时,摘要必须要求用户确认当前登录账号就是操作目标。应用公钥页面的“好了”只表示外部公钥确认完成,不等于授权提交应用审核。
404
+ 新建应用页面确认后执行 `bash scripts/app.sh verify-key-and-audit <appId> [publicKey]`,不展示提审摘要或要求回复 `1`。`appId` 必须逐字使用本轮 `create` 返回值;公钥未通过时禁止提审。
430
405
 
431
406
  - 应用公钥状态与支付宝公钥必须分别按本模块“queryApplicationSecurityKey 返回结果处理”解析:RSA2 `securityConfigList[].partnerPublicKey` 非空即表示应用公钥已配置,同时兼容旧返回中的 `certInfoDTO.publicKey`;支付宝公钥只从 RSA2 `alipayKeyList[].alipayPublicKey` 读取。
432
407
  - `alipayPublicKey` 是支付宝公钥,只用于导出验签配置,不得用于证明应用公钥已生效。
433
- - `verify-key` 默认最多重试 6 次、每次间隔 5 秒;可通过 `APP_KEY_VERIFY_RETRIES` 和 `APP_KEY_VERIFY_INTERVAL_SECONDS` 调整。
408
+ - `verify-key` 与 `verify-key-and-audit` 生产固定最多查询 20 次,未成功的相邻查询间隔 2 秒;成功立即停止。生产次数不接受环境变量修改;轮询耗尽且用户输入 `1` 后只允许设置 `ALIPAY_AIPAY_RECOVERY_QUERY_ONCE=1` 执行一次。`APP_KEY_VERIFY_INTERVAL_SECONDS` 仅在 `ALIPAY_AIPAY_TEST_MODE=1` 时用于测试缩短等待,不改变生产次数。
434
409
  - 应用公钥已确认但 RSA2 项未返回 `alipayPublicKey` 时,直接返回错误,不继续提审。
435
- - 校验通过后由 `audit` 在提交审核前尝试写入 `~/.config/<appId>-alipayPublicKey.keytext`。
410
+ - 组合命令直接复用最终成功的 `queryApplicationSecurityKey` 响应,不重复查询;随后尝试写入 `~/.config/<appId>-alipayPublicKey.keytext` 并提审。
436
411
  - 已获取 `alipayPublicKey` 但本地文件写入失败时,按本地写入失败处理并重试;重试后仍失败则输出同一待配置状态,但不阻塞提审或复用成功路径。
437
412
 
438
- 执行 `bash scripts/app.sh audit <appId>`。
413
+ 仅独立恢复执行 `bash scripts/app.sh audit <appId>`,并保留完整密钥查询 guard。
439
414
 
440
415
  | 结果 | 处理方式 |
441
416
  |------|----------|
@@ -444,28 +419,6 @@ Agent 在当前任务中记录应用操作和对应平台字段;用户改变
444
419
 
445
420
  ---
446
421
 
447
- ## 输出格式
422
+ ## 对客结果
448
423
 
449
- ### 复用应用成功
450
-
451
- ```
452
- ✅ 应用复用成功
453
-
454
- | 项目 | 信息 |
455
- |------|------|
456
- | AppId | <appId> |
457
- | 应用状态 | ON_LINE(已上线) |
458
- | 支付宝公钥本地配置 | <导出成功:~/.config/<appId>-alipayPublicKey.keytext;本地写入失败:待手动配置> |
459
- ```
460
-
461
- ### 新建应用成功
462
-
463
- ```
464
- ✅ 应用创建成功,已提交审核
465
-
466
- | 项目 | 信息 |
467
- |------|------|
468
- | AppId | <appId> |
469
- | 应用状态 | AUDITING(审核中) |
470
- | 支付宝公钥本地配置 | <导出成功:~/.config/<appId>-alipayPublicKey.keytext;本地写入失败:待手动配置> |
471
- ```
424
+ 复用、创建、设钥校验和提审都固定使用 `application.operation.result`,只传本轮脚本实际输出的 `appId`、实际结果和下一步;必须执行本模块“复用结果输出”登记的 renderer 命令。若紧邻 `full_process` 最终收口,则改由 closeout runner 按完成态压缩、非完成态展开的规则处理。本模块不维护第二份成功表格;待公钥、待审核、人工配置或失败状态不得改写为完成。