@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.
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +71 -22
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/prepare-tools.d.ts.map +1 -1
- package/dist/commands/prepare-tools.js +16 -4
- package/dist/commands/prepare-tools.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +9 -9
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/alipay-cli.d.ts +6 -0
- package/dist/utils/alipay-cli.d.ts.map +1 -1
- package/dist/utils/alipay-cli.js +38 -22
- package/dist/utils/alipay-cli.js.map +1 -1
- package/dist/utils/file.d.ts +9 -2
- package/dist/utils/file.d.ts.map +1 -1
- package/dist/utils/file.js +33 -3
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/gpg.d.ts.map +1 -1
- package/dist/utils/gpg.js +97 -53
- package/dist/utils/gpg.js.map +1 -1
- package/dist/utils/jq.d.ts.map +1 -1
- package/dist/utils/jq.js +6 -9
- package/dist/utils/jq.js.map +1 -1
- package/dist/utils/npm.d.ts.map +1 -1
- package/dist/utils/npm.js +2 -6
- package/dist/utils/npm.js.map +1 -1
- package/dist/utils/shell.d.ts +15 -2
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +216 -12
- package/dist/utils/shell.js.map +1 -1
- package/package.json +3 -4
- package/skill/SKILL.md +77 -11
- package/skill/VERSION +1 -0
- package/skill/references/integration/flow.md +154 -136
- package/skill/references/integration/modules/alipay-sdk-reminder.md +29 -13
- package/skill/references/integration/modules/checklist.md +49 -19
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/skill/references/integration/modules/interface-guide.md +7 -3
- package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +77 -48
- package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +8 -5
- package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +157 -117
- package/skill/references/integration/modules/scripts/local_402_sandbox_pay.py +35 -4
- package/skill/references/normal/alipay-cli-env.md +13 -11
- package/skill/references/normal/self-update.md +59 -0
- package/skill/references/onboarding/flow.md +202 -282
- package/skill/references/onboarding/modules/app-release.md +91 -35
- package/skill/references/onboarding/modules/authorization.md +49 -22
- package/skill/references/onboarding/modules/error-handling.md +19 -14
- package/skill/references/onboarding/modules/product-sign.md +23 -20
- package/skill/references/onboarding/modules/scripts/app.sh +139 -40
- package/skill/references/onboarding/modules/scripts/auth.sh +183 -101
- package/skill/references/onboarding/modules/scripts/error_handler.sh +148 -18
- package/skill/references/onboarding/modules/scripts/query_sign_status.sh +17 -11
- package/skill/references/onboarding/modules/scripts/service.sh +208 -37
- package/skill/references/onboarding/modules/scripts/upload_screenshots.sh +1 -1
- package/skill/references/onboarding/modules/service-registration.md +72 -29
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# 按量付费沙箱测试
|
|
2
2
|
|
|
3
|
-
> ⚠️
|
|
3
|
+
> ⚠️ **仅当产品为「按量付费」时执行本文档定义的联调**。网站支付不执行本文档,但仍必须按 `sandbox-setup-guide.md` 第 5.4 节完成网站支付沙箱付款提示;APP支付按集成主流程跳过步骤 5。
|
|
4
4
|
|
|
5
|
-
本文档定义按量付费 402
|
|
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]
|
|
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
|
-
|
|
185
|
-
- `trade_no`
|
|
186
|
-
- `
|
|
187
|
-
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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` →
|
|
58
|
-
3. `
|
|
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`
|
|
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
|
-
|
|
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
|
-
|
|
51
|
+
1. 提取候选 `data`。
|
|
52
|
+
2. 按第 4 节逐项校验必含字段。
|
|
53
|
+
3. 校验通过后,将候选 `data` 按原始 JSON 结构写入正式本地配置文件。
|
|
54
|
+
4. 输出第 5 节规定的关键字段摘要和实际配置文件路径。
|
|
55
|
+
5. 后续写入项目 `.env` 或 SDK 配置时,统一从该本地 JSON 文件读取并映射,避免在对话中复述密钥等长字段。
|
|
49
56
|
|
|
50
|
-
|
|
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
|
-
|
|
|
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
|
-
|
|
99
|
+
---
|
|
144
100
|
|
|
145
|
-
|
|
101
|
+
## 5. 落盘与摘要输出
|
|
146
102
|
|
|
147
|
-
|
|
148
|
-
- 确认应用私钥不是占位符、示例值或其他来源的密钥,未出现复制截断或粘贴污染。
|
|
149
|
-
- 检查 SDK 配置与私钥字段匹配:`appPrivatePkcsKey` 对应 PKCS#1,`appPrivateKey` 对应 PKCS#8。
|
|
150
|
-
- 检查写入 SDK 配置的私钥值不包含 PEM 头尾、其他前后缀、包装行或说明文字。
|
|
151
|
-
- 校验输出不得包含私钥、公钥、签名串或完整支付表单。
|
|
103
|
+
### 5.1 本地配置文件
|
|
152
104
|
|
|
153
|
-
|
|
154
|
-
-
|
|
155
|
-
-
|
|
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
|
-
###
|
|
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
|
-
-
|
|
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 兼容性。
|