@alipay/alipay-aipay 1.0.2 → 1.2.2

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 (67) hide show
  1. package/dist/commands/install.d.ts.map +1 -1
  2. package/dist/commands/install.js +71 -22
  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 +9 -9
  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 +38 -22
  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 +3 -4
  34. package/skill/SKILL.md +77 -11
  35. package/skill/VERSION +1 -0
  36. package/skill/references/integration/flow.md +154 -136
  37. package/skill/references/integration/modules/alipay-sdk-reminder.md +29 -13
  38. package/skill/references/integration/modules/checklist.md +49 -19
  39. 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 +3 -3
  40. package/skill/references/integration/modules/code-examples/csharp/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.cs +27 -13
  41. 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 +3 -3
  42. package/skill/references/integration/modules/code-examples/java/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemoController.java +31 -12
  43. 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 +5 -4
  44. package/skill/references/integration/modules/code-examples/nodejs/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.js +69 -37
  45. 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 +3 -3
  46. package/skill/references/integration/modules/code-examples/php/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.php +38 -17
  47. package/skill/references/integration/modules/code-examples/python/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +3 -3
  48. package/skill/references/integration/modules/code-examples/python/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.py +31 -18
  49. package/skill/references/integration/modules/interface-guide.md +7 -3
  50. package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +77 -48
  51. package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +8 -5
  52. package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +157 -117
  53. package/skill/references/integration/modules/scripts/local_402_sandbox_pay.py +35 -4
  54. package/skill/references/normal/alipay-cli-env.md +13 -11
  55. package/skill/references/normal/self-update.md +59 -0
  56. package/skill/references/onboarding/flow.md +202 -282
  57. package/skill/references/onboarding/modules/app-release.md +91 -35
  58. package/skill/references/onboarding/modules/authorization.md +49 -22
  59. package/skill/references/onboarding/modules/error-handling.md +19 -14
  60. package/skill/references/onboarding/modules/product-sign.md +23 -20
  61. package/skill/references/onboarding/modules/scripts/app.sh +139 -40
  62. package/skill/references/onboarding/modules/scripts/auth.sh +183 -101
  63. package/skill/references/onboarding/modules/scripts/error_handler.sh +148 -18
  64. package/skill/references/onboarding/modules/scripts/query_sign_status.sh +17 -11
  65. package/skill/references/onboarding/modules/scripts/service.sh +208 -37
  66. package/skill/references/onboarding/modules/scripts/upload_screenshots.sh +1 -1
  67. package/skill/references/onboarding/modules/service-registration.md +72 -29
@@ -1,8 +1,8 @@
1
1
  # 按量付费沙箱测试
2
2
 
3
- > ⚠️ **仅当产品为「按量付费」时执行此步骤**。网站支付和APP支付无需此步骤,跳过直接进入步骤 6。
3
+ > ⚠️ **仅当产品为「按量付费」时执行本文档定义的联调**。网站支付不执行本文档,但仍必须按 `sandbox-setup-guide.md` 第 5.4 节完成网站支付沙箱付款提示;APP支付按集成主流程跳过步骤 5。
4
4
 
5
- 本文档定义按量付费 402 协议的沙箱端到端支付测试流程。测试脚本位于 `../scripts/local_402_sandbox_pay.py`。
5
+ 本文档定义按量付费 402 协议的沙箱端到端服务端联调流程。测试脚本位于 `../scripts/local_402_sandbox_pay.py`。
6
6
 
7
7
  > 本文档位于 `references/integration/modules/sandbox/`,文中的 `../scripts/...` 路径相对本目录;从技能包根目录执行时对应 `references/integration/modules/scripts/...`。
8
8
 
@@ -16,6 +16,7 @@
16
16
  2. **用户本地服务已启动**:服务端已运行在可访问的地址上(如 `http://localhost:5000/demo/a2m/resource`)
17
17
  3. **已知沙箱买家 2088 账号**:从步骤 2 沙箱信息输出的买家账号中获取 `userId`(如 `2088722100508485`)
18
18
  4. **Python 3 可用**:测试脚本依赖 Python 3 运行
19
+ 5. **已使用沙箱服务 ID**:用户服务的沙箱运行配置中 `serviceId` 固定为 `api_mock_service_id`,不要向用户索要正式 `serviceId`
19
20
 
20
21
  ---
21
22
 
@@ -46,11 +47,13 @@ required = [
46
47
  missing = [f"{path[0]}.{path[1]}" for path in required if not data.get(path[0], {}).get(path[1])]
47
48
  if missing:
48
49
  raise SystemExit("缺少字段: " + ", ".join(missing))
50
+ if data.get("method", {}).get("service_id") != "api_mock_service_id":
51
+ raise SystemExit("沙箱联调 method.service_id 必须为 api_mock_service_id")
49
52
  print("Payment-Needed 预检通过,已确认 HTTP 402 和关键字段存在。")
50
53
  print("已校验字段: " + ", ".join(f"{path[0]}.{path[1]}" for path in required))'
51
54
  ```
52
55
 
53
- POST 服务将首行 curl 替换为 `curl -s -D - -o /dev/null -X POST -H "Content-Type: ${CONTENT_TYPE:-application/json}" -d "$BODY" "$SERVICE_URL"`。`seller_signature` 由代码示例中的 `generateSellerSignature` / `generate_seller_signature` 生成,禁止使用空值或占位符。预检输出只打印校验结论和字段名,不打印字段值。
56
+ POST 服务将首行 curl 替换为 `curl -s -D - -o /dev/null -X POST -H "Content-Type: ${CONTENT_TYPE:-application/json}" -d "$BODY" "$SERVICE_URL"`。`seller_signature` 由代码示例中的 `generateSellerSignature` / `generate_seller_signature` 生成,签名入参中的 `service_id` 与 `method.service_id` 都必须使用 `api_mock_service_id`;禁止使用空值、其他占位符或要求用户提供正式 `serviceId`。预检输出只打印校验结论和字段名,不打印字段值。
54
57
 
55
58
  ---
56
59
 
@@ -70,40 +73,48 @@ python3 ../scripts/local_402_sandbox_pay.py
70
73
 
71
74
  - [M-05] 已确认用户本地按量付费服务已启动可访问
72
75
  - [M-05] 已完成 Payment-Needed 预检,确认 HTTP 402 和关键字段存在
73
- - [M-05] 已执行沙箱支付测试脚本 `run`,成功获取 Payment-Needed 并生成付款链接
74
- - [M-05] 用户已在浏览器使用沙箱买家账号完成付款
75
- - [M-05] 已携带 Payment-Proof 重试原服务并验证响应成功
76
- - [M-05] 已确认全链路 402 支付流程通过
76
+ - [M-05] 已执行沙箱支付测试脚本 `run --auto-complete`,成功获取 Payment-Needed、生成付款链接并连续执行服务端联调
77
+ - [M-05] 已携带 Payment-Proof 重试原服务并验证服务响应成功
78
+ - [M-05] 已确认 402 沙箱服务端联调流程通过
77
79
 
78
80
  ---
79
81
 
80
82
  ## 测试流程
81
83
 
82
- ### 第一步:确认服务就绪
84
+ ### 第一步:确定服务与测试参数
83
85
 
84
- 向用户确认:
86
+ 先从已确认的目标项目、已有运行上下文和已校验沙箱配置中确定:
85
87
  1. 按量付费集成代码已部署到本地服务
86
88
  2. 服务已启动并可通过 URL 访问
87
89
  3. 服务实现了 402 协议(无 Payment-Proof 时返回 HTTP 402 + Payment-Needed 头)
88
90
 
89
- **收集测试参数**:
91
+ **确定测试参数**:
90
92
  - `SERVICE_URL`:本地服务请求地址(含 GET 参数,如 `http://localhost:5000/demo/a2m/resource?gift=demo`)
91
93
  - `HTTP_METHOD`:`GET` 或 `POST`
92
94
  - `BUYER_2088`:沙箱买家 2088 账号(`userId`,如 `2088722100508485`)
93
95
 
94
- > ⚠️ 如果缺少任一值,先询问用户。不要编造买家账号。
96
+ > ⚠️ 只有缺少无法从当前上下文取得的真实值时,才询问用户对应信息。不要编造买家账号,也不得将补齐参数变成“是否执行测试”的确认。参数和服务就绪后,向用户输出测试说明并直接进入第二步。
95
97
 
96
98
  ### 第二步:执行沙箱支付测试脚本
97
99
 
98
100
  **⚠️ 脚本的收银接口地址和付款链接前缀已硬编码在脚本中(`PAY_ENDPOINT`、`PAY_URL_PREFIX`),执行时无需额外指定。**
99
101
 
102
+ 先输出对客执行说明,然后立即运行脚本,不等待用户确认:
103
+
104
+ > 开始执行按量付费沙箱服务端联调。
105
+ > - 服务地址:`{SERVICE_URL}`
106
+ > - HTTP 方法:`{HTTP_METHOD}`
107
+ >
108
+ > 我将依次验证 402 Payment-Needed、沙箱收银链路、Payment-Proof 重试和资源交付,完成后输出测试结论。
109
+
100
110
  GET 请求:
101
111
 
102
112
  ```bash
103
113
  python3 ../scripts/local_402_sandbox_pay.py run \
104
114
  --url "$SERVICE_URL" \
105
115
  --method GET \
106
- --buyer-id "$BUYER_2088"
116
+ --buyer-id "$BUYER_2088" \
117
+ --auto-complete
107
118
  ```
108
119
 
109
120
  POST 请求:
@@ -113,7 +124,8 @@ python3 ../scripts/local_402_sandbox_pay.py run \
113
124
  --url "$SERVICE_URL" \
114
125
  --method POST \
115
126
  --body "$BODY" \
116
- --buyer-id "$BUYER_2088"
127
+ --buyer-id "$BUYER_2088" \
128
+ --auto-complete
117
129
  ```
118
130
 
119
131
  **脚本执行步骤**:
@@ -125,6 +137,8 @@ python3 ../scripts/local_402_sandbox_pay.py run \
125
137
  6. 补充 `signature` 字段
126
138
  7. POST 到沙箱收银接口 `http://aicashier.dl.alipaydev.com/openclawpay/agent/v1/pay`
127
139
  8. 生成浏览器付款链接
140
+ 9. 使用同一过程产物构建 Payment-Proof 并重试原始服务
141
+ 10. 输出服务端联调结果
128
142
 
129
143
  **脚本输出**:
130
144
  - Payment-Needed 获取结果和本地过程产物路径(终端不输出原始值)
@@ -133,6 +147,7 @@ python3 ../scripts/local_402_sandbox_pay.py run \
133
147
  - 收银接口返回
134
148
  - **浏览器付款链接**(格式:`https://render.alipay.com/p/yuyan/180020010001290755/pay.html?schema=...`)
135
149
  - 过程产物目录路径(`$ARTIFACT_DIR`)
150
+ - Payment-Proof 重试后的服务响应与测试结论
136
151
 
137
152
  **错误处理**:
138
153
  - 沙箱化 Agent 环境执行本脚本时,首次执行即申请可联网权限;如果已因网络受限失败,复用同一条命令申请可联网权限重试
@@ -142,33 +157,17 @@ python3 ../scripts/local_402_sandbox_pay.py run \
142
157
  - 如果收银接口返回 `PAY_SUBMIT_FAILED`、`系统繁忙` 或缺少 `payScheme`,不要重新请求用户服务生成新订单。脚本默认会自动重试;仍失败时,复用过程产物重试收银接口:
143
158
  ```bash
144
159
  python3 ../scripts/local_402_sandbox_pay.py run \
145
- --reuse-artifact "$ARTIFACT_DIR"
160
+ --reuse-artifact "$ARTIFACT_DIR" \
161
+ --auto-complete
146
162
  ```
147
163
  `--reuse-artifact` 会复用上一轮产物中的 `Payment-Needed`、服务 URL、HTTP 方法、POST 请求体和 Content-Type。脚本不会重新请求用户服务生成新订单。这样可以避免本地内存订单堆积,导致后续 `ORDER_NOT_FOUND` 或多订单兜底匹配失败。
148
164
  - `run` 命令支持 `--pay-retries` 和 `--pay-retry-delay`,用于调大沙箱收银接口临时失败时的重试次数与间隔。
149
165
 
150
- ### 第三步:用户完成付款
166
+ ### 第三步:连续验证 Payment-Proof 重试
151
167
 
152
- **必须将脚本输出的付款链接发给用户**,并提示:
168
+ 标准流程使用第二步命令中的 `--auto-complete`。脚本生成付款链接后,使用同一过程产物继续执行 `complete` 逻辑并输出服务端联调结果。
153
169
 
154
- > 请在浏览器打开以下链接,使用沙箱买家账号完成付款:
155
- > - 买家账号:`{email}`(如 `xxxxx@sandbox.com`)
156
- > - 登录密码:`{logonPassword}`(如 `111111`)
157
- > - 支付密码:`{payPassword}`(如 `111111`)
158
- >
159
- > {付款链接}
160
-
161
- 同时提醒用户:
162
-
163
- > 沙箱支付宝当前仅支持安卓系统。如果尚未安装沙箱版支付宝,请复制以下链接到网页浏览器打开,并使用支付宝客户端扫码下载沙箱版支付宝安装包:
164
- >
165
- > https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original
166
-
167
- 等待用户确认付款成功后,记录过程产物目录 `$ARTIFACT_DIR`,进入第四步。
168
-
169
- ### 第四步:验证 Payment-Proof 重试
170
-
171
- 用户确认付款成功后,运行 `complete` 命令:
170
+ 如果标准命令在生成付款链接后因进程中断而未完成最终重试,使用同一过程产物恢复:
172
171
 
173
172
  ```bash
174
173
  python3 ../scripts/local_402_sandbox_pay.py complete \
@@ -181,13 +180,12 @@ python3 ../scripts/local_402_sandbox_pay.py complete \
181
180
  3. 携带 `Payment-Proof` 请求头重试原始服务地址
182
181
  4. 打印最终服务响应
183
182
 
184
- **沙箱 Payment-Proof 构建规则**:
185
- - `trade_no` 必须使用前面沙箱收银接口下单返回的交易号,即脚本从 `payResponse.protocol.tradeNo` 提取并写入 `state.json` 的值;不要使用商户侧 `out_trade_no`,也不要重新生成。
186
- - `protocol.payment_proof` 在沙箱环境不做强校验,脚本默认用 `trade_no`、买家 2088 和当前毫秒时间戳生成一个非空 SHA-256 值。
187
- - `method.client_session` 是 `{"externalId":"<BUYER_2088>","signature":"-","timestamp":"<毫秒时间戳>"}` 紧凑 JSON 的 Base64 编码。
188
- - 最终 `Payment-Proof` 请求头值是下面整体 JSON 紧凑序列化后的 Base64 编码。
183
+ **Payment-Proof 处理约束**:
184
+ - `trade_no` 必须使用前面沙箱收银接口返回并写入 `state.json` 的交易号;不得改用商户侧 `out_trade_no` 或重新生成。
185
+ - `payment_proof`、`client_session` 和最终请求头由脚本按沙箱联调约定自动处理;Agent 不得手工拼接、改写或向用户展开其原始值和内部处理规则。
186
+ - 进程中断时只复用同一个 `$ARTIFACT_DIR` 恢复,禁止脱离脚本另行构造凭证。
189
187
 
190
- 参考结构:
188
+ Payment-Proof 参考结构:
191
189
 
192
190
  ```json
193
191
  {
@@ -211,21 +209,47 @@ python3 ../scripts/local_402_sandbox_pay.py complete \
211
209
  - `RESOURCE_ID_MISMATCH`:检查验付返回的 `resourceId` 是否非空且与本地订单保存的资源一致。沙箱字段为空时不要把空字符串当作有效资源字段参与强校验;生产环境必须把资源字段缺失作为异常处理。
212
210
  - `FULFILLMENT_CONFIRM_FAILED` 或 HTTP 5xx:资源生成后调用 `alipay.aipay.agent.fulfillment.confirm` 失败时,不要返回成功交付;应保留服务结果并允许同一笔 `Payment-Proof` 重试履约确认。
213
211
 
214
- ### 第五步:测试结论
212
+ ### 第四步:测试结论与可选付款体验
215
213
 
216
214
  测试通过后输出:
217
215
 
218
216
  ```
219
- ✅ 按量付费沙箱全链路测试通过
217
+ ✅ 按量付费沙箱服务端联调通过
220
218
 
221
219
  | 测试项 | 状态 |
222
220
  |--------|------|
223
221
  | 402 Payment-Needed 返回 | ✅ |
224
- | 沙箱收银台付款 | ✅ |
222
+ | 沙箱收银链路 | ✅ |
225
223
  | Payment-Proof 重试 | ✅ |
226
224
  | 资源交付 | ✅ |
227
225
  ```
228
226
 
227
+ 输出测试结论后,将脚本生成的付款链接作为可选体验入口提供给用户,并从已校验的本地沙箱配置读取工具实际返回的沙箱买家账号和密码。字段缺失时省略对应字段,禁止编造:
228
+
229
+ > 如需体验沙箱付款页面,可在浏览器打开以下链接,并使用沙箱买家账号操作:
230
+ > - 买家账号:`{email}`(如有)
231
+ > - 登录密码:`{logonPassword}`(如有)
232
+ > - 支付密码:`{payPassword}`(如有)
233
+ >
234
+ > {付款链接}
235
+
236
+ 同时提供安卓客户端体验说明:
237
+
238
+ > 沙箱支付宝当前仅支持安卓系统。如需安装沙箱版支付宝,请复制以下链接到网页浏览器打开,并使用支付宝客户端扫码下载:
239
+ >
240
+ > https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original
241
+
242
+ 最后必须提醒用户:
243
+
244
+ > 当前 `serviceId=api_mock_service_id` 仅用于沙箱联调。正式上线前,必须替换为支付宝服务市场注册或复用服务后实际返回的真实 `serviceId`。
245
+
246
+ **沙箱支付宝下载红线(Agent 内部约束,不要作为用户提示逐字输出):**
247
+ - 默认只提供上方沙箱支付宝安装直链,复制到网页浏览器打开,并使用支付宝客户端扫码下载。
248
+ - 严禁声称 iOS 也有沙箱版支付宝或可在 iOS 完成沙箱支付宝安装。
249
+ - 严禁引导用户去应用市场、应用商店、搜索引擎或任何第三方站点搜索/下载“沙箱支付宝”。
250
+ - 严禁提供 `https://sandbox.alipay.com`、其他自编 URL、二维码、安装包名称或下载方式。
251
+ - 如果用户明确反馈上述直链、页面二维码无法打开或无法下载,只能引导用户前往支付宝开放平台沙箱工具页 `https://open.alipay.com/develop/sandbox/tool`,按页面指引安装沙箱版支付宝;不得自行补充其他替代渠道。
252
+
229
253
  ---
230
254
 
231
255
  ## 已有 Payment-Needed 值(可选)
@@ -233,7 +257,12 @@ python3 ../scripts/local_402_sandbox_pay.py complete \
233
257
  如果用户已经提供了 `Payment-Needed` 响应头值(如之前已从其他渠道获取),可以通过 `--payment-needed` 参数直接传入,跳过对用户服务的首次请求:
234
258
 
235
259
  ```bash
236
- python3 ../scripts/local_402_sandbox_pay.py run --url "$SERVICE_URL" --method GET --buyer-id "$BUYER_2088" --payment-needed "$PAYMENT_NEEDED_VALUE"
260
+ python3 ../scripts/local_402_sandbox_pay.py run \
261
+ --url "$SERVICE_URL" \
262
+ --method GET \
263
+ --buyer-id "$BUYER_2088" \
264
+ --payment-needed "$PAYMENT_NEEDED_VALUE" \
265
+ --auto-complete
237
266
  ```
238
267
 
239
268
  脚本将直接解码该值并继续后续流程,不再发起 curl 请求。
@@ -247,7 +276,7 @@ python3 ../scripts/local_402_sandbox_pay.py run --url "$SERVICE_URL" --metho
247
276
  3. **过程产物**:默认写入 `/tmp/alipay_local_402_sandbox_pay_<timestamp>`,可通过 `--artifact-dir` 指定
248
277
  4. **买家签名**:默认占位值 `-`,无需修改
249
278
  5. **沙箱化 Agent 网络权限**:脚本内 `fetch_payment_needed` 使用 curl,且收银测试会访问沙箱接口;沙箱化 Agent 环境首次执行即申请可联网权限
250
- 6. **沙箱支付宝安装包**:沙箱支付宝当前仅支持安卓系统;如无法完成付款,引导用户复制 `https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original` 到网页浏览器打开,并使用支付宝客户端扫码下载沙箱版支付宝安装包
279
+ 6. **沙箱支付宝安装包**:沙箱支付宝当前仅支持安卓系统;默认引导用户复制 `https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original` 到网页浏览器打开,并使用支付宝客户端扫码下载。若用户明确反馈该直链、页面二维码无法打开或无法下载,只能引导用户前往支付宝开放平台沙箱工具页 `https://open.alipay.com/develop/sandbox/tool`,按页面指引安装沙箱版支付宝。严禁引导用户使用 iOS 沙箱支付宝、应用市场搜索、`https://sandbox.alipay.com` 或其他自编下载 URL。
251
280
 
252
281
  ---
253
282
 
@@ -260,9 +289,9 @@ python3 ../scripts/local_402_sandbox_pay.py run --url "$SERVICE_URL" --metho
260
289
  ↓ snake_case → camelCase + 补充买家ID
261
290
  沙箱收银接口
262
291
  ↓ payScheme
263
- 浏览器付款链接
264
- ↓ 用户扫码/登录付款
265
- 脚本构建 Payment-Proof
292
+ 浏览器付款链接(保留为可选体验入口)
293
+ ↓
294
+ 脚本连续构建 Payment-Proof
266
295
  ↓ base64(protocol + method)
267
296
  重试用户服务
268
297
  ↓ HTTP 200 + 资源内容
@@ -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` 字段完整写入正式本地配置文件,并按 `sandbox-setup-guide.md` 只输出一张沙箱环境摘要表;不输出字段核对表、独立校验结论或“沙箱测试通过”等表述,保持本地文件中的原始字段值不变,不在对话中复述密钥等长字段
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
+ > 下例仅用于说明字段结构;真实执行时按 `sandbox-setup-guide.md` 输出关键字段摘要及工具实际返回的沙箱测试账号登录密码和支付密码,完整私钥、公钥等密钥字段只写入本地配置文件。
80
83
 
81
84
  ```json
82
85
  {
@@ -14,7 +14,7 @@
14
14
  ### 1.2 Windows 用户注意事项
15
15
  **快速沙箱 CLI 工具暂不支持 Windows 系统**。
16
16
 
17
- Windows 用户请前往支付宝开放平台(https://open.alipay.com)- 控制台 - 沙箱应用 自行获取沙箱信息。
17
+ Windows 用户请前往支付宝开放平台(https://open.alipay.com)- 控制台 - 沙箱应用,自行获取沙箱信息。
18
18
 
19
19
  ### 1.3 其他说明
20
20
  沙箱环境暂不支持用户主动通过看板查看测试账号的交易信息(如:卖家余额、交易状态等)。**严禁**引导用户访问所谓的“支付宝沙箱网页版”查看测试账户的余额变动等。
@@ -32,96 +32,52 @@ Windows 用户请前往支付宝开放平台(https://open.alipay.com)- 控
32
32
  - 沙箱配置直接使用沙箱返回的对应私钥字段;生产配置必须确认应用私钥格式与项目语言匹配
33
33
  - 写入 SDK 配置的私钥值都使用不带 PEM 头尾或其他前后缀的原始密钥字符串,禁止手动添加 PEM 头尾、其他前后缀、包装行或说明文字
34
34
  - 生产应用私钥格式与当前语言 SDK 要求不一致时,使用支付宝开放平台密钥工具做私钥格式转换后再配置
35
- - 禁止因 `ERR_OSSL_UNSUPPORTED` 推断私钥格式有问题(通常是 SDK 配置参数错误)
35
+ - 禁止因 `ERR_OSSL_UNSUPPORTED` 推断私钥格式或运行时不兼容;应先检查复制污染、字段映射和 SDK 配置参数
36
36
  - 详见 [SDK 说明文档 - 私钥格式](../alipay-sdk-reminder.md)
37
37
 
38
38
  ---
39
39
 
40
- ## 3. 配置流程
40
+ ## 3. 沙箱初始化流程
41
41
 
42
- ### 3.1 调用工具创建环境
42
+ ### 3.1 获取候选沙箱配置
43
43
 
44
- 参考 [alipay-sandbox-tool](alipay-sandbox-tool.md) 创建快速沙箱环境。
44
+ - Unix/macOS/Linux:参考 [alipay-sandbox-tool](alipay-sandbox-tool.md) 调用快速沙箱工具。
45
+ - Windows:快速沙箱 CLI 工具暂不支持,按第 1.2 节引导用户自行获取沙箱信息。
46
+ - 工具返回 `success === true` 只代表拿到候选 `data`;必须完成第 4 节字段完整性校验后,才允许写入正式配置文件。
47
+ - `success !== true`、`data` 缺失或字段不完整时,按第 6 节失败处理阻断流程。
45
48
 
46
- **异常处理**:创建失败时提示 "❌ 快速沙箱创建失败,请稍后重试"。
49
+ ### 3.2 固定处理顺序
47
50
 
48
- ### 3.2 沙箱信息输出格式
51
+ 1. 提取候选 `data`。
52
+ 2. 按第 4 节逐项校验必含字段。
53
+ 3. 校验通过后,将候选 `data` 按原始 JSON 结构写入正式本地配置文件。
54
+ 4. 输出第 5 节规定的关键字段摘要和实际配置文件路径。
55
+ 5. 后续写入项目 `.env` 或 SDK 配置时,统一从该本地 JSON 文件读取并映射,避免在对话中复述密钥等长字段。
49
56
 
50
- **必须按以下表格格式**输出,**严禁**使用 JSON 代码块。所有字段完整原样展示,不得脱敏、省略或截断。
51
-
52
- **应用配置**
53
-
54
- | 字段 | 说明 | 值 |
55
- |------|------|-----|
56
- | `appId` | 沙箱应用 ID | {实际返回值} |
57
- | `appPrivateKey` | 应用私钥(PKCS#8,Java 语言使用) | {实际返回值} |
58
- | `appPrivatePkcsKey` | 应用私钥(PKCS#1,非 Java 语言使用) | {实际返回值} |
59
- | `alipayPublicKey` | 支付宝公钥 | {实际返回值} |
60
- | `appPublicKey` | 应用公钥 | {实际返回值} |
61
- | `pid` | 商户 PID | {实际返回值} |
62
-
63
- **商家账号**
64
-
65
- | 字段 | 值 |
66
- |------|-----|
67
- | `accountDesc` | {实际返回值} |
68
- | `email` | {实际返回值} |
69
- | `merchantId` | {实际返回值} |
70
- | `userId` | {实际返回值} |
71
- | `acctrans` | {实际返回值} |
72
-
73
- **买家账号**
74
-
75
- | 字段 | 值 |
76
- |------|-----|
77
- | `accountDesc` | {实际返回值} |
78
- | `email` | {实际返回值} |
79
- | `userName` | {实际返回值} |
80
- | `userId` | {实际返回值} |
81
- | `logonPassword` | {实际返回值} |
82
- | `payPassword` | {实际返回值} |
83
- | `certNo` | {实际返回值} |
84
- | `certType` | {实际返回值} |
85
- | `acctrans` | {实际返回值} |
86
-
87
- **沙箱信息**
88
-
89
- | 字段 | 值 |
90
- |------|-----|
91
- | `sandboxId` | {实际返回值} |
92
- | `sandboxName` | {实际返回值} |
57
+ 校验和落盘可使用 Agent 的结构化 JSON 处理能力、Node.js/Python 标准库或其他可用工具实现,不强依赖 `jq`。
93
58
 
94
59
  ---
95
60
 
96
- ## 4. 强校验规则(卡点)
61
+ ## 4. 字段完整性校验(卡点)
97
62
 
98
- 工具返回环境信息后,**必须执行逐项强校验**,校验通过方可进入后续步骤。未通过则**阻断流程**,要求重新创建。
63
+ 工具返回环境信息后,必须先逐项校验。任一必含字段缺失或为空时,立即停止,不得写入正式 `.alipay-sandbox.json`,并明确告知具体缺失字段。
99
64
 
100
65
  ### 4.1 必含字段清单
101
66
 
102
- 以下字段必须全部存在且非空:
67
+ 以下字段必须按项目语言和测试账号要求存在且非空:
103
68
 
104
69
  | 字段 | 说明 |
105
70
  |---|---|
106
71
  | `appId` | 沙箱应用 ID |
107
- | `appPrivateKey` / `appPrivatePkcsKey` | 应用私钥(Java 使用 `appPrivateKey`,非 Java 使用 `appPrivatePkcsKey`) |
72
+ | 应用私钥 | Java 必须存在 `appPrivateKey`;非 Java 必须存在 `appPrivatePkcsKey` |
108
73
  | `alipayPublicKey` | 支付宝公钥 |
109
74
  | `appPublicKey` | 应用公钥 |
110
75
  | 商家账号 | 沙箱商家登录账号 |
111
76
  | 买家账号 | 沙箱买家测试账号 |
77
+ | 买家账号 `logonPassword` | 沙箱买家登录密码 |
78
+ | 买家账号 `payPassword` | 沙箱买家支付密码 |
112
79
 
113
- ### 4.2 绝对禁止(红线)
114
-
115
- **以下行为严格禁止:**
116
-
117
- 1. **禁止编造字段** —— 不得生成、拼接、模拟、猜测缺失的字段值
118
- 2. **禁止用占位符冒充真实数据** —— 当沙箱成功返回完整配置时,禁止用占位符代替真实返回值
119
- 3. **禁止假数据** —— 不得自行生成示例私钥、示例账号等任何假数据
120
- 4. **禁止假设存在** —— 不得假设"工具返回的应该都有"而不逐项检查
121
- 5. **禁止部分通过** —— 不得因"只有 1 个字段缺失"而继续执行
122
- 6. **禁止跳过校验** —— 不得在未完成逐项校验的情况下直接使用返回结果
123
-
124
- ### 4.3 校验执行清单
80
+ ### 4.2 校验执行清单
125
81
 
126
82
  **规则:** 任一字段缺失 → **立即停止** → 输出错误提示 → **禁止继续**
127
83
 
@@ -134,85 +90,169 @@ Windows 用户请前往支付宝开放平台(https://open.alipay.com)- 控
134
90
  - 非 Java:检查 `appPrivatePkcsKey`(PKCS#1)
135
91
  IF 缺失:输出 "❌ 沙箱环境校验失败:应用私钥字段为空,无法继续集成,请重新创建沙箱环境。" → STOP
136
92
 
137
- □ 检查 alipayPublicKey / appPublicKey / 商家账号 / 买家账号
93
+ □ 检查 alipayPublicKey / appPublicKey / 商家账号 / 买家账号 / 买家账号 logonPassword / 买家账号 payPassword
138
94
  IF 任一缺失:输出对应字段缺失错误 → STOP
139
95
 
140
- □ 全部通过 → 输出 "✅ 沙箱环境校验通过"
96
+ □ 全部通过 → 不对客输出字段核对表、字段列表、独立的“字段完整性校验通过”提示或任何“沙箱测试通过”表述;直接进入落盘,并按第 5.2 节只输出一张沙箱环境摘要表。
141
97
  ```
142
98
 
143
- ### 4.3.1 配置写入后的后置校验
99
+ ---
144
100
 
145
- 后续步骤将沙箱配置写入用户项目后,必须立即做配置准确性后置校验;校验失败时停止联调,先重新复制沙箱字段或修正 SDK 配置。必须确认以下目标:
101
+ ## 5. 落盘与摘要输出
146
102
 
147
- - 确认写入项目的 `appId`、应用私钥、支付宝公钥来自同一份沙箱返回配置,且与沙箱返回配置一致。
148
- - 确认应用私钥不是占位符、示例值或其他来源的密钥,未出现复制截断或粘贴污染。
149
- - 检查 SDK 配置与私钥字段匹配:`appPrivatePkcsKey` 对应 PKCS#1,`appPrivateKey` 对应 PKCS#8。
150
- - 检查写入 SDK 配置的私钥值不包含 PEM 头尾、其他前后缀、包装行或说明文字。
151
- - 校验输出不得包含私钥、公钥、签名串或完整支付表单。
103
+ ### 5.1 本地配置文件
152
104
 
153
- **常见失败处理:**
154
- - 私钥不完整、配置不一致或 SDK 初始化/解析失败:重新复制完整私钥字段,禁止补字符、猜测或格式转换。
155
- - `DECODER routines::unsupported`:优先检查私钥是否复制完整、是否错误添加 PEM 头尾或其他前后缀、`keyType` 是否错误,不要切换成 PKCS#8 试错。
105
+ - 默认写入已确认的目标项目根目录 `.alipay-sandbox.json`;若该目标目录不适合写入,则写入系统临时目录 `alipay-sandbox-<timestamp>.json`,不得改写到 Agent 原始工作目录或其他项目。
106
+ - JSON 文件必须保留沙箱返回的原始字段名和嵌套结构,不要转换成 `.env` 扁平键值。
107
+ - 文件权限应尽量限制为当前用户可读写,例如 `chmod 600`。
108
+ - 配置落盘后,必须在对话中输出实际路径。路径必须可定位,例如 `/path/to/project/.alipay-sandbox.json` 或 `./.alipay-sandbox.json`。
156
109
 
157
- ### 4.4 重试与失败处理
110
+ ### 5.2 对话摘要
158
111
 
159
- | 失败场景 | 处理策略 |
160
- |---------|---------|
161
- | 首次失败 | 提示 "❌ 快速沙箱创建失败,请稍后重试",等待用户指示后重试 |
162
- | 字段缺失 | 明确告知**具体缺失字段名称**,禁止只说"部分字段缺失" |
163
- | 反复失败(≥2次) | 输出强提醒,提供两个选项:①重新输入指令 ②自行申领沙箱应用,禁止继续自动重试 |
164
- | 用户提供手动配置 | 仍需按「校验执行清单」逐项校验,通过后方可继续 |
112
+ 字段无缺失并完成落盘后,对客只用下方一张表展示沙箱信息,不再展示字段核对表、已校验字段列表或独立的校验结论。表中包含本地配置文件路径、关键标识,以及工具实际返回的沙箱测试账号登录密码和支付密码;密钥、完整签名串和完整支付表单等长字段不得展开。账号没有返回某一可选字段时省略对应内容,禁止编造。
165
113
 
166
- **反复失败提示模板**:
167
114
  ```
168
- 🚨 快速沙箱环境多次创建失败/字段不完整
115
+ 沙箱环境摘要
169
116
 
170
- 缺失字段:[列出具体缺失的字段名称]
171
-
172
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
173
- 请您选择以下方式之一解决:
174
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
175
-
176
- 【选项一】重新输入创建快速沙箱指令
177
- 操作方式:在对话中重新输入"创建快速沙箱"或类似指令
178
- 适用场景:可能因服务波动导致创建失败,稍后重试可能成功
179
-
180
- 【选项二】自行申领沙箱应用
181
- 操作方式:前往支付宝开放平台(https://open.alipay.com)手动申领沙箱应用
182
- 适用场景:需要使用自己的沙箱账号,获取 appId、应用私钥、支付宝公钥等信息后手动配置
183
-
184
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
185
- ⚠️ 在配置完整之前,无法继续集成流程。
186
- ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
117
+ | 信息 | 内容 |
118
+ |---|---|
119
+ | 配置文件 | `<本地配置文件路径>` |
120
+ | 应用 | `appId=<appId>[, pid=<pid,如有>]` |
121
+ | 商家账号 | `email=<email,如有>, userId=<userId,如有>[, 登录密码=<logonPassword,如有>][, 支付密码=<payPassword,如有>]` |
122
+ | 买家账号 | `email=<email,如有>, userId=<userId,如有>, 登录密码=<logonPassword>, 支付密码=<payPassword>` |
123
+ | 沙箱 | `sandboxId=<sandboxId,如有>, sandboxName=<sandboxName,如有>` |
124
+ | 密钥字段 | `appPrivateKey/appPrivatePkcsKey/alipayPublicKey/appPublicKey` 已写入本地配置文件,默认不在对话中展开 |
187
125
  ```
188
126
 
189
- ---
190
-
191
- ## 5. 成功创建后提示(卡点)
127
+ 这张表表示沙箱配置字段完整且已经落盘,不表示支付链路已经测试。禁止把表名、前后提示或后续总结改写为“沙箱环境校验通过”“沙箱测试通过”“沙箱环境测试通过”等结论。
192
128
 
193
- **⛔ 强制要求:校验通过后,必须在回复中完整输出以下内容。**
129
+ ### 5.3 成功创建后提示(卡点)
194
130
 
195
- - **禁止省略**:不得跳过、缩减
196
- - **禁止改写**:必须按原文输出
197
- - **未输出此提示即继续 = 违规**
131
+ 输出第 5.2 节摘要后,必须继续输出以下成功提示。提示可以和摘要连续输出,但不得省略关键提醒。
198
132
 
199
133
  ```
200
134
  ⚠️ 快速沙箱环境已创建完成
201
135
 
202
136
  📌 环境说明
203
137
  - 当前快速沙箱环境仅供测试,不涉及真实资金
204
- - 完整展示沙箱信息,无需对内容脱敏
205
- - 切勿在项目日志中打印私钥信息
138
+ - 完整沙箱信息已写入本地配置文件;对话中展示工具实际返回的沙箱测试账号登录密码和支付密码,以便完成沙箱付款,不展开私钥、公钥、完整签名串或完整支付表单等长字段
139
+ - 切勿在项目日志、对话总结或测试结果中打印私钥信息
206
140
  - 切勿提交正式环境、沙箱环境信息至公共代码仓库(GitHub、GitLab 等)
207
141
 
208
142
  🔔 必做操作
209
- - 请自行妥善保管密钥及测试账号等信息
143
+ - 请自行妥善保管本地配置文件、密钥及测试账号等信息
144
+ - 若需要迁移配置,请从本地配置文件复制,避免通过对话记录传递密钥等完整长字段
210
145
 
211
146
  🔒 安全提醒
212
- - 正式上线前请确保您已拥有正式的应用 appId、经过审核的应用私钥及支付宝公钥,并切换至正式环境重新配置密钥
147
+ - 正式上线前请确保您已拥有正式应用的 appId、对应的应用私钥及支付宝公钥,并确认应用和支付产品已达到上线所需状态后切换至正式环境
213
148
  - 替换生产配置或启动生产支付测试前,确认 `appId`、应用公钥、应用私钥属于同一套生产应用密钥,并根据项目语言确认私钥格式正确;格式不匹配时使用支付宝开放平台密钥工具转换
214
149
  - 正式环境网关地址:https://openapi.alipay.com/gateway.do
215
- - 正式环境涉及真实资金交易,强烈建议在正式上线之前在沙箱环境中完成全链路测试
150
+ - 正式环境涉及真实资金交易,正式上线前应在沙箱环境完成所有可验证的支付链路;受本地网络条件限制的项目必须另行标记和验证
216
151
  ```
217
152
 
218
- **输出检查:** 确认包含 ⚠️📌🔔🔒 四个标记及全部内容后,方可继续后续集成步骤。
153
+ ### 5.4 网站支付沙箱付款提示(代码生成后、集成收尾前)
154
+
155
+ 网站支付代码生成和配置后置校验完成后,先从已确认的目标项目脚本、路由和运行配置中确定真实的服务启动命令和支付页面访问地址,再按回跳分支处理:
156
+
157
+ - **默认分支**:用户未明确关闭同步回跳时,确认 SDK 实际使用的 `return_url`。启动服务并 GET 访问不带支付结果参数的该地址,只验证路由和页面壳;无订单上下文时应展示安全的中性状态,不得放宽真实回跳请求的验签和订单归属校验。确认无 404、认证或重定向循环,且单页应用直接刷新可用。
158
+ - **渲染验证**:Agent 具备浏览器/UI 能力时,打开回跳页确认非空白、无可见报错且关键内容正常渲染;不具备时,请用户打开精确地址确认。未取得证据时不得宣称回跳页已验证或网站支付集成完成。
159
+ - **关闭分支**:用户已明确关闭同步回跳时,不要求或猜测 `return_url`;确认 SDK 请求未传该字段,并验证异步通知、交易查询和商户订单查询页。
160
+
161
+ 完成对应分支校验后,使用本次已校验沙箱配置中的真实买家账号输出以下提示。不得使用示例端口、占位 URL 或猜测地址;启动命令、支付页面访问地址或账号字段无法确定时,指出缺失项并标记为人工待补充。下方尖括号仅是模板槽位,对客输出时必须替换为真实值;缺少真实值时删除对应占位内容并说明缺失项。
162
+
163
+ `curl` 调用下单接口并取得 HTML 支付表单只属于接口冒烟检查,不能替代用户付款指引,也不能据此标记步骤 5 完成。必须提供用户可在浏览器中打开的支付页面地址;页面打开沙箱收银台后,以下两种体验方式同时告知用户,由用户自行二选一。
164
+
165
+ ```text
166
+ 🧪 网站支付沙箱付款指引
167
+
168
+ 网站支付已接入沙箱环境,可以发起一笔测试付款:
169
+ 1. 启动服务并保持运行:`<从目标项目确定的真实启动命令>`
170
+ 2. 使用浏览器访问支付页面:`<从目标项目确定的真实访问地址>`
171
+ 3. 在页面中发起支付,确认页面成功唤起支付宝沙箱收银台。
172
+
173
+ 付款方式(二选一):
174
+
175
+ 方式一:收银台账号登录
176
+ 4. 在沙箱收银台使用以下沙箱买家账号和登录密码登录,无需使用真实支付宝账号:
177
+ - 买家账号:<email>
178
+ - 登录密码:<logonPassword>
179
+ 5. 登录后输入沙箱支付密码完成核身与付款:
180
+ - 支付密码:<payPassword>
181
+
182
+ 方式二:安卓沙箱支付宝扫码
183
+ 4. 沙箱支付宝仅支持 Android。复制以下官方地址到网页浏览器打开,按页面指引安装沙箱支付宝:
184
+ https://mdn.alipayobjects.com/sandboxsys/afts/img/_itHRrdOD9oAAAAAAAAAAAAADgSLAQBr/original
185
+ 5. 在沙箱支付宝中使用上述沙箱买家账号和登录密码登录。
186
+ 6. 返回浏览器中的沙箱收银台,使用沙箱支付宝扫描页面二维码,再输入上述沙箱支付密码完成付款。
187
+ ```
188
+
189
+ 紧接上述步骤追加结果判断,必须按实际回跳分支二选一,禁止同时输出两项:
190
+
191
+ - **默认分支**:“付款后确认浏览器自动返回商户结果页,页面可正常展示并通过服务端查询呈现订单状态。”
192
+ - **关闭分支**:“付款后不会自动返回商户网站;请手动返回商户订单查询页并刷新或查询订单状态。”
193
+
194
+ 两个分支都必须继续提醒:前台页面或同步回跳参数不是支付成功依据,最终结果以验签通过的异步通知或交易查询结果为准。异步通知只有在 `notify_url` 可被支付宝服务器公网访问时才能联调;当前仅有本地或局域网地址时,将该项标记为人工待验证,并明确当前结论属于“本地正式验收 / 本地生产参数验收模式”,不是生产上线完成。
195
+
196
+ **下载渠道红线:**
197
+ - 严禁声称 iOS 支持安装沙箱版支付宝。
198
+ - 严禁引导用户前往应用市场、搜索引擎或第三方站点搜索下载。
199
+ - 如果上述直链或页面二维码无法使用,只能引导用户前往支付宝开放平台沙箱工具页 `https://open.alipay.com/develop/sandbox/tool`,按页面指引安装。
200
+
201
+ ---
202
+
203
+ ## 6. 红线与失败处理
204
+
205
+ ### 6.1 绝对禁止
206
+
207
+ 1. 禁止编造、拼接、模拟、猜测缺失字段。
208
+ 2. 禁止用占位符或示例假数据冒充真实返回值。
209
+ 3. 禁止假设“工具返回的应该都有”而跳过逐项校验。
210
+ 4. 禁止字段不完整时继续集成或写入正式 `.alipay-sandbox.json`。
211
+ 5. 除沙箱测试账号的登录密码和支付密码外,禁止把密钥等长字段整段刷屏输出;禁止展示真实生产账号密码。
212
+
213
+ ### 6.2 重复创建红线
214
+
215
+ - 候选 `data` 通过第 4 节字段完整性校验后,必须使用本次返回的 `data` 完成正式落盘。
216
+ - 禁止为了“把 data 写入本地文件”“避免对话展示长字段”或“重新拿一份完整配置”再次创建沙箱。
217
+ - 如果第一次通过校验的 `data` 因 Agent 操作失误未落盘,应先从已有工具输出、过程产物或当前可访问的执行结果中恢复;无法恢复时必须向用户说明问题并征得用户明确同意后,才可重新创建。
218
+
219
+ ### 6.3 重试与失败处理
220
+
221
+ | 失败场景 | 处理策略 |
222
+ |---------|---------|
223
+ | 首次创建失败 | 提示 "❌ 快速沙箱创建失败,请稍后重试",等待用户指示后重试 |
224
+ | 字段缺失 | 明确告知具体缺失字段名称,禁止只说"部分字段缺失" |
225
+ | 反复失败(≥2次) | 输出强提醒,提供两个选项:①重新输入指令 ②自行申领沙箱应用,禁止继续自动重试 |
226
+ | 用户提供手动配置 | 仍需按第 4 节逐项校验,通过后方可继续 |
227
+
228
+ 反复失败时输出:
229
+
230
+ ```
231
+ 🚨 快速沙箱环境多次创建失败/字段不完整
232
+
233
+ 缺失字段:[列出具体缺失的字段名称]
234
+
235
+ 请您选择以下方式之一解决:
236
+ 1. 重新输入“创建快速沙箱”指令
237
+ 2. 前往支付宝开放平台(https://open.alipay.com)自行申领沙箱应用,需要使用自己的沙箱账号,获取 appId、应用私钥、支付宝公钥等信息后手动配置
238
+
239
+ 在配置完整之前,无法继续集成流程。
240
+ ```
241
+
242
+ ---
243
+
244
+ ## 7. 写入项目后的后置校验
245
+
246
+ 后续步骤将沙箱配置写入用户项目后,必须立即做配置准确性后置校验;校验失败时停止联调,先从第 5.1 节的可信配置文件重新读取字段或修正 SDK 配置。
247
+
248
+ - 确认写入项目的 `appId`、应用私钥、支付宝公钥来自同一份沙箱返回配置。
249
+ - 从第 5.1 节输出的实际配置文件结构化读取并映射字段,禁止从对话、历史代码或示例值复制密钥。
250
+ - 以不输出字段原文的方式比较项目实际读取值与沙箱原值,确认应用私钥不是占位符、示例值或其他来源的密钥,且未出现截断、字符替换或粘贴污染。
251
+ - 检查 SDK 配置与私钥字段匹配:`appPrivatePkcsKey` 对应 PKCS#1,`appPrivateKey` 对应 PKCS#8。
252
+ - 检查写入 SDK 配置的私钥值不包含 PEM 头尾、其他前后缀、包装行或说明文字;业务协议直接使用原生密码库签名时,可按密码库要求临时适配调用入参,但不得修改或覆盖原始配置值。
253
+ - 仅按量付费沙箱联调:项目沙箱运行配置中的 `serviceId` 固定为 `api_mock_service_id`,不从快速沙箱返回中寻找,也不向用户索要正式 `serviceId`。该值不得进入生产配置。
254
+ - 校验输出不得包含私钥、公钥、签名串或完整支付表单。
255
+
256
+ **常见失败处理:**
257
+ - 私钥不完整、配置不一致或 SDK 初始化/签名失败:从第 5.1 节的可信配置文件重新读取正确字段,禁止补字符、猜测或格式转换。
258
+ - `ERR_OSSL_UNSUPPORTED`、`DECODER routines::unsupported` 等错误:优先检查项目读取值是否与沙箱原值一致、字段映射是否正确、SDK 配置是否被加工;不要切换私钥字段或在缺少对照证据时归因于运行时、OpenSSL 或 SDK 兼容性。