@alipay/alipay-aipay 0.1.1-beta.1

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 (114) hide show
  1. package/README.md +1 -0
  2. package/bin/alipay-aipay.js +6 -0
  3. package/dist/commands/install.d.ts +10 -0
  4. package/dist/commands/install.d.ts.map +1 -0
  5. package/dist/commands/install.js +92 -0
  6. package/dist/commands/install.js.map +1 -0
  7. package/dist/commands/uninstall.d.ts +10 -0
  8. package/dist/commands/uninstall.d.ts.map +1 -0
  9. package/dist/commands/uninstall.js +82 -0
  10. package/dist/commands/uninstall.js.map +1 -0
  11. package/dist/commands/update.d.ts +10 -0
  12. package/dist/commands/update.d.ts.map +1 -0
  13. package/dist/commands/update.js +125 -0
  14. package/dist/commands/update.js.map +1 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +51 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/types.d.ts +43 -0
  20. package/dist/types.d.ts.map +1 -0
  21. package/dist/types.js +2 -0
  22. package/dist/types.js.map +1 -0
  23. package/dist/utils/alipay-cli.d.ts +15 -0
  24. package/dist/utils/alipay-cli.d.ts.map +1 -0
  25. package/dist/utils/alipay-cli.js +228 -0
  26. package/dist/utils/alipay-cli.js.map +1 -0
  27. package/dist/utils/config.d.ts +48 -0
  28. package/dist/utils/config.d.ts.map +1 -0
  29. package/dist/utils/config.js +207 -0
  30. package/dist/utils/config.js.map +1 -0
  31. package/dist/utils/file.d.ts +55 -0
  32. package/dist/utils/file.d.ts.map +1 -0
  33. package/dist/utils/file.js +154 -0
  34. package/dist/utils/file.js.map +1 -0
  35. package/dist/utils/gpg.d.ts +14 -0
  36. package/dist/utils/gpg.d.ts.map +1 -0
  37. package/dist/utils/gpg.js +247 -0
  38. package/dist/utils/gpg.js.map +1 -0
  39. package/dist/utils/jq.d.ts +14 -0
  40. package/dist/utils/jq.d.ts.map +1 -0
  41. package/dist/utils/jq.js +221 -0
  42. package/dist/utils/jq.js.map +1 -0
  43. package/dist/utils/npm.d.ts +17 -0
  44. package/dist/utils/npm.d.ts.map +1 -0
  45. package/dist/utils/npm.js +42 -0
  46. package/dist/utils/npm.js.map +1 -0
  47. package/dist/utils/shell.d.ts +11 -0
  48. package/dist/utils/shell.d.ts.map +1 -0
  49. package/dist/utils/shell.js +54 -0
  50. package/dist/utils/shell.js.map +1 -0
  51. package/package.json +53 -0
  52. package/skill/SKILL.md +118 -0
  53. package/skill/references/integration/flow.md +487 -0
  54. package/skill/references/integration/modules/alipay-sdk-reminder.md +256 -0
  55. package/skill/references/integration/modules/checklist.md +122 -0
  56. package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +68 -0
  57. package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +77 -0
  58. package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +74 -0
  59. package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +73 -0
  60. 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 +58 -0
  61. 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 +128 -0
  62. package/skill/references/integration/modules/code-examples/csharp/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.cs +500 -0
  63. package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +72 -0
  64. package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +80 -0
  65. package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +78 -0
  66. package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +77 -0
  67. 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 +66 -0
  68. 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 +135 -0
  69. package/skill/references/integration/modules/code-examples/java/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemoController.java +610 -0
  70. package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +51 -0
  71. package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +57 -0
  72. package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +55 -0
  73. package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +54 -0
  74. 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 +77 -0
  75. 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 +65 -0
  76. package/skill/references/integration/modules/code-examples/nodejs/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.js +461 -0
  77. package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +59 -0
  78. package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +67 -0
  79. package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +66 -0
  80. package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +65 -0
  81. 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 +56 -0
  82. 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 +107 -0
  83. package/skill/references/integration/modules/code-examples/php/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.php +444 -0
  84. package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/345/205/263/351/227/255/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +57 -0
  85. package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +65 -0
  86. package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +63 -0
  87. package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//347/273/237/344/270/200/346/224/266/345/215/225/344/272/244/346/230/223/351/200/200/346/254/276/346/237/245/350/257/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +62 -0
  88. 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 +48 -0
  89. 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 +43 -0
  90. package/skill/references/integration/modules/code-examples/python/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.py +465 -0
  91. package/skill/references/integration/modules/interface-guide.md +90 -0
  92. package/skill/references/integration/modules/product-decision.md +90 -0
  93. package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +270 -0
  94. package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +133 -0
  95. package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +218 -0
  96. package/skill/references/integration/modules/scripts/local_402_sandbox_pay.py +659 -0
  97. package/skill/references/normal/alipay-cli-env.md +211 -0
  98. package/skill/references/normal/rejection-guide.md +37 -0
  99. package/skill/references/normal/scripts/common.sh +32 -0
  100. package/skill/references/normal/scripts/detect_dev_tool.sh +46 -0
  101. package/skill/references/onboarding/flow.md +571 -0
  102. package/skill/references/onboarding/modules/app-release.md +411 -0
  103. package/skill/references/onboarding/modules/authorization.md +269 -0
  104. package/skill/references/onboarding/modules/error-handling.md +247 -0
  105. package/skill/references/onboarding/modules/mcc-reference.md +209 -0
  106. package/skill/references/onboarding/modules/product-sign.md +304 -0
  107. package/skill/references/onboarding/modules/scripts/app.sh +705 -0
  108. package/skill/references/onboarding/modules/scripts/ar_sign_apply.sh +248 -0
  109. package/skill/references/onboarding/modules/scripts/auth.sh +505 -0
  110. package/skill/references/onboarding/modules/scripts/error_handler.sh +312 -0
  111. package/skill/references/onboarding/modules/scripts/query_sign_status.sh +146 -0
  112. package/skill/references/onboarding/modules/scripts/service.sh +267 -0
  113. package/skill/references/onboarding/modules/scripts/upload_screenshots.sh +152 -0
  114. package/skill/references/onboarding/modules/service-registration.md +294 -0
@@ -0,0 +1,411 @@
1
+ # 应用发布模块
2
+
3
+ > 本文档定义应用发布的完整流程、MCP调用规范和关键处理逻辑。
4
+ > 被引用文档:`SKILL.md` → Step 5 入驻推进 - 应用发布部分
5
+ > 本文档位于 `references/onboarding/modules/`,文中的 `scripts/...` 路径相对本目录;从技能包根目录执行时对应 `references/onboarding/modules/scripts/...`。
6
+
7
+ ---
8
+
9
+ ## 功能概述
10
+
11
+ 负责应用发布全流程,包括查询已有应用、复用/创建应用、公钥设置、审核提交。应用类型支持 `WEBAPP` 和 `MOBILEAPP`。
12
+
13
+ **触发条件:**
14
+ - 用户说"发布应用"、"创建应用"
15
+ - 签约完成后自动触发
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
+ ├─ 【复用】选择已有上线应用 → 查询安全密钥 → 导出 alipayPublicKey → 完成
32
+ └─ 【新建】创建新应用 → 进入阶段 3.2
33
+ ↓
34
+ 阶段 3.2: 创建应用 (createApplication) — 仅新建路径
35
+ ↓
36
+ 阶段 4: 设置应用公钥 (createKeyConfirmPage) — 仅新建路径
37
+ ↓
38
+ 阶段 4.1: 确认应用公钥已生效 (queryApplicationSecurityKey) — 仅新建路径
39
+ ↓
40
+ 阶段 5: 提交应用审核 (submitApplicationAudit) — 仅新建路径
41
+ ```
42
+
43
+ ---
44
+
45
+ ## MCP调用
46
+
47
+ | 方法 | 用途 |
48
+ |------|------|
49
+ | `queryApplicationList` | 查询同类型已有应用 |
50
+ | `createApplication` | 创建应用 |
51
+ | `queryApplicationInfo` | 查询应用信息 |
52
+ | `queryApplicationDetail` | 查询应用详情 |
53
+ | `createKeyConfirmPage` | 创建密钥确认页 |
54
+ | `queryApplicationSecurityKey` | 查询应用安全密钥 |
55
+ | `submitApplicationAudit` | 提交应用审核 |
56
+
57
+ ## 应用类型规则
58
+
59
+ 应用类型必须在查询和创建阶段保持一致:
60
+
61
+ | 产品 | productType | salesCode | 应用类型 | 查询应用入参 | 创建应用入参 |
62
+ |------|-------------|-----------|----------|--------------|--------------|
63
+ | 按量付费 | `aipay` | `I1080300001000160457` | `WEBAPP` | `{"request":{"appTypes":["WEBAPP"]}}` | `{"request":{"applicationType":"WEBAPP","createScene":"cli"}}` |
64
+ | 网站支付 | `webpay` | `I1080300001000041203` | `WEBAPP` | `{"request":{"appTypes":["WEBAPP"]}}` | `{"request":{"applicationType":"WEBAPP","createScene":"cli"}}` |
65
+ | APP支付 | `apppay` | `I1080300001000041313` | `MOBILEAPP` | `{"request":{"appTypes":["MOBILEAPP"]}}` | `IOS` 需补充 `mobilePlatform`+`bundleId`;`ANDROID` 需补充 `mobilePlatform`+`appPackage`+`appSign`;`ALL` 需三项都传 |
66
+
67
+ `scripts/app.sh` 的应用类型解析规则:
68
+
69
+ 1. 如果显式传入 `--application-type WEBAPP|MOBILEAPP`,必须与产品上下文匹配。
70
+ 2. 否则如果传入 `--product-type apppay` 或 `--sales-code I1080300001000041313`,使用 `MOBILEAPP`。
71
+ 3. 其他情况默认使用 `WEBAPP`。
72
+
73
+ `MOBILEAPP` 平台字段规则:
74
+
75
+ - `alipay-aipay` 当前要求 APP支付创建 `MOBILEAPP` 前必须明确 `mobilePlatform`,禁止用最小入参创建 `MOBILEAPP`。
76
+ - `mobilePlatform` 允许 `IOS`、`ANDROID` 或 `ALL`;`ALL` 表示同时支持 iOS 和 Android。
77
+ - `mobilePlatform=IOS`:必须同时传 `bundleId`。
78
+ - `mobilePlatform=ANDROID`:必须同时传 `appPackage` 和 `appSign`。
79
+ - `mobilePlatform=ALL`:必须同时传 `bundleId`、`appPackage` 和 `appSign`。
80
+ - 用户说“bundle_id”时,映射到脚本参数 `--bundle-id`,MCP 请求字段为 `bundleId`。
81
+ - 不确定字段值时不要编造,也不要用包名、签名摘要或 bundleId 的占位符调用 `createApplication`。
82
+
83
+ ---
84
+
85
+ ## ⛔ 应用相关 MCP 调用铁律(最高优先级)
86
+
87
+ **应用相关 MCP 调用具有独特的参数结构,与签约模块完全不同,禁止混用!**
88
+
89
+ ### 参数结构对照表
90
+
91
+ | 方法 | 必需参数 | 参数结构 | 是否需要 ctx |
92
+ |------|----------|----------|--------------|
93
+ | `queryApplicationList` | `appTypes` | `{"request":{"appTypes":["WEBAPP"]}}` 或 `{"request":{"appTypes":["MOBILEAPP"]}}` | ❌ 不需要 |
94
+ | `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":"..."}}` | ❌ 不需要 |
95
+ | `queryApplicationInfo` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
96
+ | `queryApplicationDetail` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
97
+ | `createKeyConfirmPage` | `appId`, `signType`, `publicKey` | `{"request":{"appId":"...","signType":"RSA2","publicKey":"..."}}` | ❌ 不需要 |
98
+ | `queryApplicationSecurityKey` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
99
+ | `submitApplicationAudit` | `appId` | `{"request":{"appId":"..."}}` | ❌ 不需要 |
100
+
101
+ ### 正确调用示例
102
+
103
+ > 📎 所有 MCP 调用均有对应脚本,直接执行脚本即可。以下列出各命令与脚本的对应关系:
104
+
105
+ ```bash
106
+ # ✅ 查询应用列表 → scripts/app.sh list --product-type <type> --sales-code <code>(按产品上下文自动选择 WEBAPP/MOBILEAPP)
107
+ # ✅ 创建应用 → scripts/app.sh create --product-type <type> --sales-code <code>(按产品上下文自动选择 WEBAPP/MOBILEAPP)
108
+ # ✅ 创建指定平台移动应用 → scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform IOS --bundle-id <bundleId>
109
+ # ✅ 创建 Android 移动应用 → scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform ANDROID --app-package <appPackage> --app-sign <appSign>
110
+ # ✅ 创建 iOS + Android 移动应用 → scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform ALL --bundle-id <bundleId> --app-package <appPackage> --app-sign <appSign>
111
+ # ✅ 设置公钥 → scripts/app.sh key <appId> <publicKey>
112
+ # ✅ 确认公钥 → scripts/app.sh verify-key <appId> [publicKey]
113
+ # ✅ 提交审核 → scripts/app.sh audit <appId>
114
+ ```
115
+
116
+ 其他未封装为独立脚本的 MCP 方法(queryApplicationInfo、queryApplicationDetail)请根据参数结构对照表构建调用。`queryApplicationSecurityKey` 的公钥确认、支付宝公钥导出已封装在 `scripts/app.sh verify-key|reuse|audit` 中。
117
+
118
+ ### 禁止调用示例
119
+
120
+ ```bash
121
+ # ❌ 最常见错误:添加 ctx,且省略必需的 appTypes
122
+ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
123
+ -d '{"request":{"pageSize":10,"pageNum":1},"ctx":{}}' \
124
+ --json 2>/dev/null
125
+
126
+ # ❌ 错误:添加 ctx 参数(应用相关 MCP 调用不需要 ctx)
127
+ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
128
+ -d '{"request":{"appTypes":["WEBAPP"]},"ctx":{}}' \
129
+ --json 2>/dev/null
130
+
131
+ # ❌ 错误:受 ar-sign 上下文影响使用错误的参数结构
132
+ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
133
+ -d '{"request":{"salesProductCodes":["<salesProductCode>"]},"ctx":{}}' \
134
+ --json 2>/dev/null
135
+
136
+ # ❌ 错误:省略 request 包裹层
137
+ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
138
+ -d '{"appTypes":["WEBAPP"]}' \
139
+ --json 2>/dev/null
140
+
141
+ # ❌ 错误:APP支付仍按 WEBAPP 查询/创建应用
142
+ export PLATFORM=${DEV_TOOL_NAME} && alipay-cli mcp call apprelease.queryApplicationList \
143
+ -d '{"request":{"appTypes":["WEBAPP"]}}' \
144
+ --json 2>/dev/null
145
+ ```
146
+
147
+ ### 应用模块与签约模块参数结构对比
148
+
149
+ | 模块 | 参数结构特征 | ctx 参数 | 示例 |
150
+ |------|-------------|----------|------|
151
+ | ar-sign / ar-query | `{"request":{...},"ctx":{}}` | ✅ 必须包含 | `{"request":{"salesProductCodes":["..."]},"ctx":{}}` |
152
+ | apprelease | `{"request":{...}}` | ❌ 不需要 | `{"request":{"appTypes":["WEBAPP"]}}` / `{"request":{"appTypes":["MOBILEAPP"]}}` |
153
+
154
+ **重要:应用发布模块的 MCP 调用参数结构与签约模块完全不同,必须严格按照上表执行,禁止混用!**
155
+
156
+ ---
157
+
158
+ ## 前置阶段 1: CLI 登录态检查
159
+
160
+ > 📎 登录态检查、登录授权流程详见 `authorization.md`,本文档不重复。
161
+
162
+ ---
163
+
164
+ ## 阶段 2: 查询已有应用
165
+
166
+ **⚠️ 重要:在创建应用前必须先查询当前主体下是否已有可复用的应用。** 执行 `scripts/app.sh list --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"`。
167
+
168
+ ### 返回结果处理
169
+
170
+ `scripts/app.sh list --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"` 自动完成以下处理,输出应用列表并引导用户选择。返回 `FLOW:CREATE_NEW` 表示需新建,`FLOW:SELECT` 表示需用户选择:
171
+
172
+ ### 查询结果处理
173
+
174
+ | 结果 | 处理方式 |
175
+ |------|----------|
176
+ | 查询失败 | 直接返回错误,停止后续流程 |
177
+ | 命中 ON_LINE 应用 | 返回已有上线应用列表,让用户选择"复用上线应用"或"新建应用" |
178
+ | 无同类型应用 | 直接进入"创建应用"阶段 |
179
+
180
+ ### ⛔ 应用复用强制原则
181
+
182
+ <important>
183
+ 只有状态为 `ON_LINE` 的应用才允许复用,也只有 `ON_LINE` 应用允许被列出给用户选择。
184
+
185
+ - 查询结果只允许列出 `ON_LINE` 状态的应用
186
+ - 用户指定某个 `appId` 要复用时,必须先查询该应用状态
187
+ - 状态不是 `ON_LINE` 时,禁止复用
188
+ - 用户坚持要求复用非 `ON_LINE` 应用时,直接拒绝该复用请求,并继续按"新建应用"路径处理
189
+ - 复用已有 `MOBILEAPP` 时不采集、不传入 `mobilePlatform`、`bundleId`、`appPackage`、`appSign`;平台字段只属于新建 `MOBILEAPP` 的 `createApplication` 入参
190
+ </important>
191
+
192
+ ### 用户选择输出格式
193
+
194
+ ```
195
+ 📋 发现您已有以下上线应用:
196
+
197
+ | 序号 | 应用ID | 应用名称 | 状态 |
198
+ |------|--------|----------|------|
199
+ | 1 | 2021001234567890 | 我的网站应用 | 已上线 |
200
+ | 2 | 2021001234567891 | 我的测试应用 | 已上线 |
201
+
202
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
203
+ 请选择操作:
204
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
205
+
206
+ 【复用】输入序号 1 或 2 → 复用对应应用
207
+ 【新建】输入 "新建" → 创建新应用
208
+
209
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
210
+ ```
211
+
212
+ ### 复用成功后流程
213
+
214
+ ```
215
+ 用户选择复用 ON_LINE 应用
216
+ ↓
217
+ 调用 queryApplicationSecurityKey 获取安全密钥
218
+ ↓
219
+ 取 signType="RSA2" 项的 alipayPublicKey
220
+ ↓
221
+ 写入 ~/.config/<appId>-alipayPublicKey.keytext
222
+ ↓
223
+ 对客输出复用成功信息
224
+ ↓
225
+ 结束
226
+ ```
227
+
228
+ 对按量付费产品,复用应用成功后仍需确认服务市场注册产物已经存在。应用只提供 `appId` 和支付宝公钥,不提供 `serviceId`。
229
+
230
+ ### queryApplicationSecurityKey 返回结果处理
231
+
232
+ > 复用应用的完整处理(查询密钥 + 提取 RSA2 公钥 + 写入文件)已封装在 `scripts/app.sh reuse <appId>` 中。直接调用即可完成复用全流程。
233
+
234
+ ### 复用成功输出格式
235
+
236
+ ```
237
+ ✅ 应用复用成功
238
+
239
+ | 项目 | 信息 |
240
+ |------|------|
241
+ | AppId | <appId> |
242
+ | 应用状态 | ON_LINE(已上线) |
243
+ | 支付宝公钥保存路径 | ~/.config/<appId>-alipayPublicKey.keytext |
244
+ ```
245
+
246
+ ### 按量付费集成产物
247
+
248
+ 应用创建、审核提交或复用成功后,必须记录并向用户说明:
249
+
250
+ | 字段 | 用途 |
251
+ |------|------|
252
+ | `appId` | SDK 配置中的应用 ID,也是 `Payment-Needed.method.seller_app_id` |
253
+ | 支付宝公钥文件路径 | SDK 验签配置使用,复用应用时由 `scripts/app.sh reuse` 导出 |
254
+ | 应用状态 | 只有 `ON_LINE` 应用允许复用;新建应用需按审核结果判断正式可用性 |
255
+
256
+ 按量付费还需要服务市场注册产物 `serviceId`。如果只有 `appId` 而没有 `serviceId`,不能进入正式按量付费集成收口。
257
+
258
+ ---
259
+
260
+ ## 阶段 3: 创建应用
261
+
262
+ **⚠️ 仅在用户选择"新建应用"或无可复用应用时执行此阶段。**
263
+
264
+ 执行规则:
265
+
266
+ - 按量付费/网站支付:执行 `scripts/app.sh create --product-type "$PRODUCT_TYPE" --sales-code "$SALES_CODE"`。
267
+ - APP支付 iOS:执行 `scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform IOS --bundle-id "<bundleId>"`。
268
+ - APP支付 Android:执行 `scripts/app.sh create --product-type apppay --sales-code I1080300001000041313 --mobile-platform ANDROID --app-package "<appPackage>" --app-sign "<appSign>"`。
269
+ - 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>"`。
270
+
271
+ APP支付缺少平台或对应字段时,先向用户补问,禁止调用 `createApplication`。
272
+
273
+ | 结果 | 处理方式 |
274
+ |------|----------|
275
+ | 创建成功 | 获取 appId,进入阶段 4 设置应用公钥 |
276
+ | 创建失败 | 返回错误,停止后续流程 |
277
+
278
+ ---
279
+
280
+ ## 阶段 4: 设置应用公钥
281
+
282
+ ### ⛔ 公钥私钥敏感性规范(强制执行)
283
+
284
+ ```
285
+ ❌ 禁止:自动为用户生成公钥或密钥对
286
+ ❌ 禁止:向用户表示可以"帮助生成公钥"、"帮助生成密钥对"
287
+ ❌ 禁止:提供任何密钥生成代码、命令或脚本
288
+ ❌ 禁止:请求、接收或处理用户的私钥信息
289
+ ❌ 禁止:在用户未明确提供 publicKey 时调用 createKeyConfirmPage
290
+ ❌ 禁止:自动生成、推断、补全、改写或添加前后缀到 publicKey
291
+ ```
292
+
293
+ **必须行为:**
294
+ ```
295
+ ✅ 必须:引导用户前往支付宝开放平台官方密钥生成工具
296
+ ✅ 必须:使用标准引导话术(见下方)
297
+ ✅ 必须:只接受用户明确输入的完整 publicKey
298
+ ✅ 必须:提醒用户妥善保管私钥,切勿泄露给任何人
299
+ ```
300
+
301
+ **标准引导话术:**
302
+ 请前往支付宝开放平台密钥生成工具( https://opendocs.alipay.com/common/02kipk )
303
+ 下载并使用官方工具生成应用公私钥对,生成后将应用公钥复制提供给我继续后续流程。
304
+ 官方工具生成的私钥格式默认为PKCS#8,部分开发语言仅支持PKCS#1,如果需要转换成PKCS#1,可使用官方工具-格式转换。
305
+ **私钥请妥善保管,切勿泄露给任何人。**
306
+
307
+ ### 执行步骤
308
+
309
+ 1. **引导用户生成密钥**:使用上述标准引导话术
310
+ 2. **接收用户公钥**:只接受用户明确输入的完整 `publicKey`
311
+ 3. **创建密钥确认页**:执行 `bash scripts/app.sh key <appId> <用户提供的公钥>`。
312
+ 4. **用户扫码确认**:输出扫码链接时,**必须同步告知用户"有效期10分钟"**
313
+ 5. **查询确认结果**:用户确认后执行 `bash scripts/app.sh verify-key <appId> <用户提供的公钥>` 确认设置成功;该脚本会短轮询 `queryApplicationSecurityKey`,避免支付宝侧短暂延迟导致误判
314
+ 6. **写入 alipayPublicKey 文件**:
315
+
316
+ ### ⛔ createKeyConfirmPage 返回结果处理规范(最高优先级)
317
+
318
+ **`createKeyConfirmPage` 调用返回的结果中可能包含二维码链接和 `alipays://` 协议的深度链接,这些信息禁止展示给用户!**
319
+
320
+ ```
321
+ ❌ 禁止展示:调用返回中的 "或使用支付宝扫描以下二维码" 提示
322
+ ❌ 禁止展示:调用返回中的 alipays:// 协议链接
323
+ ❌ 禁止展示:调用返回中的任何二维码图片或二维码链接
324
+
325
+ ✅ 必须:将 confirmPageUrl 以 markdown 链接格式输出给用户
326
+ ✅ 必须:告知用户请点击链接或扫码确认公钥设置
327
+ ✅ 必须:等待用户确认后再继续后续步骤
328
+ ```
329
+
330
+ **正确输出格式:**
331
+
332
+ ```markdown
333
+ 📋 应用公钥设置中...
334
+
335
+ 请点击以下链接确认公钥设置:
336
+
337
+ [点击确认公钥设置](https://aipay.alipay.com/public-key-confirm?keyConfirmToken=xxx)(无法跳链时,请复制链接到网页浏览器打开)
338
+
339
+ 确认完成后,请告诉我"好了"继续后续流程。
340
+ ```
341
+
342
+ **禁止输出格式:**
343
+
344
+ ```
345
+ ❌ alipays://platformapi/startapp?appId=2018082061148052&page=/pages/public-key-upload/index?keyConfirmToken=xxx
346
+ ```
347
+
348
+ **处理方式:**
349
+
350
+ > 📎 公钥设置调用 `bash scripts/app.sh key <appId> <publicKey>`,脚本自动提取 `confirmPageUrl` 并按标准 Markdown 格式输出。
351
+
352
+ ### alipayPublicKey 文件写入
353
+
354
+ ```bash
355
+ # 写入路径,由 app.sh reuse/audit 自动写入
356
+ ~/.config/${APP_ID}-alipayPublicKey.keytext
357
+
358
+ # 写入时机
359
+ # 1. 复用已有上线应用时
360
+ # 2. 提交应用审核前
361
+ ```
362
+
363
+ ---
364
+
365
+ ## 阶段 5: 提交应用审核
366
+
367
+ **⚠️ 只有确认应用公钥存在后,才继续提交审核。`scripts/app.sh verify-key` 和 `scripts/app.sh audit` 会通过 `queryApplicationSecurityKey` 判断 RSA2 公钥配置:**
368
+
369
+ - 只取 `signType="RSA2"` 的项。
370
+ - 合并兼容读取 `resultObj.alipayKeyList`、`resultObj.securityKeys`、`data.alipayKeyList`、`data.securityKeys`。
371
+ - 普通公钥模式下 `certInfoDTO` 可能为 `null`,不能仅凭该字段判定未配置。
372
+ - 满足以下任一条件即可视为 RSA2 应用公钥配置已生效:RSA2 项存在 `certInfoDTO.publicKey`、等价 `publicKey` 或 `alipayPublicKey`;RSA2 `securityConfigList.partnerPublicKey` 非空且 `invalid != true`。
373
+ - `verify-key` 默认最多重试 6 次、每次间隔 5 秒;可通过 `APP_KEY_VERIFY_RETRIES` 和 `APP_KEY_VERIFY_INTERVAL_SECONDS` 调整。
374
+ - `alipayPublicKey` 为空时拒绝提审。
375
+ - 校验通过后写入 `~/.config/<appId>-alipayPublicKey.keytext`,再提交审核。
376
+ - 已获取 `alipayPublicKey` 但本地文件写入失败时,按本地写入失败处理并重试;重试后仍失败则提醒用户后续集成需手动配置支付宝公钥,但不阻塞提审或复用成功路径。
377
+
378
+ 执行 `bash scripts/app.sh audit <appId>`。
379
+
380
+ | 结果 | 处理方式 |
381
+ |------|----------|
382
+ | 提审成功 | 输出提审成功结论,不对客展示审核单号 |
383
+ | 提审失败 | 返回错误,停止后续流程 |
384
+
385
+ ---
386
+
387
+ ## 输出格式
388
+
389
+ ### 复用应用成功
390
+
391
+ ```
392
+ ✅ 应用复用成功
393
+
394
+ | 项目 | 信息 |
395
+ |------|------|
396
+ | AppId | <appId> |
397
+ | 应用状态 | ON_LINE(已上线) |
398
+ | 支付宝公钥保存路径 | ~/.config/<appId>-alipayPublicKey.keytext |
399
+ ```
400
+
401
+ ### 新建应用成功
402
+
403
+ ```
404
+ ✅ 应用创建成功,已提交审核
405
+
406
+ | 项目 | 信息 |
407
+ |------|------|
408
+ | AppId | <appId> |
409
+ | 应用状态 | AUDITING(审核中) |
410
+ | 支付宝公钥保存路径 | ~/.config/<appId>-alipayPublicKey.keytext |
411
+ ```
@@ -0,0 +1,269 @@
1
+ # 登录授权流程规范
2
+
3
+ > 本文档定义支付宝登录授权的完整流程。
4
+ > 被引用:`flow.md` Step 3 登录授权
5
+ > 本文档位于 `references/onboarding/modules/`,文中的 `scripts/...` 路径相对本目录;从技能包根目录执行时对应 `references/onboarding/modules/scripts/...`。
6
+
7
+ ---
8
+
9
+ ## 一、Scope 定义
10
+
11
+ | 产品 | salesCode | Scope(固定值,禁止修改) |
12
+ |------|-----------|--------------------------|
13
+ | 按量付费 | I1080300001000160457 | `app:all,machine_pay:write,agmnt:write` |
14
+ | 网站支付 | I1080300001000041203 | `app:all,fast_instant_trade_pay:write` |
15
+ | APP支付 | I1080300001000041313 | `app:all,auth_alipay_apppay:write` |
16
+
17
+ > ⚠️ **禁止自行修改 scope 值**
18
+
19
+ ---
20
+
21
+ ## 二、登录状态检查
22
+
23
+ ### 2.1 检查命令
24
+
25
+ > 📎 已收口到脚本 `scripts/auth.sh init`。Agent 执行流程时调用 `bash scripts/auth.sh init`(见 flow.md Step 3),脚本返回 `AUTH_FLOW:SKIP`(已登录)或 `AUTH_FLOW:READY`(需新授权)。
26
+
27
+ whoami 原始返回格式:
28
+
29
+ ### 2.2 返回格式
30
+
31
+ ```json
32
+ // 已登录且未过期
33
+ { "success": true, "data": { "logged_in": true, "is_expired": false, "expires_at": "2026-04-20T15:37:42+08:00" } }
34
+
35
+ // 未登录或已过期
36
+ { "success": true, "data": { "logged_in": false, "is_expired": true } }
37
+ ```
38
+
39
+ ### 2.3 判断方式
40
+
41
+ **检查 `.data.logged_in` 字段(不是外层的 `.success`)**
42
+
43
+ | 返回值 | 状态 | 处理 |
44
+ |--------|------|------|
45
+ | `logged_in: true` + `is_expired: false` | 正常登录 | 继续后续步骤 |
46
+ | `logged_in: false` 或 `is_expired: true` | 未登录/已过期 | 进入登录授权流程 |
47
+
48
+ ---
49
+
50
+ ## 三、授权前用户确认(强制)
51
+
52
+ **在执行 `login` 命令前,必须先让用户确认产品类型和经营类目!**
53
+
54
+ ### 3.1 输出格式(Markdown)
55
+
56
+ ```markdown
57
+ ---
58
+
59
+ ### 📋 请确认您的授权信息
60
+
61
+ ---
62
+
63
+ - **产品类型**: {PRODUCT_NAME}
64
+ - **类目编码**: {MCC_CODE}
65
+
66
+ ---
67
+
68
+ 确认信息无误后,将为您生成授权链接。
69
+ 是否确认?(是/否)
70
+ ```
71
+
72
+ ### 3.2 禁止行为
73
+
74
+ ```
75
+ ❌ 禁止:未经用户确认直接执行登录命令
76
+ ❌ 禁止:跳过产品类型和经营类目的展示
77
+ ❌ 禁止:条件性隐藏产品或类目信息
78
+ ```
79
+
80
+ ---
81
+
82
+ ## 四、执行登录
83
+
84
+ ### 4.1 登录命令
85
+
86
+ > 📎 已收口到脚本:`scripts/auth.sh init`(Step 2-4: login + 解析 + 校验)
87
+
88
+ `auth.sh init` 自动执行 login、解析 device_code/verification_code/expires_in、三参数校验,无需手动执行。
89
+
90
+ ### 4.2 解析返回结果
91
+
92
+ 由 `auth.sh init` 自动处理。
93
+
94
+ ### 4.3 参数校验
95
+
96
+ 由 `auth.sh init` 自动校验 device_code、sales_code、mcc_code。
97
+
98
+ ---
99
+
100
+ ## 五、生成授权链接
101
+
102
+ ### 5.1 链接格式
103
+
104
+ ```
105
+ ✅ 正确链接:https://aipay.alipay.com/cli-auth?deviceCode=xxx&productCode=xxx&mccCode=xxx&platform=xxx
106
+
107
+ ❌ 禁止使用:https://opengw.alipay.com/oauth/device (此链接无法授权)
108
+ ```
109
+
110
+ ### 5.2 构建命令
111
+
112
+ > 📎 已收口到脚本:`scripts/auth.sh init`(Step 5: 构建授权链接)
113
+
114
+ `auth.sh init` 自动构建正确的授权链接(`https://aipay.alipay.com/cli-auth?...`),禁止使用 CLI 返回的 `verification_url`。
115
+
116
+ ### 5.3 ⚠️ 禁止透出 verification_url
117
+
118
+ CLI 返回的 JSON 中包含 `verification_url` 字段,**此链接无法用于授权,禁止透出给用户!**
119
+
120
+ ---
121
+
122
+ ## 六、授权信息展示
123
+
124
+ ### 6.1 必须展示的 4 项信息
125
+
126
+ ```
127
+ 1. 产品类型(productName)— 如:网站支付、按量付费
128
+ 2. 经营类目(mccName + mccCode)— 如:零售批发 > 互联网综合电商平台 (A0002_B0114)
129
+ 3. 确认码(verificationCode)— login 返回的 verification_code
130
+ 4. 授权链接有效期(从 expires_in 计算)
131
+ ```
132
+
133
+ ### 6.2 输出格式(Markdown)
134
+
135
+ ```markdown
136
+ 🔐 支付宝授权登录
137
+
138
+ 📋 授权信息
139
+
140
+ | 项目 | 信息 |
141
+ |------|------|
142
+ | 产品类型 | {PRODUCT_NAME} |
143
+ | 经营类目 | {MCC_NAME} ({MCC_CODE}) |
144
+ | 确认码 | {VERIFICATION_CODE} |
145
+ | 授权链接有效期 | {EXPIRES_DISPLAY} |
146
+
147
+ ⚠️ 安全提示:请核对授权页面显示的确认码是否与上方一致,如不一致,请勿授权,立即停止操作!
148
+
149
+ 🌐 授权链接:[点击跳转进行授权]({BROWSER_URL})(无法跳链时,请复制链接到网页浏览器打开)
150
+
151
+ 请在完成授权后告诉我"好了"继续后续流程。
152
+ ```
153
+
154
+ ---
155
+
156
+ ## 七、授权确认
157
+
158
+ ### 7.1 命令
159
+
160
+ > 📎 已收口到脚本 `scripts/auth.sh confirm`。Agent 在用户回复"好了"后调用 `bash scripts/auth.sh confirm --scope "$SCOPE" --sales-code "$SALES_CODE" --mcc-code "$MCC_CODE" --product-name "$PRODUCT_NAME" --mcc-name "$MCC_NAME"`(见 flow.md Step 3)。
161
+
162
+ 脚本内部执行 `login --complete` + scope 校验 + MCC 校验。原始返回格式:
163
+
164
+ > `confirm` / `mismatch` 优先使用显式传入的 `salesCode`、`mccCode`、`scope`、`productName`、`mccName` 等非敏感授权上下文。`auth.sh init` 仍会短期保存本地状态文件,仅用于独立执行子命令时兜底恢复参数。授权成功、过期或失败后脚本会清理该状态文件。
165
+
166
+ ### 7.2 返回格式与判断
167
+
168
+ | 脚本输出 | 含义 | 处理 |
169
+ |----------|------|------|
170
+ | `AUTH_FLOW:AUTH_SUCCESS` | 授权成功,scope + MCC 校验通过 | 继续 Step 3.1 |
171
+ | `AUTH_FLOW:PENDING` | 用户尚未完成授权 | 继续等待 |
172
+ | `AUTH_FLOW:EXPIRED` | 授权链接已过期 | 重新执行 auth.sh init |
173
+ | `AUTH_FLOW:SCOPE_MISMATCH` | scope 权限不满足 | 已自动 logout,需重新授权 |
174
+ | `AUTH_FLOW:MCC_MISMATCH` | 经营类目未授权 | 已自动 logout,需重新授权 |
175
+ | `AUTH_FLOW:FAILED` | 授权确认返回未知错误 | 检查返回信息,联系技术支持 |
176
+
177
+ ### 7.3 ⚠️ 禁止轮询
178
+
179
+ ```
180
+ ❌ 禁止:自动轮询检查授权状态
181
+ ❌ 禁止:循环调用 login --complete
182
+ ```
183
+
184
+ ### 7.4 登录成功后的 scope 权限校验和 MCC 一致性校验
185
+
186
+ > 📎 已收口到脚本:`scripts/auth.sh confirm`(Step 3-6: scope + MCC 校验)
187
+
188
+ `auth.sh confirm` 在 `login --complete` 成功后自动执行 scope 校验和 MCC 校验,失败时自动 logout。Agent 只需根据脚本返回值判断结果:
189
+
190
+ | 脚本输出 | 后续操作 |
191
+ |----------|----------|
192
+ | `AUTH_FLOW:AUTH_SUCCESS` | 进入 Step 3.1 签约状态查询 |
193
+ | `AUTH_FLOW:SCOPE_MISMATCH` / `AUTH_FLOW:MCC_MISMATCH` | 调用 `auth.sh mismatch` 重新授权 |
194
+
195
+ #### 7.4.1 校验实现
196
+
197
+ 由 `auth.sh confirm` 自动完成,无需手动执行。
198
+
199
+ **为什么需要这两个校验**:
200
+ - `login --complete` 只确认用户完成了扫码,不代表授权范围满足业务需求
201
+ - **Scope 权限校验**:确保授权包含产品所需的操作权限(如 `machine_pay:write`、`fast_instant_trade_pay:write` 或 `auth_alipay_apppay:write`)
202
+ - **MCC 一致性校验**:确保当前登录的经营类目与用户选择的 MCC 一致
203
+ - 如果不匹配,应该立即退出并重新授权,而不是等到后续 MCP 调用时才发现问题
204
+
205
+ ---
206
+
207
+ ## 八、权限检查与重新授权
208
+
209
+ ### 8.1 授权范围不满足处理
210
+
211
+ **当检测到授权范围不满足时,必须执行 logout 然后重新授权。**
212
+
213
+ 触发条件:
214
+ 1. `auth.sh confirm` 返回 `AUTH_FLOW:SCOPE_MISMATCH` / `AUTH_FLOW:MCC_MISMATCH`
215
+ 2. MCP 调用返回 `mccCode is not auth` 错误
216
+ 3. MCP 调用返回 `scope is not auth` 错误
217
+
218
+ 处理流程:
219
+
220
+ > 📎 已收口到脚本 `scripts/auth.sh mismatch`。Agent 调用 `bash scripts/auth.sh mismatch --scope "$SCOPE" --sales-code "$SALES_CODE" --mcc-code "$MCC_CODE" --product-name "$PRODUCT_NAME" --mcc-name "$MCC_NAME"`(见 flow.md Step 3),脚本自动执行 logout + 调用 auth init 重新授权。
221
+
222
+ ### 8.2 禁止行为
223
+
224
+ ```
225
+ ❌ 禁止:检测到授权范围不满足后继续执行后续操作
226
+ ❌ 禁止:不执行 logout 直接重新登录
227
+ ❌ 禁止:忽略权限错误继续调用 MCP
228
+ ```
229
+
230
+ ---
231
+
232
+ ## 九、重新授权三参数铁律
233
+
234
+ **三个强参数(deviceCode、productCode、mccCode)必须齐全,platform 为可选参数。**
235
+
236
+ | 场景 | deviceCode 来源 | productCode 来源 | mccCode 来源 |
237
+ |------|-----------------|------------------|--------------|
238
+ | 首次授权 | login 返回 | Step 2 确认的 salesCode | Step 2 推荐的类目编码 |
239
+ | 重新授权 | 新 login 返回 | 显式参数或状态文件 salesCode | 显式参数或状态文件 mccCode |
240
+
241
+ > ⚠️ **显式参数和状态文件只包含授权链路恢复所需的非敏感上下文,不包含密钥、私钥或业务凭据。**
242
+
243
+ 参数校验:
244
+
245
+ ```bash
246
+ if [ -z "$DEVICE_CODE" ] || [ -z "$SALES_CODE" ] || [ -z "$MCC_CODE" ]; then
247
+ echo "❌ 授权链接参数不完整,无法生成授权链接"
248
+ exit 1
249
+ fi
250
+ ```
251
+
252
+ ---
253
+
254
+ ## 十、CLI 命令规范
255
+
256
+ ### 10.1 禁止行为
257
+
258
+ ```
259
+ ❌ 禁止:不带 --scope 参数执行 login
260
+ ❌ 禁止:自行修改 scope 格式或值
261
+ ❌ 禁止:自行创造 CLI 参数
262
+ ❌ 禁止:修改授权链接格式
263
+ ```
264
+
265
+ ### 10.2 检测工具设置
266
+
267
+ > 📎 所有签约 `.sh` 脚本都会通过 `error_handler.sh` 间接初始化 `DEV_TOOL_NAME` 并设置 `PLATFORM`,无需手动设置。
268
+
269
+ 签约脚本通过 `scripts/error_handler.sh` 加载 `../../../normal/scripts/common.sh`,再由 `init_dev_tool_name` 调用 `detect_dev_tool.sh` 初始化 `DEV_TOOL_NAME`;Step 1 的环境检查只负责确认工具可用,不要求 Agent 手动添加 `DEV_TOOL_NAME=...` 前缀。