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