@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.
- package/README.md +5 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +13 -12
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +17 -9
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +5 -5
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/config.d.ts +5 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +34 -12
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/file.d.ts +8 -0
- package/dist/utils/file.d.ts.map +1 -1
- package/dist/utils/file.js +161 -9
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/jq.d.ts.map +1 -1
- package/dist/utils/jq.js +8 -0
- package/dist/utils/jq.js.map +1 -1
- package/package.json +6 -5
- package/skill/SKILL.md +15 -169
- package/skill/VERSION +1 -1
- package/skill/references/integration/flow.md +321 -292
- package/skill/references/integration/modules/alipay-sdk-reminder.md +5 -3
- package/skill/references/integration/modules/checklist.md +41 -27
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/skill/references/integration/modules/interface-contract/aipay-interface-contract.md +53 -0
- package/skill/references/integration/modules/interface-contract/apppay-interface-contract.md +45 -0
- package/skill/references/integration/modules/interface-contract/common-trade-contract.md +42 -0
- package/skill/references/integration/modules/interface-contract/notify-url-contract.md +68 -0
- package/skill/references/integration/modules/interface-contract/webpay-interface-contract.md +44 -0
- package/skill/references/integration/modules/interface-guide.md +37 -72
- package/skill/references/integration/modules/product-decision.md +10 -27
- package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +62 -94
- package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +43 -40
- package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +93 -114
- package/skill/references/integration/modules/scripts/local_402_sandbox_pay.py +357 -147
- package/skill/references/integration/modules/scripts/sandbox_config.sh +299 -0
- package/skill/references/integration/modules/troubleshooting-flow.md +28 -0
- package/skill/references/normal/alipay-cli-env.md +15 -5
- package/skill/references/normal/full-process-routing.md +80 -0
- package/skill/references/normal/json/customer-messages.json +937 -0
- package/skill/references/normal/json/policy-rules.json +179 -0
- package/skill/references/normal/rejection-guide.md +11 -6
- package/skill/references/normal/scripts/alipay_cli_env.mjs +29 -0
- package/skill/references/normal/scripts/alipay_cli_env.sh +21 -0
- package/skill/references/normal/scripts/common.sh +87 -0
- package/skill/references/normal/scripts/detect_dev_tool.sh +5 -1
- package/skill/references/normal/scripts/integration_message_runner.mjs +801 -0
- package/skill/references/normal/scripts/onboarding_message_runner.mjs +436 -0
- package/skill/references/normal/scripts/open_official_url.sh +82 -0
- package/skill/references/normal/scripts/platform_compat.mjs +39 -0
- package/skill/references/normal/scripts/project_route_inspector.sh +132 -0
- package/skill/references/normal/scripts/python_script_runner.mjs +56 -0
- package/skill/references/normal/scripts/render_customer_message.mjs +1263 -0
- package/skill/references/normal/scripts/self_update.mjs +160 -0
- package/skill/references/normal/scripts/telemetry.mjs +1278 -0
- package/skill/references/normal/self-update.md +18 -51
- package/skill/references/onboarding/flow.md +381 -283
- package/skill/references/onboarding/modules/app-release.md +132 -179
- package/skill/references/onboarding/modules/authorization.md +53 -64
- package/skill/references/onboarding/modules/error-handling.md +31 -34
- package/skill/references/onboarding/modules/product-sign.md +62 -66
- package/skill/references/onboarding/modules/scripts/app.sh +397 -158
- package/skill/references/onboarding/modules/scripts/ar_sign_apply.sh +38 -22
- package/skill/references/onboarding/modules/scripts/auth.sh +479 -167
- package/skill/references/onboarding/modules/scripts/download_key_tool.sh +157 -0
- package/skill/references/onboarding/modules/scripts/error_handler.sh +100 -130
- package/skill/references/onboarding/modules/scripts/network_retry.sh +96 -0
- package/skill/references/onboarding/modules/scripts/query_sign_status.sh +17 -70
- package/skill/references/onboarding/modules/scripts/service.sh +153 -89
- package/skill/references/onboarding/modules/scripts/sign_status_parser.sh +58 -0
- package/skill/references/onboarding/modules/scripts/upload_screenshots.sh +16 -14
- package/skill/references/onboarding/modules/service-registration.md +67 -72
- package/skill/references/runtime-entry.md +62 -0
|
@@ -1,37 +1,25 @@
|
|
|
1
1
|
# 应用发布模块
|
|
2
2
|
|
|
3
|
-
>
|
|
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
|
-
|
|
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
|
-
| `
|
|
59
|
-
| `
|
|
60
|
-
| `
|
|
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"]}}` |
|
|
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`
|
|
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
|
|
103
|
-
| `queryApplicationInfo` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
|
|
104
|
-
| `
|
|
105
|
-
| `
|
|
106
|
-
| `
|
|
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
|
-
#
|
|
120
|
-
# ✅
|
|
121
|
-
# ✅
|
|
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
|
-
|
|
113
|
+
表中全部方法都由 `scripts/app.sh` 的公开子命令或其内部复用、校验路径调用。参数表用于维护时核对冻结契约,不授权 Agent 绕过脚本直调 MCP;当前脚本没有对应入口时必须停止,不得根据参数表自行构造调用。
|
|
125
114
|
|
|
126
|
-
###
|
|
115
|
+
### 禁止调用形态
|
|
127
116
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
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"`
|
|
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
|
-
|
|
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
|
-
| 无同类型应用 |
|
|
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
|
-
-
|
|
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
|
-
|
|
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
|
-
|
|
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>`
|
|
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`
|
|
220
|
+
`FLOW:REUSE_NO_KEY` 是阻断结果,脚本返回非零退出码,禁止输出复用成功或把该 `appId` 记为可用于集成的完成产物。对客必须执行下列 renderer 命令,本模块不维护第二份缺钥话术:
|
|
256
221
|
|
|
257
|
-
|
|
258
|
-
|
|
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
|
-
|
|
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
|
-
|
|
270
|
-
|
|
271
|
-
|
|
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
|
-
|
|
269
|
+
在实际创建应用前,自动重新执行 `scripts/app.sh list --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"`:
|
|
295
270
|
|
|
296
|
-
-
|
|
297
|
-
-
|
|
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
|
|
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`
|
|
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
|
-
|
|
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.
|
|
365
|
-
5.
|
|
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
|
-
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
**⚠️
|
|
402
|
+
**⚠️ 只有确认应用公钥存在后才提审。成功路径使用 `scripts/app.sh verify-key-and-audit`,恢复入口 `audit` 仍独立执行同一密钥 guard:**
|
|
428
403
|
|
|
429
|
-
|
|
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`
|
|
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
|
-
-
|
|
410
|
+
- 组合命令直接复用最终成功的 `queryApplicationSecurityKey` 响应,不重复查询;随后尝试写入 `~/.config/<appId>-alipayPublicKey.keytext` 并提审。
|
|
436
411
|
- 已获取 `alipayPublicKey` 但本地文件写入失败时,按本地写入失败处理并重试;重试后仍失败则输出同一待配置状态,但不阻塞提审或复用成功路径。
|
|
437
412
|
|
|
438
|
-
|
|
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 按完成态压缩、非完成态展开的规则处理。本模块不维护第二份成功表格;待公钥、待审核、人工配置或失败状态不得改写为完成。
|