@alipay/alipay-aipay 1.0.2 → 1.1.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.
Files changed (45) hide show
  1. package/dist/commands/install.d.ts.map +1 -1
  2. package/dist/commands/install.js +70 -21
  3. package/dist/commands/install.js.map +1 -1
  4. package/dist/commands/prepare-tools.d.ts.map +1 -1
  5. package/dist/commands/prepare-tools.js +16 -4
  6. package/dist/commands/prepare-tools.js.map +1 -1
  7. package/dist/commands/update.d.ts.map +1 -1
  8. package/dist/commands/update.js +8 -8
  9. package/dist/commands/update.js.map +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/utils/alipay-cli.d.ts +6 -0
  13. package/dist/utils/alipay-cli.d.ts.map +1 -1
  14. package/dist/utils/alipay-cli.js +34 -18
  15. package/dist/utils/alipay-cli.js.map +1 -1
  16. package/dist/utils/file.d.ts +9 -2
  17. package/dist/utils/file.d.ts.map +1 -1
  18. package/dist/utils/file.js +33 -3
  19. package/dist/utils/file.js.map +1 -1
  20. package/dist/utils/gpg.d.ts.map +1 -1
  21. package/dist/utils/gpg.js +97 -53
  22. package/dist/utils/gpg.js.map +1 -1
  23. package/dist/utils/jq.d.ts.map +1 -1
  24. package/dist/utils/jq.js +6 -9
  25. package/dist/utils/jq.js.map +1 -1
  26. package/dist/utils/npm.d.ts.map +1 -1
  27. package/dist/utils/npm.js +2 -6
  28. package/dist/utils/npm.js.map +1 -1
  29. package/dist/utils/shell.d.ts +15 -2
  30. package/dist/utils/shell.d.ts.map +1 -1
  31. package/dist/utils/shell.js +216 -12
  32. package/dist/utils/shell.js.map +1 -1
  33. package/package.json +1 -1
  34. package/skill/SKILL.md +4 -1
  35. package/skill/VERSION +1 -0
  36. package/skill/references/integration/flow.md +7 -31
  37. package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +9 -2
  38. package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +8 -5
  39. package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +98 -114
  40. package/skill/references/normal/alipay-cli-env.md +11 -9
  41. package/skill/references/normal/self-update.md +59 -0
  42. package/skill/references/onboarding/flow.md +26 -2
  43. package/skill/references/onboarding/modules/authorization.md +30 -9
  44. package/skill/references/onboarding/modules/product-sign.md +2 -0
  45. package/skill/references/onboarding/modules/scripts/auth.sh +15 -2
@@ -1,46 +1,250 @@
1
1
  import { spawn } from 'child_process';
2
+ /**
3
+ * 执行短命令并强制约束总耗时。使用独立进程组,超时时尽量杀掉 shell
4
+ * 及其子进程,避免工具检测命令异常时拖住 install/update。
5
+ */
6
+ export function execCommand(command, timeout = 5000) {
7
+ return new Promise((resolve, reject) => {
8
+ const child = spawn('sh', ['-c', command], {
9
+ stdio: ['ignore', 'pipe', 'pipe'],
10
+ detached: true,
11
+ });
12
+ let settled = false;
13
+ let timedOut = false;
14
+ let stdout = '';
15
+ let stderr = '';
16
+ let timeoutTimer = null;
17
+ let killTimer = null;
18
+ let fallbackTimer = null;
19
+ function clearTimers() {
20
+ if (timeoutTimer) {
21
+ clearTimeout(timeoutTimer);
22
+ timeoutTimer = null;
23
+ }
24
+ if (killTimer) {
25
+ clearTimeout(killTimer);
26
+ killTimer = null;
27
+ }
28
+ if (fallbackTimer) {
29
+ clearTimeout(fallbackTimer);
30
+ fallbackTimer = null;
31
+ }
32
+ }
33
+ function killChild(signal) {
34
+ try {
35
+ if (child.pid) {
36
+ process.kill(-child.pid, signal);
37
+ }
38
+ else {
39
+ child.kill(signal);
40
+ }
41
+ }
42
+ catch {
43
+ try {
44
+ child.kill(signal);
45
+ }
46
+ catch {
47
+ // ignore
48
+ }
49
+ }
50
+ }
51
+ function releaseChildHandles() {
52
+ try {
53
+ child.stdout?.destroy();
54
+ }
55
+ catch {
56
+ // ignore
57
+ }
58
+ try {
59
+ child.stderr?.destroy();
60
+ }
61
+ catch {
62
+ // ignore
63
+ }
64
+ try {
65
+ child.unref();
66
+ }
67
+ catch {
68
+ // ignore
69
+ }
70
+ }
71
+ function rejectTimeout() {
72
+ if (settled)
73
+ return;
74
+ settled = true;
75
+ clearTimers();
76
+ releaseChildHandles();
77
+ reject(new Error(`Command timed out after ${timeout}ms\nstdout: ${stdout.slice(-2000)}\nstderr: ${stderr.slice(-2000)}`));
78
+ }
79
+ if (child.stdout) {
80
+ child.stdout.on('data', (data) => {
81
+ stdout += data.toString();
82
+ });
83
+ }
84
+ if (child.stderr) {
85
+ child.stderr.on('data', (data) => {
86
+ stderr += data.toString();
87
+ });
88
+ }
89
+ timeoutTimer = setTimeout(() => {
90
+ timedOut = true;
91
+ killChild('SIGTERM');
92
+ killTimer = setTimeout(() => killChild('SIGKILL'), 1000);
93
+ fallbackTimer = setTimeout(rejectTimeout, 1500);
94
+ }, timeout);
95
+ child.on('close', (code) => {
96
+ if (settled)
97
+ return;
98
+ settled = true;
99
+ clearTimers();
100
+ if (timedOut) {
101
+ reject(new Error(`Command timed out after ${timeout}ms\nstdout: ${stdout.slice(-2000)}\nstderr: ${stderr.slice(-2000)}`));
102
+ return;
103
+ }
104
+ if (code === 0) {
105
+ resolve({ stdout, stderr });
106
+ }
107
+ else {
108
+ reject(new Error(`Command exited with code ${code}\nstdout: ${stdout.slice(-2000)}\nstderr: ${stderr.slice(-2000)}`));
109
+ }
110
+ });
111
+ child.on('error', (error) => {
112
+ if (settled)
113
+ return;
114
+ settled = true;
115
+ clearTimers();
116
+ reject(error);
117
+ });
118
+ });
119
+ }
2
120
  /**
3
121
  * 执行可能需要交互式输入的命令(如 sudo 密码、brew 确认等)
4
122
  * 有 TTY 时使用 stdio: 'inherit' 让子进程直接访问终端
5
- * 无 TTY 时(AI agent 环境)降级为 execAsync 行为,捕获输出
123
+ * 无 TTY 时(AI agent 环境)捕获输出,供错误摘要使用
124
+ * 传入 idleTimeout 时,有输出就续期,只在长时间无输出时终止命令
6
125
  */
7
- export function execInteractive(command, timeout = 300000) {
126
+ export function execInteractive(command, timeout = 300000, options = {}) {
8
127
  return new Promise((resolve, reject) => {
9
128
  const hasTty = process.stdin.isTTY;
129
+ const monitorOutput = typeof options.idleTimeout === 'number' && options.idleTimeout > 0;
10
130
  const child = spawn('sh', ['-c', command], {
11
- stdio: hasTty ? 'inherit' : ['pipe', 'pipe', 'pipe'],
131
+ stdio: hasTty && !monitorOutput ? 'inherit' : ['pipe', 'pipe', 'pipe'],
132
+ detached: monitorOutput,
12
133
  });
13
- // 无 TTY 时收集输出用于错误信息
134
+ let settled = false;
14
135
  let stdout = '';
15
136
  let stderr = '';
16
- if (!hasTty && child.stdout) {
137
+ let pendingFailure = null;
138
+ let timeoutTimer = null;
139
+ let idleTimer = null;
140
+ let forceKillTimer = null;
141
+ let failureFallbackTimer = null;
142
+ function clearTimers() {
143
+ if (timeoutTimer) {
144
+ clearTimeout(timeoutTimer);
145
+ timeoutTimer = null;
146
+ }
147
+ if (idleTimer) {
148
+ clearTimeout(idleTimer);
149
+ idleTimer = null;
150
+ }
151
+ if (forceKillTimer) {
152
+ clearTimeout(forceKillTimer);
153
+ forceKillTimer = null;
154
+ }
155
+ if (failureFallbackTimer) {
156
+ clearTimeout(failureFallbackTimer);
157
+ failureFallbackTimer = null;
158
+ }
159
+ }
160
+ function terminateChild(signal) {
161
+ try {
162
+ if (monitorOutput && child.pid) {
163
+ process.kill(-child.pid, signal);
164
+ }
165
+ else {
166
+ child.kill(signal);
167
+ }
168
+ }
169
+ catch {
170
+ try {
171
+ child.kill(signal);
172
+ }
173
+ catch {
174
+ // ignore
175
+ }
176
+ }
177
+ }
178
+ function fail(error) {
179
+ if (settled)
180
+ return;
181
+ if (pendingFailure)
182
+ return;
183
+ pendingFailure = error;
184
+ clearTimers();
185
+ terminateChild('SIGTERM');
186
+ forceKillTimer = setTimeout(() => terminateChild('SIGKILL'), 2000);
187
+ failureFallbackTimer = setTimeout(() => {
188
+ if (settled)
189
+ return;
190
+ settled = true;
191
+ clearTimers();
192
+ reject(error);
193
+ }, 3000);
194
+ }
195
+ function resetIdleTimer() {
196
+ if (!monitorOutput || !options.idleTimeout)
197
+ return;
198
+ if (idleTimer)
199
+ clearTimeout(idleTimer);
200
+ idleTimer = setTimeout(() => {
201
+ fail(new Error(`Command idle timed out after ${options.idleTimeout}ms`));
202
+ }, options.idleTimeout);
203
+ }
204
+ if (child.stdout) {
17
205
  child.stdout.on('data', (data) => {
18
206
  stdout += data.toString();
207
+ if (hasTty && monitorOutput)
208
+ process.stdout.write(data);
209
+ resetIdleTimer();
19
210
  });
20
211
  }
21
- if (!hasTty && child.stderr) {
212
+ if (child.stderr) {
22
213
  child.stderr.on('data', (data) => {
23
214
  stderr += data.toString();
215
+ if (hasTty && monitorOutput)
216
+ process.stderr.write(data);
217
+ resetIdleTimer();
24
218
  });
25
219
  }
26
- const timer = setTimeout(() => {
27
- child.kill();
28
- reject(new Error('Command timed out'));
220
+ timeoutTimer = setTimeout(() => {
221
+ fail(new Error(`Command timed out after ${timeout}ms`));
29
222
  }, timeout);
223
+ resetIdleTimer();
30
224
  child.on('close', (code) => {
31
- clearTimeout(timer);
225
+ if (settled)
226
+ return;
227
+ settled = true;
228
+ clearTimers();
229
+ if (pendingFailure) {
230
+ reject(pendingFailure);
231
+ return;
232
+ }
32
233
  if (code === 0) {
33
234
  resolve(code);
34
235
  }
35
236
  else {
36
- const errMsg = hasTty
237
+ const errMsg = hasTty && !monitorOutput
37
238
  ? `Command exited with code ${code}`
38
239
  : `Command exited with code ${code}\nstdout: ${stdout.slice(-2000)}\nstderr: ${stderr.slice(-2000)}`;
39
240
  reject(new Error(errMsg));
40
241
  }
41
242
  });
42
243
  child.on('error', (err) => {
43
- clearTimeout(timer);
244
+ if (settled)
245
+ return;
246
+ settled = true;
247
+ clearTimers();
44
248
  reject(err);
45
249
  });
46
250
  });
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAAO,GAAG,MAAM;IAC/D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QAEnC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE;YACzC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;SACrD,CAAC,CAAC;QAEH,oBAAoB;QACpB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;gBACvC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,KAAK,CAAC,IAAI,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;QACzC,CAAC,EAAE,OAAO,CAAC,CAAC;QAEZ,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC;iBAAM,CAAC;gBACN,MAAM,MAAM,GAAG,MAAM;oBACnB,CAAC,CAAC,4BAA4B,IAAI,EAAE;oBACpC,CAAC,CAAC,4BAA4B,IAAI,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvG,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;AAC/B,CAAC"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/utils/shell.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alipay/alipay-aipay",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
4
4
  "description": "支付宝 AI 支付技能包 - 一键安装 Agent Skill,并后台准备 alipay-cli 环境",
5
5
  "type": "module",
6
6
  "bin": {
package/skill/SKILL.md CHANGED
@@ -34,9 +34,11 @@ description: >-
34
34
  ### 执行流程(通用)
35
35
 
36
36
  ```
37
- 用户输入 → 加载 references/integration/flow.md 或 references/onboarding/flow.md → 输出待办步骤清单 → 等待确认 → 逐步执行
37
+ 用户输入 → best-effort 自更新检查 → 加载 references/integration/flow.md 或 references/onboarding/flow.md → 输出待办步骤清单 → 等待确认 → 逐步执行
38
38
  ```
39
39
 
40
+ **启动自更新检查**:每次触发本 Skill 时,先读取并执行 `references/normal/self-update.md` 的 best-effort 自更新检查。若本轮对话中刚成功执行过 `npx -y @alipay/alipay-aipay@latest install`,则视为检查已完成,直接继续后续流程。该检查不作为业务阻塞确认点;若当前 Agent 环境要求联网或写入用户 Skill 目录授权,则按环境权限机制处理。
41
+
40
42
  **产品推荐入口:**
41
43
  - 集成场景:读取 `references/integration/modules/product-decision.md` 做支付产品推荐与澄清。
42
44
  - 签约/入驻场景:读取 `references/onboarding/flow.md` 的 Step 2“方案规划”做产品匹配与推荐。
@@ -68,6 +70,7 @@ alipay-aipay/
68
70
  └── references/
69
71
  ├── normal/ # 通用文档(集成 + 签约共用)
70
72
  │ ├── alipay-cli-env.md # alipay-cli 检测与安装
73
+ │ ├── self-update.md # 启动自更新检查
71
74
  │ ├── rejection-guide.md # 不支持产品的拒绝引导话术
72
75
  │ └── scripts/ # 通用脚本
73
76
  │ ├── common.sh # shell 公共函数与初始化入口
package/skill/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.0.6
@@ -163,43 +163,19 @@ Agent 出现如下任何一种行为即视为违规:
163
163
  > ⚠️ **必须完整阅读** `modules/sandbox/sandbox-setup-guide.md` 后方可执行本步骤
164
164
 
165
165
  **完成条件**:
166
- - [M-02] **必须**已完整阅读 `modules/sandbox/sandbox-setup-guide.md`(含强校验规则、输出格式、红线禁止)
166
+ - [M-02] **必须**已完整阅读 `modules/sandbox/sandbox-setup-guide.md`
167
167
  - [M-02] 已检测用户操作系统类型
168
- - [M-02] Unix/macOS/Linux:已调用沙箱工具成功创建环境
169
- - [M-02] Windows:已引导用户自行获取沙箱信息
170
- - [M-02] 已按文档要求完成沙箱信息强校验(**逐项核对必含字段清单**),并完整输出
168
+ - [M-02] Unix/macOS/Linux:已调用沙箱工具获取候选沙箱 `data`
169
+ - [M-02] Windows:已引导用户自行获取沙箱信息并提供配置
170
+ - [M-02] 已按 `sandbox-setup-guide.md` 完成字段完整性校验、正式落盘、摘要输出、配置文件路径输出和成功创建后提示
171
171
 
172
172
  **操作流程**:
173
173
  1. 检测用户操作系统(Windows/macOS/Linux)
174
174
  2. Windows用户:引导自行获取沙箱信息,参考 `modules/sandbox/sandbox-setup-guide.md` 第 1.2 节
175
- 3. Unix/macOS/Linux用户:调用沙箱工具创建环境
175
+ 3. Unix/macOS/Linux用户:参考 `modules/sandbox/alipay-sandbox-tool.md` 调用沙箱工具
176
+ 4. 按 `modules/sandbox/sandbox-setup-guide.md` 的顺序处理候选 `data`:字段完整性校验 → 正式落盘 → 输出关键摘要与配置文件路径
176
177
 
177
- **⚠️ 沙箱信息输出格式(必须严格遵循)**:
178
-
179
- > 详细输出格式见 `modules/sandbox/sandbox-setup-guide.md` 第 3.2 节
180
- >
181
- > **必须按表格格式输出**,包含以下全部内容:
182
-
183
- | 类别 | 必含字段 |
184
- |------|---------|
185
- | 应用配置 | `appId`、`appPrivateKey`、`appPrivatePkcsKey`、`alipayPublicKey`、`appPublicKey`、`pid` |
186
- | 商家账号 | `accountDesc`、`email`、`merchantId`、`userId`、`acctrans` |
187
- | 买家账号 | `accountDesc`、`email`、`userName`、`userId`、`logonPassword`、`payPassword` |
188
- | 沙箱信息 | `sandboxId`、`sandboxName` |
189
-
190
- **强校验规则**:
191
- - 工具返回后,**必须逐项核对**上述必含字段是否存在且非空
192
- - 如有字段缺失,**阻断流程**,要求重新创建
193
- - 后续步骤将沙箱配置写入用户项目后,必须做配置准确性后置校验,确认写入值来自同一份沙箱返回配置,且与沙箱返回值一致、字段选择正确、SDK 配置匹配、无占位符或截断。校验失败必须阻断后续联调,先重新复制沙箱字段或修正 SDK 配置。
194
-
195
- **绝对禁止**:
196
- - ❌ 禁止编造字段
197
- - ❌ 禁止用占位符(xxx)代替真实返回值
198
- - ❌ 禁止用示例假数据(如 `MIIEvw...`)冒充
199
- - ❌ 禁止使用 JSON 代码块输出
200
- - ❌ 禁止省略任何字段
201
-
202
- > ⚠️ 详细操作、输出格式、强校验规则、红线禁止请参阅 `modules/sandbox/sandbox-setup-guide.md`
178
+ > 沙箱必含字段、落盘格式、路径输出、重复创建红线、失败处理和写入项目后的后置校验,均以 `modules/sandbox/sandbox-setup-guide.md` 为准。
203
179
 
204
180
  ---
205
181
 
@@ -160,10 +160,17 @@ python3 ../scripts/local_402_sandbox_pay.py run \
160
160
 
161
161
  同时提醒用户:
162
162
 
163
- > 沙箱支付宝当前仅支持安卓系统。如果尚未安装沙箱版支付宝,请复制以下链接到网页浏览器打开,并使用支付宝客户端扫码下载沙箱版支付宝安装包:
163
+ > 沙箱支付宝当前仅支持安卓系统。如果尚未安装沙箱版支付宝,请复制以下链接到网页浏览器打开,并使用支付宝客户端扫码下载:
164
164
  >
165
165
  > https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original
166
166
 
167
+ **沙箱支付宝下载红线(Agent 内部约束,不要作为用户提示逐字输出):**
168
+ - 默认只提供上方沙箱支付宝安装直链,复制到网页浏览器打开,并使用支付宝客户端扫码下载。
169
+ - 严禁声称 iOS 也有沙箱版支付宝或可在 iOS 完成沙箱支付宝安装。
170
+ - 严禁引导用户去应用市场、应用商店、搜索引擎或任何第三方站点搜索/下载“沙箱支付宝”。
171
+ - 严禁提供 `https://sandbox.alipay.com`、其他自编 URL、二维码、安装包名称或下载方式。
172
+ - 如果用户明确反馈上述直链、页面二维码无法打开或无法下载,只能引导用户前往支付宝开放平台沙箱工具页 `https://open.alipay.com/develop/sandbox/tool`,按页面指引安装沙箱版支付宝;不得自行补充其他替代渠道。
173
+
167
174
  等待用户确认付款成功后,记录过程产物目录 `$ARTIFACT_DIR`,进入第四步。
168
175
 
169
176
  ### 第四步:验证 Payment-Proof 重试
@@ -247,7 +254,7 @@ python3 ../scripts/local_402_sandbox_pay.py run --url "$SERVICE_URL" --metho
247
254
  3. **过程产物**:默认写入 `/tmp/alipay_local_402_sandbox_pay_<timestamp>`,可通过 `--artifact-dir` 指定
248
255
  4. **买家签名**:默认占位值 `-`,无需修改
249
256
  5. **沙箱化 Agent 网络权限**:脚本内 `fetch_payment_needed` 使用 curl,且收银测试会访问沙箱接口;沙箱化 Agent 环境首次执行即申请可联网权限
250
- 6. **沙箱支付宝安装包**:沙箱支付宝当前仅支持安卓系统;如无法完成付款,引导用户复制 `https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original` 到网页浏览器打开,并使用支付宝客户端扫码下载沙箱版支付宝安装包
257
+ 6. **沙箱支付宝安装包**:沙箱支付宝当前仅支持安卓系统;默认引导用户复制 `https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original` 到网页浏览器打开,并使用支付宝客户端扫码下载。若用户明确反馈该直链、页面二维码无法打开或无法下载,只能引导用户前往支付宝开放平台沙箱工具页 `https://open.alipay.com/develop/sandbox/tool`,按页面指引安装沙箱版支付宝。严禁引导用户使用 iOS 沙箱支付宝、应用市场搜索、`https://sandbox.alipay.com` 或其他自编下载 URL。
251
258
 
252
259
  ---
253
260
 
@@ -14,7 +14,7 @@ which alipay-cli 2>/dev/null && alipay-cli version
14
14
 
15
15
  ## 2. 创建快速沙箱
16
16
 
17
- **重要:输出时必须完整展示所有字段,不允许省略 privateKey、publicKey 等长字段。如果输出被截断,需按 `sandbox-setup-guide.md` 的表格格式重新输出完整字段。**
17
+ **重要:工具返回的 `data` 只是候选沙箱配置;必须先按 `sandbox-setup-guide.md` 完成字段完整性校验,校验通过后再写入正式本地配置文件。对话中只展示关键字段摘要和配置文件路径,避免 privateKey、publicKey、账号密码等长字段刷屏。**
18
18
 
19
19
  `createAnonymousSandbox` 的 MCP 请求体只有业务入参 `request.appType`。`PLATFORM`、`PRODUCT` 是 alipay-cli 上下文环境变量,禁止写入 `--data` 的 JSON。
20
20
 
@@ -54,8 +54,9 @@ alipay-cli mcp call alipay-anonymous-sandbox.createAnonymousSandbox \
54
54
  **结果解析:**
55
55
 
56
56
  1. 取 `result.content[0].text`,去转义还原 JSON
57
- 2. `success === true` → 输出简短成功提示,将 `data` 字段**完整原样**按 [沙箱环境初始化](sandbox-setup-guide.md) 中的沙箱信息输出格式以表格展示,保持原始字段值不变,不做任何脱敏、省略或重排
58
- 3. `success !== true` → 按错误处理流程
57
+ 2. `success === true` → 提取 `data` 字段作为候选沙箱配置,先按 [沙箱环境初始化](sandbox-setup-guide.md) 的必含字段清单做完整性校验
58
+ 3. 字段完整性校验通过 → 将 `data` 字段完整写入正式本地配置文件,并按摘要输出格式展示关键字段;保持本地文件中的原始字段值不变,不在对话中复述长字段
59
+ 4. `success !== true` 或 `data` 字段缺失/字段不完整 → 按错误处理流程阻断;不得写入正式 `.alipay-sandbox.json`
59
60
 
60
61
  ## 3. 错误处理
61
62
 
@@ -74,9 +75,11 @@ CLI 输出不暴露 HTTP 状态码,统一按响应体中的 `success` 字段
74
75
  - 执行前向用户展示即将运行的命令
75
76
  - 参数不确定时先向用户确认
76
77
 
77
- ## 返回示例
78
+ ## 返回结构示例
78
79
 
79
- ### 成功示例
80
+ ### 成功结构示例
81
+
82
+ > 下例仅用于说明字段结构;真实执行时默认只输出关键字段摘要,完整私钥、公钥、账号密码等长字段写入本地配置文件。
80
83
 
81
84
  ```json
82
85
  {