@alipay/alipay-aipay 1.2.2 → 1.4.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -0
- package/dist/commands/install.d.ts.map +1 -1
- package/dist/commands/install.js +13 -12
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/uninstall.d.ts.map +1 -1
- package/dist/commands/uninstall.js +17 -9
- package/dist/commands/uninstall.js.map +1 -1
- package/dist/commands/update.d.ts.map +1 -1
- package/dist/commands/update.js +5 -5
- package/dist/commands/update.js.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/utils/config.d.ts +5 -3
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +34 -12
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/file.d.ts +8 -0
- package/dist/utils/file.d.ts.map +1 -1
- package/dist/utils/file.js +161 -9
- package/dist/utils/file.js.map +1 -1
- package/dist/utils/jq.d.ts.map +1 -1
- package/dist/utils/jq.js +8 -0
- package/dist/utils/jq.js.map +1 -1
- package/package.json +6 -5
- package/skill/SKILL.md +15 -169
- package/skill/VERSION +1 -1
- package/skill/references/integration/flow.md +321 -292
- package/skill/references/integration/modules/alipay-sdk-reminder.md +5 -3
- package/skill/references/integration/modules/checklist.md +41 -27
- package/skill/references/integration/modules/code-examples/csharp/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +199 -0
- package/skill/references/integration/modules/code-examples/csharp/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +8 -4
- package/skill/references/integration/modules/code-examples/csharp/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +6 -2
- package/skill/references/integration/modules/code-examples/csharp/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.cs +3 -1
- package/skill/references/integration/modules/code-examples/java/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +184 -0
- package/skill/references/integration/modules/code-examples/java/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +4 -1
- package/skill/references/integration/modules/code-examples/java/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +5 -2
- package/skill/references/integration/modules/code-examples/java/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemoController.java +3 -1
- package/skill/references/integration/modules/code-examples/nodejs/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +135 -0
- package/skill/references/integration/modules/code-examples/nodejs/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +16 -10
- package/skill/references/integration/modules/code-examples/nodejs/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +10 -4
- package/skill/references/integration/modules/code-examples/nodejs/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.js +2 -1
- package/skill/references/integration/modules/code-examples/php/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +157 -0
- package/skill/references/integration/modules/code-examples/php/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +4 -1
- package/skill/references/integration/modules/code-examples/php/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +5 -2
- package/skill/references/integration/modules/code-examples/php/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.php +2 -1
- package/skill/references/integration/modules/code-examples/python/1-/351/200/232/347/224/250/346/216/245/345/217/243//345/274/202/346/255/245/351/200/232/347/237/245/345/244/204/347/220/206/344/273/243/347/240/201/347/244/272/344/276/213.md +128 -0
- package/skill/references/integration/modules/code-examples/python/2-/347/275/221/347/253/231/346/224/257/344/273/230//347/273/237/344/270/200/346/224/266/345/215/225/344/270/213/345/215/225/345/271/266/346/224/257/344/273/230/351/241/265/351/235/242/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +4 -1
- package/skill/references/integration/modules/code-examples/python/3-APP/346/224/257/344/273/230/APP/346/224/257/344/273/230/346/216/245/345/217/243/344/273/243/347/240/201/347/244/272/344/276/213.md +5 -1
- package/skill/references/integration/modules/code-examples/python/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.py +4 -2
- package/skill/references/integration/modules/interface-contract/aipay-interface-contract.md +53 -0
- package/skill/references/integration/modules/interface-contract/apppay-interface-contract.md +45 -0
- package/skill/references/integration/modules/interface-contract/common-trade-contract.md +42 -0
- package/skill/references/integration/modules/interface-contract/notify-url-contract.md +68 -0
- package/skill/references/integration/modules/interface-contract/webpay-interface-contract.md +44 -0
- package/skill/references/integration/modules/interface-guide.md +37 -72
- package/skill/references/integration/modules/product-decision.md +10 -27
- package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +62 -94
- package/skill/references/integration/modules/sandbox/alipay-sandbox-tool.md +43 -40
- package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +93 -114
- package/skill/references/integration/modules/scripts/local_402_sandbox_pay.py +357 -147
- package/skill/references/integration/modules/scripts/sandbox_config.sh +299 -0
- package/skill/references/integration/modules/troubleshooting-flow.md +28 -0
- package/skill/references/normal/alipay-cli-env.md +15 -5
- package/skill/references/normal/full-process-routing.md +80 -0
- package/skill/references/normal/json/customer-messages.json +937 -0
- package/skill/references/normal/json/policy-rules.json +179 -0
- package/skill/references/normal/rejection-guide.md +11 -6
- package/skill/references/normal/scripts/alipay_cli_env.mjs +29 -0
- package/skill/references/normal/scripts/alipay_cli_env.sh +21 -0
- package/skill/references/normal/scripts/common.sh +87 -0
- package/skill/references/normal/scripts/detect_dev_tool.sh +5 -1
- package/skill/references/normal/scripts/integration_message_runner.mjs +801 -0
- package/skill/references/normal/scripts/onboarding_message_runner.mjs +436 -0
- package/skill/references/normal/scripts/open_official_url.sh +82 -0
- package/skill/references/normal/scripts/platform_compat.mjs +39 -0
- package/skill/references/normal/scripts/project_route_inspector.sh +132 -0
- package/skill/references/normal/scripts/python_script_runner.mjs +56 -0
- package/skill/references/normal/scripts/render_customer_message.mjs +1263 -0
- package/skill/references/normal/scripts/self_update.mjs +160 -0
- package/skill/references/normal/scripts/telemetry.mjs +1278 -0
- package/skill/references/normal/self-update.md +18 -51
- package/skill/references/onboarding/flow.md +381 -283
- package/skill/references/onboarding/modules/app-release.md +132 -179
- package/skill/references/onboarding/modules/authorization.md +53 -64
- package/skill/references/onboarding/modules/error-handling.md +31 -34
- package/skill/references/onboarding/modules/product-sign.md +62 -66
- package/skill/references/onboarding/modules/scripts/app.sh +397 -158
- package/skill/references/onboarding/modules/scripts/ar_sign_apply.sh +38 -22
- package/skill/references/onboarding/modules/scripts/auth.sh +479 -167
- package/skill/references/onboarding/modules/scripts/download_key_tool.sh +157 -0
- package/skill/references/onboarding/modules/scripts/error_handler.sh +100 -130
- package/skill/references/onboarding/modules/scripts/network_retry.sh +96 -0
- package/skill/references/onboarding/modules/scripts/query_sign_status.sh +17 -70
- package/skill/references/onboarding/modules/scripts/service.sh +153 -89
- package/skill/references/onboarding/modules/scripts/sign_status_parser.sh +58 -0
- package/skill/references/onboarding/modules/scripts/upload_screenshots.sh +16 -14
- package/skill/references/onboarding/modules/service-registration.md +67 -72
- package/skill/references/runtime-entry.md +62 -0
|
@@ -1,117 +1,83 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 支付产品-代码开发流程
|
|
2
2
|
|
|
3
|
-
> ⚠️ **前置声明**:本 flow 仅支持**网站支付、APP支付、按量付费**三种产品的集成。**其他产品(当面付、订单码支付、JSAPI支付、预授权支付、商家扣款等)暂不支持**,如需集成请前往[支付宝开放平台](https://open.alipay.com/)查阅相关文档。
|
|
3
|
+
> ⚠️ **前置声明**:本 flow 仅支持**网站支付、APP 支付、按量付费**三种产品的集成。**其他产品(当面付、订单码支付、JSAPI支付、预授权支付、商家扣款等)暂不支持**,如需集成请前往[支付宝开放平台](https://open.alipay.com/)查阅相关文档。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
-
|
|
10
|
-
- [强制执行要点](#-强制执行要点)
|
|
11
|
-
- [阻塞确认点索引](#阻塞确认点索引)
|
|
12
|
-
- [完成条件索引](#完成条件索引)
|
|
13
|
-
- [产品文档路由](#-产品文档路由)
|
|
14
|
-
- [集成流程](#集成流程7步--app支付跳过步骤5共6步)
|
|
15
|
-
- [问题排查流程](#问题排查流程功能二)
|
|
16
|
-
- [核心产物](#核心产物)
|
|
17
|
-
- [集成完成确认](#集成完成确认)
|
|
18
|
-
|
|
19
|
-
## 📂 文件路由表
|
|
20
|
-
|
|
21
|
-
> 本文件位于 `references/integration/`。下表中的 `modules/...`、`../normal/...` 路径均相对本文件所在目录;若从技能包根目录定位,请加前缀 `references/integration/`。
|
|
22
|
-
|
|
23
|
-
| 文件 | 说明 | 引用位置 |
|
|
24
|
-
|------|------|----------|
|
|
25
|
-
| **flow.md** | ⭐ 主入口 - 集成流程全览(本文档) | - |
|
|
26
|
-
| **../normal/** | 通用模块 | - |
|
|
27
|
-
| ↳ ../normal/alipay-cli-env.md | alipay-cli 检测与安装 | 步骤 2 沙箱初始化 |
|
|
28
|
-
| ↳ ../normal/rejection-guide.md | 拒绝引导话术 | 通用 |
|
|
29
|
-
| ↳ ../normal/scripts/detect_dev_tool.sh | AI编程工具检测 | 步骤 2 沙箱初始化 |
|
|
30
|
-
| ↳ ../normal/scripts/common.sh | shell 公共函数与初始化入口 | 通用 shell 脚本公共依赖 |
|
|
31
|
-
| **modules/** | 子模块目录 | - |
|
|
32
|
-
| ↳ modules/product-decision.md | 产品决策说明 | 步骤 1 产品决策 |
|
|
33
|
-
| **modules/sandbox/** | 沙箱模块 | - |
|
|
34
|
-
| ↳ modules/sandbox/sandbox-setup-guide.md | 沙箱配置指南 | 步骤 2 沙箱初始化 |
|
|
35
|
-
| ↳ modules/sandbox/alipay-sandbox-tool.md | 沙箱工具使用 | 步骤 2 沙箱初始化 |
|
|
36
|
-
| ↳ modules/alipay-sdk-reminder.md | SDK防坑指南 | 步骤 3 集成前置 |
|
|
37
|
-
| ↳ modules/interface-guide.md | 接口说明与代码示例索引 | 步骤 3 集成前置 / 步骤 4 代码生成 |
|
|
38
|
-
| **modules/code-examples/** | 五语言、按产品分类的代码示例 | 步骤 4 代码生成 |
|
|
39
|
-
| ↳ modules/sandbox/a2m-sandbox-test.md | 按量付费沙箱测试 | 步骤 5 按量付费测试 |
|
|
40
|
-
| ↳ modules/scripts/local_402_sandbox_pay.py | 402沙箱收银测试脚本 | 步骤 5 按量付费测试 |
|
|
41
|
-
| ↳ modules/checklist.md | 集成校验清单 | 步骤 7 集成校验 |
|
|
42
|
-
|
|
43
|
-
> 📌 **使用建议**:从 flow.md 主入口开始,按流程顺序执行各步骤。需要查看详情时,通过上表快速定位对应文件。
|
|
7
|
+
## 按步读取
|
|
8
|
+
|
|
9
|
+
从本 flow 顺序执行;步骤 1 先按操作系统执行登记的环境检查,只有 `CLI_ENV:NEEDS_SETUP` 才读 `../normal/alipay-cli-env.md`,并按本步骤固定协议执行沙箱准备,不提前读取原始 MCP 响应示例或自行解析沙箱配置;步骤 2 只有产品无法唯一确定时才读 `modules/product-decision.md`;步骤 3/5 按需读 `modules/sandbox/sandbox-setup-guide.md`;步骤 4/5 读 `modules/alipay-sdk-reminder.md`、`modules/interface-guide.md`、当前产品本地契约和当前语言示例;步骤 6 仅按量付费读 `modules/sandbox/a2m-sandbox-test.md`;步骤 8 读 `modules/checklist.md`。无关产品、语言、维护说明和尚未到达的模块不提前加载。
|
|
44
10
|
|
|
45
11
|
---
|
|
46
12
|
|
|
47
13
|
## ⛔ 强制执行要点
|
|
48
14
|
|
|
49
|
-
|
|
15
|
+
先确认唯一项目和服务端语言,再在产品确定前执行步骤 1;匿名沙箱不传 `PRODUCT`,缺失时创建、存在时复核,待配置只阻止沙箱依赖动作。步骤 2 唯一确认前不得改代码;`integration_only/full_process` 共用检查器事实和 `integration.start.confirm`,一次只开发一个产品。网站支付/APP 支付必须实现下单、查询、退款、退款查询、关闭和异步通知;按量付费只实现 402、验付和履约确认。本流程不主动发起真实生产交易。
|
|
16
|
+
|
|
17
|
+
生产 `appId`、应用公钥、应用私钥和支付宝公钥必须属于同一生产应用,私钥格式必须匹配当前语言,格式转换只用支付宝官方密钥工具。网站支付/APP 支付本地无公网 `notify_url` 时仍实现通知代码,可暂不传地址并用查询验收;生产上线前必须恢复公网通知及验签、幂等、关键字段、`success` 回写和补偿查询,不得提前宣称生产就绪。
|
|
18
|
+
|
|
19
|
+
### 标准消息执行规则
|
|
20
|
+
|
|
21
|
+
对客消息遵守 `SKILL.md` 唯一目录和 stdout 规则。无托管入口时,动态值只来自本轮实际项目、脚本输出、校验结果或用户确认,并只用动作处受控命令构造;无变量传 `{}`:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
node ../normal/scripts/render_customer_message.mjs --schema <messageId> --variant <VARIANT>
|
|
25
|
+
printf '%s' "$MESSAGE_INPUT_JSON" | node ../normal/scripts/render_customer_message.mjs <messageId> --variant <VARIANT>
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
直接调用 renderer 前先查同一 `messageId + variant` schema;托管消息必须用 `integration_message_runner.mjs` 或登记脚本。失败停步,不手写兜底或猜枚举;成功时 stdout 是唯一正文。脚本终态满足后立即转移,不追加命令复核。
|
|
29
|
+
|
|
30
|
+
**工作目录**:本文 Skill 相对命令以 `references/integration/` 为 workdir;项目命令以 runner 确认的规范化绝对项目根为 workdir。两者不得共享隐含 cwd,Skill 脚本需要项目时显式传绝对路径。
|
|
50
31
|
|
|
51
|
-
|
|
52
|
-
2. **必须获得用户同意**:未经用户同意,禁止启动集成流程
|
|
53
|
-
3. **单一产品原则**:一次只能集成一个产品,完成后再讨论下一个
|
|
54
|
-
4. **禁止假数据与占位符冒充**:沙箱成功返回完整配置时,禁止用占位符代替真实返回值;禁止自行生成示例私钥、示例账号等假数据
|
|
55
|
-
5. **阻塞确认点**:必须等待用户明确回复后才能继续下一步
|
|
56
|
-
6. **禁止合理化跳过确认**:禁止用"用户可能希望快速完成"、"这是一个简单场景"等理由跳过阻塞确认点
|
|
57
|
-
7. **先阅读文档再执行**:每个步骤必须先阅读相关文档,完成该步骤的**完成条件**自检后,方可进入下一步
|
|
58
|
-
8. **生产密钥替换提醒**:当用户要求直接替换生产环境密钥配置,或声称已替换完成并要求启动生产环境支付测试时,必须先基于项目编程语言和应用私钥格式提醒用户:`appId`、应用公钥、应用私钥必须属于同一套应用密钥;应用私钥格式必须与语言 SDK 匹配,格式不匹配时使用支付宝开放平台密钥工具做私钥格式转换。
|
|
59
|
-
9. **依据不足时不编造**:代码集成、SDK 使用、应用创建、应用发布等问题若没有确定依据,必须说明无法确认,并引导用户前往[支付宝开放平台](https://open.alipay.com/)或[支付宝技术支持](https://opensupport.alipay.com/support/intelligent-services?form=payskill)咨询客服;不得猜测接口能力、审核规则或处理时效。
|
|
60
|
-
10. **适用接口必须完整实现**:根据目标产品官方产品文档、接口文档和 `modules/interface-guide.md` 确定适用接口集合。网站支付/APP支付必须实现产品下单、交易查询、退款、退款查询、关闭交易和异步通知处理;按量付费实现 402 协议、支付凭证验证和履约确认,不得添加不适用的通用收单接口。本流程实现和校验项目代码,不主动发起真实生产交易。
|
|
61
|
-
11. **异步通知口径分层**:网站支付/APP支付必须实现异步通知处理代码,但“已实现通知处理”与“已完成公网通知联调”是两件事。用户项目尚未上线、暂无可公网访问 HTTPS `notify_url` 时,可进入“本地生产参数验收模式”:网站支付保留本地同步回跳或结果页并结合订单查询链路,APP支付保留订单查询链路,临时关闭异步通知发起配置或不传 `notify_url`,并把公网通知联调标记为人工待验证;正式上线前仍必须恢复 `notify_url` 并完成公网 HTTPS、验签、幂等、关键字段校验和补偿查询。
|
|
32
|
+
### 耗时事件规则
|
|
62
33
|
|
|
63
|
-
|
|
34
|
+
耗时采集不对客展示,不影响主流程转移。根意图识别后已由 `telemetry.mjs start-run` 确定当前 `run_id`;下列命令会向 stderr 输出唯一 `ALIPAY_AIPAY_INTERNAL:METRIC_EVENT=<json>`,前台只把事件写入用户系统临时目录下带 `alipay-aipay` 标识的本地私有 outbox(默认 `<os.tmpdir>/alipay-aipay-telemetry/outbox`)并启动后台补传,不等待 collector HTTP 结果;后台通过 Yuyan sync-log 上报 code=1005,只在 collector 返回 HTTP 2xx 后删除。已设置 `ALIPAY_AIPAY_TELEMETRY=0|false|off|no`、缺少 run_id、命令异常、网络失败、本地 outbox/run state 写失败或 Yuyan 返回非 2xx 时,均不得阻断当前步骤,也不得向用户解释埋点状态或等待上传结果。最近上传失败状态只写入同一临时目录下的 `upload-status.json`,内部排查可执行 `node ../normal/scripts/telemetry.mjs upload-status`,不得作为对客正文。若最近失败为网络/DNS 类错误且 outbox 有积压,可在阶段间隔或首次业务联网动作旁路执行 `node ../normal/scripts/telemetry.mjs permissioned-flush-needed`;只有出现内部 `PERMISSIONED_FLUSH_NEEDED=true` 时,才通过宿主工具层申请一次可复用联网执行权限运行 `node ../normal/scripts/telemetry.mjs flush-outbox`(即 `flush-outbox` 异步父命令),该命令只启动后台补传子进程并立即返回,建议绑定同一命令前缀。同一 Agent 会话只请求一次;拒绝、后台补传失败或无可复用权限都继续主流程并保留 outbox。取得该权限后,后续阶段间隔和流程收尾可再次旁路执行 `flush-outbox` 触发异步补传;`flush-outbox` stdout 为空,collector HTTP 结果、失败或待重试结果不作为业务转移条件。所有内部行仍按标准规则整行剔除。
|
|
64
35
|
|
|
65
|
-
|
|
66
|
-
>
|
|
67
|
-
|
|
36
|
+
```bash
|
|
37
|
+
node ../normal/scripts/telemetry.mjs stage "<stage>" --root-intent "$ROOT_INTENT" --product-type "$PRODUCT_TYPE"
|
|
38
|
+
```
|
|
68
39
|
|
|
69
|
-
|
|
40
|
+
没有确定产品前省略 `--product-type`;`ROOT_INTENT` 只使用 `integration_only|full_process`。`integration.context_prepare.start`、`integration.start_confirm.start` 和 `integration.closeout.start` 由对应标准消息/runner 自动输出;`integration_only` 的 checklist 最终消息成功生成后,runner 自动记录 `run.terminal` 并结束当前 run,`full_process` 的 Integration 收尾不结束 run。其余下文列明的阶段在动作开始前执行一次。sync-log 上传失败静默保留 outbox,后续 telemetry 命令继续补传,不补问、不改变对客正文。
|
|
70
41
|
|
|
71
|
-
|
|
42
|
+
### 服务声明执行护栏
|
|
72
43
|
|
|
73
|
-
|
|
74
|
-
- 因用户指令中存在"快速接入"、"快点"、"赶紧"等催促关键词而简化本 Skill 中执行流程,不再输出本 Skill 规定的完整待办步骤清单
|
|
75
|
-
- 跳步、合并步骤
|
|
76
|
-
- 进行"我认为..."、"简化起见..."等自行判断
|
|
77
|
-
- **绕过阻塞确认**:在 `<INTERNAL_BLOCKING_CONFIRMATION>` 确认点,禁止以任何理由跳过等待,禁止假设用户已同意或使用"我将继续..."等单方面声明代替用户确认
|
|
78
|
-
- **合理化跳过确认**:用"用户可能希望快速完成"、"这是一个简单场景"、"用户没说不要"等理由合理化跳过阻塞确认点,实际行动仍继续执行而非等待
|
|
44
|
+
服务声明只在 `integration.start.confirm` 三个变体维护;两种执行模式复用同一消息和项目事实,步骤 2 不得另行缩写、总结或拼接。快速沙箱凭据仍受 `P-SANDBOX-CREDENTIAL-EXCEPTION` 约束。
|
|
79
45
|
|
|
80
46
|
---
|
|
81
47
|
|
|
82
48
|
## 阻塞确认点索引
|
|
83
49
|
|
|
50
|
+
<!-- GENERATED:INTEGRATION-GUARDS:START -->
|
|
51
|
+
<!-- 此区块由 scripts/generate-skill-guards.mjs 生成,禁止手改 -->
|
|
52
|
+
### 生成式执行护栏
|
|
53
|
+
|
|
54
|
+
- `P-MCP-CONTRACT-FROZEN`:只执行当前 Skill 已验证脚本中的 MCP 方法、参数和解析;禁止推断、改名、替换或尝试近似方法。
|
|
55
|
+
- `P-A2M-SANDBOX`:按量付费沙箱 serviceId 固定为 api_mock_service_id,SDK 使用沙箱网关;生产网关和真实 serviceId 只用于正式配置。
|
|
56
|
+
- `P-A2M-SUCCESS`:自动联调只有在 HTTP 200、非空可归属资源、无明确业务失败且适用 Payment-Validation 有效时通过。
|
|
57
|
+
- `P-SANDBOX-CREDENTIAL-EXCEPTION`:Unix/macOS/Linux 只允许快速沙箱实际返回且已校验的买家登录/支付密码在沙箱摘要和付款体验中经 stdin 临时渲染。Windows 手工沙箱允许用户在 sandbox.windows.manual_setup 后提供当前沙箱应用的 APPID、支付宝公钥、应用公钥、与当前开发语言匹配的应用私钥和沙箱账号信息;Agent 只能将其用于已确认目标项目的受保护配置,不得在回复、摘要、普通日志或业务状态中复述或另存原文。两类例外均不得扩展到生产环境账号、应用私钥或密码。
|
|
58
|
+
- `P-SENSITIVE-STATE`:用户可以为当前应用设钥明确提供应用公钥,但该输入只用于本次 app.sh key/verify-key/verify-key-and-audit 调用;Agent 回复、对话摘要、普通日志、跨会话状态和宽权限临时文件禁止复述或保存公钥原文。除 P-SANDBOX-CREDENTIAL-EXCEPTION 明确允许的 Windows 手工沙箱当前资料输入外,私钥、token、Payment-Proof、签名串、完整支付表单和未脱敏 MCP 响应同样禁止进入这些位置。临时 URL 只有在 flow 明确登记、已由脚本或 renderer 完成白名单及当前上下文校验且当前动作必须对客展示时,才允许进入该动作的唯一对客正文;即使获准展示,也禁止进入对话摘要、普通日志、跨会话状态或宽权限临时文件。
|
|
59
|
+
- `P-PROJECT-PROTECT`:不得清空、覆盖或删除用户既有项目;只在已确认目标路径和范围内做必要修改。
|
|
60
|
+
- `P-CUSTOMER-OUTPUT-EXCLUSIVE`:flow 指定 renderer 或托管脚本时,其 stdout 是该动作唯一对客正文;工具输出记录、折叠面板或日志不等于已对客发送,Agent 必须把 stdout 原文作为当前回复正文发给用户。禁止在前后添加执行说明、消息 ID、控制标记、摘要、转述或近似话术。阻塞消息发出后立即停止本轮并等待用户。
|
|
61
|
+
- `P-DETERMINISTIC-HANDOFF`:flow 已登记脚本或 renderer 时只执行动作发生位置的固定命令;退出码和登记终态标记满足后立即按 flow 转移,禁止追加 jq、cat、grep、curl 或临时脚本重复解析、复核或解释同一结果。失败只走登记恢复分支;项目代码实现和运行验证除外,但不得把沙箱配置或其他敏感文件打印到工具输出。
|
|
62
|
+
<!-- GENERATED:INTEGRATION-GUARDS:END -->
|
|
63
|
+
|
|
84
64
|
| 位置 | 触发时机 | 等待内容 |
|
|
85
65
|
|------|----------|----------|
|
|
86
|
-
| 步骤
|
|
66
|
+
| 步骤 2 | 产品决策后 | 用户同意服务声明并确认开发特定支付产品 |
|
|
87
67
|
|
|
88
|
-
> 步骤
|
|
68
|
+
> 步骤 6 中,按量付费沙箱测试是沙箱配置就绪后默认自动执行的完成质量门;网站支付在沙箱配置就绪时必须在收尾前向用户提供人工沙箱付款入口和操作说明,但不强制用户当场付款;APP 支付跳过步骤 6。沙箱为 `CREATE_PENDING|VERIFY_PENDING` 时跳过全部沙箱依赖动作,不增加用户确认。步骤 8 的代码开发校验默认自动执行,不作为可选阻塞确认;无法自动验证的项目必须逐项标记为人工待验证。步骤 1 的沙箱字段完整性校验只证明配置可用,不是沙箱支付测试,三类产品都不得据此输出“沙箱测试通过”或等价结论。
|
|
89
69
|
|
|
90
70
|
---
|
|
91
71
|
|
|
92
|
-
##
|
|
72
|
+
## 完成条件规则
|
|
93
73
|
|
|
94
|
-
|
|
95
|
-
|------|------|--------------|
|
|
96
|
-
| 步骤 1 产品决策 | [M-01] | 4 项 |
|
|
97
|
-
| 步骤 2 沙箱初始化 | [M-02] | 5 项 |
|
|
98
|
-
| 步骤 3 集成前置 | [M-03] | 4 项 |
|
|
99
|
-
| 步骤 4 集成代码 | [M-04] | 6 项 |
|
|
100
|
-
| 步骤 5 沙箱测试与体验 | [M-05] | 按量付费 5 项;网站支付 1 项 |
|
|
101
|
-
| 步骤 6 集成后说明 | [M-06] | 2 项 |
|
|
102
|
-
| 步骤 7 集成校验 | [M-07] | 1 项 |
|
|
74
|
+
每条完成条件使用正文中的唯一稳定 ID,并在步骤 8 按当前产品和本轮实际证据逐项检查。新增、删除或调整条件时同步正文与 `modules/checklist.md`,不维护“共有 N 项”或步骤数量索引。缺失证据固定为待验证,禁止为了结束流程推断通过。
|
|
103
75
|
|
|
104
76
|
---
|
|
105
77
|
|
|
106
|
-
## 📖
|
|
107
|
-
|
|
108
|
-
根据用户的业务场景,路由到对应的产品文档:
|
|
78
|
+
## 📖 接口契约路由
|
|
109
79
|
|
|
110
|
-
|
|
111
|
-
|----------|----------|----------|
|
|
112
|
-
| 按量付费 | `alipay.aipay.agent.payment.verify` + `alipay.aipay.agent.fulfillment.confirm` | [按量付费文档](https://ideservice.alipay.com/cms/site/0jaqax) |
|
|
113
|
-
| 网站支付 | `alipay.trade.page.pay` | [网站支付文档](https://ideservice.alipay.com/cms/site/0iztfv) |
|
|
114
|
-
| APP支付 | `alipay.trade.app.pay` | [APP支付文档](https://ideservice.alipay.com/cms/site/0izsn4) |
|
|
80
|
+
当前产品的本地契约、示例路径和官方 `sourceUrl` fallback 入口见 `modules/interface-guide.md`。在线文档只在本地依据缺失、字段不确定、排查官方错误码、用户明确要求或官方能力变化时读取。
|
|
115
81
|
|
|
116
82
|
---
|
|
117
83
|
|
|
@@ -121,115 +87,174 @@ Agent 出现如下任何一种行为即视为违规:
|
|
|
121
87
|
|
|
122
88
|
| 用户意图 | 处理方式 |
|
|
123
89
|
|----------|----------|
|
|
124
|
-
|
|
|
125
|
-
|
|
|
90
|
+
| 需要开发支付产品代码 | 进入支付产品-代码开发流程 |
|
|
91
|
+
| 代码开发中遇到报错 | 进入问题排查流程 |
|
|
126
92
|
|
|
127
93
|
---
|
|
128
94
|
|
|
129
|
-
##
|
|
95
|
+
## 支付产品-代码开发流程
|
|
130
96
|
|
|
131
97
|
### 目标项目执行上下文
|
|
132
98
|
|
|
133
|
-
进入步骤 1
|
|
99
|
+
进入步骤 1 前先确定唯一的规范化目标项目根目录和服务端语言,后续所有用户项目检测、依赖安装、代码与配置写入、服务启动和项目校验命令都必须以该目录为工作目录。`PROJECT_INPUT` 必须保留用户选择项目时的原始表达,不得先改写成“当前项目/当前目录”。用户不需要手写绝对路径;可以选择新建项目,或复用已有项目。新建项目可以说明尚不存在或为空的新目录;若用户明确要新建但不想指定位置,runner 使用用户目录下的默认安全目录并返回规范化地址。复用已有项目必须说明具体项目文件夹,或先让 Agent 在当前目录或用户给出的子目录下定位候选项目。“当前项目/当前目录”只有在 runner 确认当前目录本身是可识别项目根时才接受;否则不得把大目录交给代码扫描。Agent 必须先从本 flow 所在目录调用 `../normal/scripts/integration_message_runner.mjs resolve-project` 或 `locate-projects` 取得规范化事实,再继续检查器和确认链路。Skill 内置 renderer、脚本和参考文件按上方“工作目录规则”从当前文档目录定位,不受目标项目 cwd 影响。禁止因为 Agent 的原始工作目录更方便而改用其他项目,也禁止把临时目录中的产物误报为目标项目产物。
|
|
100
|
+
|
|
101
|
+
- `full_process`:步骤 1 前置准备先继承 `../normal/full-process-routing.md` 已选定的项目来源、规范化项目路径和服务端语言,此时代码开发启动确认尚未发生,不得要求目标产品或代码状态;产品确定、项目扫描并完成唯一启动确认后,进入步骤 2 时继承同一摘要中的目标产品、项目选择分类、目标产品集成状态、其他支付产品、语言和框架。两个阶段都不得重新猜测或静默改选项目。
|
|
102
|
+
- `integration_only`:优先从当前可访问业务项目确定根目录;当前目录不是可识别项目根、存在多个候选或用户要求其他/新项目时,先让用户选定并确认规范化路径,不得自行选择或扫描上层大目录。当前目录内已选定的现有项目分类为 `CURRENT_PROJECT`,用户指定的其他现有路径分类为 `OTHER_PROJECT`;本轮按下条规则初始化成功的新项目在完成步骤 1 后分类为 `PREPARED_NEW_PROJECT`。该分类只用于本轮检查器输入,不持久化。
|
|
103
|
+
- 已有项目:进入任何写操作前确认目标路径可读、在当前 Agent 权限范围内可写、包含可识别项目根标记,且仍对应用户选定的业务项目;需要环境文件权限时按当前权限机制申请,无法取得权限、路径失效或实际项目不符时停止,要求用户提供可访问路径或重新选择项目。完整保留项目结构、已有文件和其他支付能力,只对当前目标产品需要的位置做可审查的局部修改,禁止先删除文件再重建。
|
|
104
|
+
- 新项目:用户可以说明“在当前目录新建 pay-demo”、当前目录下的新子目录名、绝对路径,或只说“新建/新建项目/帮我新建默认项目”。目标路径必须先从本 flow 所在目录执行 `node ../normal/scripts/integration_message_runner.mjs resolve-project --project-input "$PROJECT_INPUT" --base-path "$USER_WORKSPACE_ROOT" --intent new`;该 runner 内部调用固定检查器 `prepare-new`。用户明确要新建但未指定地址时,runner 默认选择用户目录下的 `alipay-aipay-projects/pay-demo`;若已被非空目录占用,则自动选择安全后缀,不清空或覆盖。只有退出码 0 且唯一 JSON 同时满足 `projectSelection=NEW_PROJECT`、`projectOrigin=NEW_PROJECT`、`projectOriginLabel=本轮新建项目`、`preparationStatus=READY`,才能继续确认目标路径或其最近已有父目录在当前 Agent 权限范围内可写。路径非空、预检失败或无法取得写权限时停止,保留其中全部内容,让用户改选明确的空子目录、空同级目录、默认项目或其他尚不存在或为空的目录,禁止清空、覆盖或把该目录强行当作新项目。步骤 1 前只确认创建项目必需的技术栈,不要求用户先确定支付产品;收到针对当前路径和技术栈的明确回复后,才能按确认方式创建目录和初始化项目。创建命令只能来自用户指定方式、可访问模板/项目中的既有命令或本轮已读取的官方文档,且不得使用 `--force` 等覆盖既有文件的选项;禁止凭记忆编造脚手架、依赖或默认工程结构。初始化并完成步骤 1 后,当前会话分类单向转为 `PREPARED_NEW_PROJECT`;重新进入时只按现有项目重新分类,不读取历史状态。
|
|
105
|
+
- 项目准备失败时停留在步骤 1 前置准备,输出实际错误和待补条件;不得进入沙箱准备。目标项目准备成功后记录实际根目录,步骤 1、步骤 3 的沙箱配置和后续代码必须落入该项目;沙箱配置不得降级写入系统临时目录、Agent 原始工作目录或其他项目。
|
|
106
|
+
|
|
107
|
+
**项目选择保护规则**:当前目录已包含项目时,只能让用户选择“保留并在该项目新增目标支付能力”“保留并在指定的新子目录创建独立项目”或“保留并使用指定的其他路径”,不得展示清空或删除选项。用户明确要求“新建/创建”项目、网站、商城、应用或同类新产物时,必须保留完整原始表达并执行 `resolve-project --intent new`;当前目录中恰好已有项目不能把该意图改写为 `--intent existing`。用户未指定地址时走用户目录默认项目规则并返回规范化地址,不得反复要求用户补绝对路径。对 `full_process`,此时必须留在或返回 `../normal/full-process-routing.md` 主编排,取得 `NEW_PROJECT` 的规范化路径、技术栈和初始化结果前不得进入子流程;对 `integration_only`,取得可安全创建的新项目路径前不得进入沙箱准备或代码开发。取得并确认尚不存在或为空的精确路径前不得执行文件操作。
|
|
108
|
+
|
|
109
|
+
**启动前上下文补问**:缺少项目位置或技术栈时,必须从本 flow 所在目录执行下列标准消息,一次补齐;只缺少新项目精确位置时仍使用上方 `integration.project_path.required`。禁止使用 AskUserQuestion、request_user_input、宿主超时默认值、Agent 自创选项或自由话术替代;用户未明确补齐前不得创建目录、初始化项目、安装依赖或修改文件。
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
node ../normal/scripts/integration_message_runner.mjs context-required --missing-items "$MISSING_ITEMS"
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
`MISSING_ITEMS` 只允许由 `项目路径`、`技术栈` 按缺失项用顿号连接生成。产品不明确时使用 `product.clarify`,不得混入本消息。该消息必须把 stdout 原文作为当前回复正文发给用户,发出后立即停止并等待用户自由回复;用户回复后重新计算缺失项,不得靠超时或默认值推进。用户回复“当前项目”、相对路径或新建子目录时,先执行 `resolve-project` 得到规范化绝对路径和 `projectSelection`,再进入后续检查器、沙箱准备和启动确认;相对路径必须位于 `--base-path` 内,目录外项目必须由用户提供绝对路径。
|
|
116
|
+
|
|
117
|
+
用户回复“不知道项目在哪”“帮我找项目”、提供子目录但该目录不是项目根,或当前目录解析失败且需要候选时,从本 flow 所在目录执行下列轻量定位命令。`SEARCH_INPUT` 取用户给出的搜索范围;未给出时固定为 `当前目录`。该命令只查找项目标记文件并跳过常见重目录,不扫描源码内容;stdout 是本动作唯一对客消息,发出后立即停止并等待用户选择候选序号、具体目录或新建目录。用户选择候选后,仍必须再执行 `resolve-project --intent existing` 取得规范化绝对路径;候选列表不能直接替代项目确认。
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
node ../normal/scripts/integration_message_runner.mjs locate-projects --base-path "$USER_WORKSPACE_ROOT" --search-input "$SEARCH_INPUT" --format message
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
**破坏性操作二次确认**:本支付产品-代码开发流程本身不得删除用户既有文件。用户另行主动要求删除具体文件时,先停止代码开发,列出每个精确规范化路径和不可逆影响,再在独立轮次等待用户逐项确认该清单;此前的完整接入启动确认、步骤 2 确认、服务声明确认及任何含糊回复均无效。未取得二次明确确认时严禁调用删除、清空、强制覆盖或等价命令;即使确认,也禁止删除项目根目录、`.git`、使用通配符或触及清单外文件。
|
|
124
|
+
|
|
125
|
+
**执行边界**:本流程只操作用户当前确认的项目路径、语言、框架、产品和范围。步骤 1 只使用项目路径和语言,不依赖产品;步骤 2 后的代码修改才依赖已确认产品。沙箱配置与测试结论来自本轮实际脚本结果,不得被 onboarding 的正式 `appId`、支付宝公钥或 `productionServiceId` 覆盖。
|
|
134
126
|
|
|
135
|
-
|
|
136
|
-
- `integration_only`:优先从当前可访问业务项目确定根目录;不存在、存在多个候选或用户要求其他/新项目时,先让用户选定并确认规范化路径,不得自行选择。
|
|
137
|
-
- 已有项目:进入任何写操作前确认目标路径可读、在当前 Agent 权限范围内可写且仍对应用户选定的业务项目;需要环境文件权限时按当前权限机制申请,无法取得权限、路径失效或实际项目不符时停止,要求用户提供可访问路径或重新选择项目。完整保留项目结构、已有文件和其他支付能力,只对当前目标产品需要的位置做可审查的局部修改,禁止先删除文件再重建。
|
|
138
|
-
- 新项目:目标路径必须尚不存在或已检查为空,初始化前确认目标路径或其最近已有父目录在当前 Agent 权限范围内可写;需要环境文件权限时按当前权限机制申请。路径非空或无法取得写权限时停止,保留其中全部内容,让用户改选明确的空子目录、空同级目录或其他尚不存在或为空的目录,禁止清空、覆盖或把该目录强行当作新项目。步骤 1 必须确认开发语言、框架和项目创建方式,收到该步骤的阻塞确认后才能按确认方式创建目录和初始化项目。创建命令只能来自用户指定方式、可访问模板/项目中的既有命令或本轮已读取的官方文档,且不得使用 `--force` 等覆盖既有文件的选项;禁止凭记忆编造脚手架、依赖或默认工程结构。
|
|
139
|
-
- 项目准备失败时停留在步骤 1,输出实际错误和待补条件;不得进入沙箱初始化。目标项目准备成功后记录实际根目录,步骤 2 的沙箱配置和后续代码必须落入该项目,只有 `modules/sandbox/sandbox-setup-guide.md` 明确允许的情况才能使用临时目录。
|
|
127
|
+
### 步骤 1:环境检查与匿名沙箱准备
|
|
140
128
|
|
|
141
|
-
|
|
129
|
+
**任务**:在确定具体支付产品前,完成当前操作系统分支所需的环境检测并尝试准备沙箱配置;配置未就绪时记录待配置状态并继续代码开发
|
|
142
130
|
|
|
143
|
-
|
|
131
|
+
**完成条件**:
|
|
132
|
+
- [INT.ENV.CLI_READY] Unix/macOS/Linux 的既有 `alipay_cli_env.sh check`,或 Windows Integration 的 `alipay_cli_env.mjs check`,返回唯一 `CLI_ENV:READY`;只有缺失项分支才按 `../normal/alipay-cli-env.md` 完成当前分支要求的安装与验证
|
|
133
|
+
- [INT.ENV.PROJECT_LANGUAGE_READY] 已确认唯一目标项目路径和服务端语言,且目标项目包含已确认语言的构建标识
|
|
134
|
+
- [INT.SANDBOX.OS_DETECTED] 已检测用户操作系统类型
|
|
135
|
+
- [INT.SANDBOX.PREPARATION_RECORDED] Unix/macOS/Linux 已从固定脚本取得唯一 `READY|CREATE_PENDING|VERIFY_PENDING` 终态。`READY` 时配置已安全落盘或复核;待配置不是成功,不满足任何沙箱配置、测试或生产就绪条件,但本步骤允许继续产品确认和代码开发
|
|
136
|
+
- [INT.SANDBOX.WINDOWS_STATE_RECORDED] Windows:本轮既有标准消息后提供的完整有效沙箱资料已写入并校验为 `READY`;未进入该资料收集分支时已记录 `VERIFY_PENDING` 并继续代码实现;只有用户明确要求立即配置时才使用既有标准消息收集资料
|
|
137
|
+
|
|
138
|
+
**执行规则**:
|
|
139
|
+
|
|
140
|
+
1. 只确认创建和保存沙箱所需的目标项目路径、服务端语言与操作系统;不得为了创建匿名沙箱先要求用户确定支付产品。缺少多个字段时使用“启动前上下文补问”的固定标准消息一次补齐;字段已能从用户输入和项目事实确定时,不发送环境、项目识别或准备进度消息。开始执行环境检查前,先执行 `node ../normal/scripts/telemetry.mjs stage integration.env_prepare.start --root-intent "$ROOT_INTENT"`。
|
|
141
|
+
2. Unix/macOS/Linux 从本 flow 目录继续执行既有 `bash ../normal/scripts/alipay_cli_env.sh check`;Windows 执行 `node ../normal/scripts/alipay_cli_env.mjs check`,只检查本 Integration Node runner 所需运行时,不要求 Bash、jq 或当前流程不会调用的 alipay-cli。唯一 `CLI_ENV:READY` 时继续且不读取完整安装文档;`CLI_ENV:NEEDS_SETUP` 时才读取 `../normal/alipay-cli-env.md` 并按当前系统分支补齐后重跑;其他输出、非 0 或 marker 冲突停在本步骤。
|
|
142
|
+
3. Unix/macOS/Linux 从本 flow 所在的 `references/integration/` 目录执行唯一准备入口:
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
bash modules/scripts/sandbox_config.sh ensure "<规范化项目路径>" "<已确认服务端语言>"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
4. Windows 不调用快速沙箱脚本。普通代码开发或完整接入请求没有明确要求当前配置沙箱时,不展示申领消息、不补问,直接记录 `sandboxConfigState=VERIFY_PENDING` 并继续步骤 2。只有用户明确要求现在配置/恢复 Windows 沙箱时,才执行下列既有标准消息 `sandbox.windows.manual_setup`;该消息使用自由资料回复,不要求用户输入 `1` 或自行执行脚本。随后只处理用户针对本轮该消息提供的资料:完整有效时写入目标项目的受保护本机配置并记录 `READY`,部分或错误时使用既有受控失败分支补问实际缺失/错误字段:
|
|
144
149
|
|
|
145
|
-
|
|
150
|
+
```bash
|
|
151
|
+
node ../normal/scripts/integration_message_runner.mjs windows-sandbox-setup
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
资料校验通过后必须建立适用的版本控制忽略和访问保护。该例外只适用于当前沙箱资料;生产环境应用私钥和密码禁止提供给 Agent。Agent 不得在回复、摘要或普通日志中复述收到的值。
|
|
155
|
+
|
|
156
|
+
5. Unix/macOS/Linux 的 `ensure` 只依据同一目标项目的 `.alipay-sandbox.json` 当前事实分流:文件不存在时执行既有 `create`;文件存在或为符号链接时执行既有 `verify` 安全路径。已存在配置不得再次调用 `createAnonymousSandbox`、不得覆盖,也不得因为中断重来要求用户删除配置;无效、不安全或被 Git 跟踪时不得使用,脚本按待配置终态统一输出后继续代码开发。
|
|
157
|
+
6. 只有 Unix/macOS/Linux 创建分支会调用冻结的 `alipay-anonymous-sandbox.createAnonymousSandbox`、`{"request":{"appType":"PUBLICAPP"}}`、`PLATFORM` 环境变量和 `result.content[0].text -> success -> data` 解包逻辑;禁止传入 `PRODUCT`。Windows 不调用该方法或 `sandbox_config.sh`。
|
|
158
|
+
7. Unix/macOS/Linux 只接受以下互斥终态,不能把待配置标记当作成功:
|
|
159
|
+
- `READY`:退出码为 0;唯一带 `ALIPAY_AIPAY_INTERNAL:` 前缀的 `SANDBOX_ENSURE_ACTION=CREATED|VERIFIED`、`SANDBOX_CONFIG_PATH=<同一目标项目绝对路径>/.alipay-sandbox.json` 和 `FLOW:SANDBOX_CONFIG_READY` 内部事实。
|
|
160
|
+
- `CREATE_PENDING`:退出码为 0;脚本 stdout 已渲染唯一 `sandbox.configuration.pending/CREATE` 正文;唯一带 `ALIPAY_AIPAY_INTERNAL:` 前缀的 `SANDBOX_PENDING_PATH=<同一目标项目绝对路径>/.alipay-sandbox.json` 和 `FLOW:SANDBOX_CONFIG_PENDING_CREATE` 内部事实;不得出现 READY 标记。
|
|
161
|
+
- `VERIFY_PENDING`:退出码为 0;脚本 stdout 已渲染唯一 `sandbox.configuration.pending/VERIFY` 正文;唯一带 `ALIPAY_AIPAY_INTERNAL:` 前缀的 `SANDBOX_PENDING_PATH=<同一目标项目绝对路径>/.alipay-sandbox.json` 和 `FLOW:SANDBOX_CONFIG_PENDING_VERIFY` 内部事实;不得出现 READY 标记。
|
|
162
|
+
8. 所有 `ALIPAY_AIPAY_INTERNAL:` 行只用于流程转移;即使宿主合并 stdout/stderr,也必须整行剔除后再判断对客正文。命中 `READY` 时剔除后 stdout 为空,不发送“环境检查完成”“沙箱已创建/已复核”等消息,记录 `sandboxConfigState=READY` 并直接进入步骤 2;命中待配置终态时,脚本 stdout 已包含唯一对客正文,Agent 原文发送且不得转述,分别记录 `sandboxConfigState=CREATE_PENDING|VERIFY_PENDING` 后直接进入步骤 2。两类终态都禁止追加 `jq`、`cat`、`grep`、`ls`、`stat` 或临时脚本;待配置状态还禁止读取、引用或复制当前无效/不存在配置中的任何字段。
|
|
163
|
+
9. 命令非 0、终态标记缺失/重复/冲突、路径不一致或输出含 `SANDBOX_ERROR` 时属于脚本执行协议失败,仍停留在步骤 1;不得把这种执行异常降级为待配置,也不得临场改写 jq、重放原始 MCP 命令或自行检查敏感配置。Windows 配置检查未通过仍按 Windows 登记分支处理。项目内自建 JSON、Agent 自报或补充诊断结果都不能替代上述终态。
|
|
164
|
+
10. 准备阶段不得渲染 `sandbox.environment.summary` 或 `sandbox.environment.reminder`,不得展示沙箱买家密码,也不得输出“沙箱测试通过”。只有 `sandboxConfigState=READY` 且代码开发完成并通过配置后置校验后,才按步骤 5 的摘要展示规则对客展示沙箱环境配置。
|
|
146
165
|
|
|
147
|
-
|
|
166
|
+
### 步骤 2:产品决策
|
|
167
|
+
|
|
168
|
+
**任务**:根据用户场景和目标项目确定接入产品与执行范围,并通过一次确认启动当前支付产品的代码开发
|
|
148
169
|
|
|
149
170
|
**完成条件**:
|
|
150
|
-
- [
|
|
151
|
-
- [
|
|
152
|
-
- [
|
|
153
|
-
- [
|
|
154
|
-
- [
|
|
171
|
+
- [INT.CONTEXT.LANGUAGE] 已在步骤 1 前确认用户服务端开发语言(Java / Python / Node.js / C# / PHP 五选一)
|
|
172
|
+
- [INT.CONTEXT.PROJECT] 已在步骤 1 前确认唯一的规范化目标项目路径;已有项目已验证可访问且保持原有内容,新项目路径已验证为尚不存在或为空并确认框架和项目创建方式
|
|
173
|
+
- [INT.PRODUCT.CONFIRMED] 已根据用户场景决策出支付产品
|
|
174
|
+
- [INT.START.CONFIRMED] 已征得用户明确同意
|
|
175
|
+
- [INT.SERVICE_STATEMENT.CONFIRMED] 已输出服务声明并获得用户同意
|
|
155
176
|
|
|
156
177
|
| 场景关键词 | 产品 |
|
|
157
178
|
|------------|------|
|
|
158
|
-
| AI
|
|
179
|
+
| AI、智能体内收款、大模型、Agent、API、算力、402协议 | 按量付费 |
|
|
159
180
|
| 网站、网页、PC、电商、商城、H5、手机网页 | 网站支付 |
|
|
160
|
-
| APP
|
|
181
|
+
| APP、移动应用支付、手机 APP、iOS、Android、鸿蒙 | APP 支付 |
|
|
161
182
|
| 模糊场景 | 引用 modules/product-decision.md 进行澄清 |
|
|
162
183
|
|
|
163
|
-
|
|
184
|
+
**阻塞规则(执行约束,不是对客正文)**:步骤 2 只在必要时用当前标准消息补问仍无法可靠确定的产品或技术栈;产品不明确用 `product.clarify`,技术栈不明确用 `integration.context.required`;不得重复询问步骤 1 已确认的项目路径和服务端语言。
|
|
164
185
|
|
|
165
|
-
|
|
186
|
+
- `integration_only`:字段齐备后不得先输出产品判断、选择理由、待办、服务声明、执行进度或“即将确认”等内容。必须用步骤 1 确定的 `PROJECT_SELECTION` 对同一项目执行固定 runner,由 runner 内部完成检查器扫描、字段转换和 `integration.start.confirm` 渲染;项目来源、代码状态和其他支付产品不得由 Agent、用户描述或历史状态提供。下列 Node 单行命令在 Unix/macOS/Linux 与 Windows PowerShell 使用相同参数,必须执行:
|
|
166
187
|
|
|
167
|
-
|
|
188
|
+
```bash
|
|
189
|
+
node ../normal/scripts/integration_message_runner.mjs start-confirm --product-type "$PRODUCT_TYPE" --product-name "$PRODUCT_NAME" --project-path "$PROJECT_PATH" --project-selection "$PROJECT_SELECTION" --language "$SERVER_LANGUAGE" --framework "$FRAMEWORK"
|
|
190
|
+
```
|
|
168
191
|
|
|
169
|
-
1
|
|
170
|
-
2. **识别开发语言**:优先读取已有目标项目判断服务端开发语言与框架;无法可靠判断时,询问用户使用 Java / Python / Node.js / C# / PHP 中的哪一种
|
|
171
|
-
3. **输出决策结果**:告知用户识别或推荐的支付产品、目标项目路径、服务端语言、框架、接入范围及选择理由;新项目同时展示确认的创建方式
|
|
172
|
-
4. **输出完整待办步骤清单**:不得省略当前产品适用的步骤、沙箱测试和自动集成校验
|
|
173
|
-
5. **输出服务声明**(完整打印)
|
|
174
|
-
6. **显式询问确认**:
|
|
175
|
-
> "请问您是否同意上述服务声明并确认接入【{产品名称}】?请回复'同意'或'确认'后,我将继续后续步骤。"
|
|
176
|
-
7. **等待用户回复**:必须收到用户明确同意的回复后,方可准备目标项目并进入步骤2。用户此前只说明了产品或语言但未同意服务声明时,不得视为已经确认。
|
|
192
|
+
runner 失败时不得展示手写确认或进入步骤 3。runner 成功后,其 stdout 是步骤 2 唯一对客消息;Agent 必须把 stdout 原文作为当前回复正文发给用户,不能用命令面板里的 stdout、折叠输出或“已渲染/已展示”说明替代。禁止添加 `<...>` 标签、“已输出完整确认”“完整接入启动确认已渲染”“服务声明已打印”“runner stdout 是本轮唯一对客正文”“收到 1 后进入步骤 3”、重复的项目符号摘要或任何前后缀;发出 stdout 原文后立即停止本轮。必须收到针对当前完整摘要的 `1` 后,方可锁定已准备的目标项目上下文并进入步骤 3。摘要变化后旧回复失效;只有目标项目或服务端语言变化时才返回步骤 1,其他修改重新扫描并渲染步骤 2。用户此前只说明产品、语言或催促继续,不能替代本确认。
|
|
177
193
|
|
|
178
|
-
|
|
194
|
+
- `full_process`:`../normal/full-process-routing.md` 已使用同一个 `integration.start.confirm`,在同一摘要中绑定检查器产生的项目来源、代码状态和其他产品,以及产品、项目路径、语言/框架和服务声明;取得当前 prompt 的 `1` 时直接满足本步骤的启动确认与服务声明确认,禁止再次渲染该消息或要求第二次输入 `1`,直接进入步骤 3。该消息不展示步骤清单,也不缩减执行范围;后续仍必须按当前产品完成本 flow 的全部适用接口、完成条件和 checklist。任一摘要字段变化、确认过期或无法证明回复针对同一摘要时,必须返回完整接入 router 重新扫描并渲染新的单条确认。该确认仍禁止提前展示 MCC、授权范围、产品开通材料或 onboarding 待办。
|
|
179
195
|
|
|
180
|
-
|
|
196
|
+
`integration_only` 有效回复 `1` 进入步骤 3 前,执行 `node ../normal/scripts/telemetry.mjs stage integration.user_confirmed --root-intent integration_only --product-type "$PRODUCT_TYPE"`;`full_process` 已在 `../normal/full-process-routing.md` 上报同名事件,此处不得重复执行。该事件只记录确认发生,不替代完成条件。
|
|
181
197
|
|
|
182
|
-
|
|
198
|
+
**确认后的上下文锁定**:已有项目保持步骤 1 前确认的实际根目录和原有工程结构;新项目必须已经在步骤 1 前按用户确认的方式完成初始化并通过构建标识检查。此处不重复准备、初始化或探测项目。路径内容与步骤 1 成功时不一致则停止并重新确认;只有目标项目或服务端语言变化时返回步骤 1,其他情况直接进入步骤 3。
|
|
199
|
+
|
|
200
|
+
完整接入固定在本流程步骤 3 至步骤 8 完成后再进入 onboarding;onboarding 自身的方案确认和外部写确认不由完整接入启动确认替代。
|
|
183
201
|
|
|
184
202
|
---
|
|
185
203
|
|
|
186
|
-
### 步骤
|
|
204
|
+
### 步骤 3:沙箱配置复核
|
|
187
205
|
|
|
188
|
-
|
|
206
|
+
**任务**:步骤 1 已就绪时复核同一沙箱配置;步骤 1 已待配置时保持该状态并继续代码开发
|
|
189
207
|
|
|
190
|
-
>
|
|
191
|
-
>
|
|
192
|
-
> ⚠️ **必须完整阅读** `modules/sandbox/sandbox-setup-guide.md` 后方可执行本步骤
|
|
208
|
+
> 步骤 1 已完成 CLI、操作系统和首次配置校验。本步骤只复核等待确认期间配置是否仍然安全可用,不重新创建沙箱,也不重新执行环境探测。
|
|
193
209
|
|
|
194
210
|
**完成条件**:
|
|
195
|
-
- [
|
|
196
|
-
- [
|
|
197
|
-
- [M-02] Unix/macOS/Linux:已调用沙箱工具获取候选沙箱 `data`
|
|
198
|
-
- [M-02] Windows:已引导用户自行获取沙箱信息并提供配置
|
|
199
|
-
- [M-02] 已按 `sandbox-setup-guide.md` 完成字段完整性校验和正式落盘;字段无缺失时未输出独立校验结论或字段核对表,只输出一张包含配置文件路径的沙箱环境摘要表及创建后提醒
|
|
211
|
+
- [INT.SANDBOX.UNIX_TERMINAL] Unix/macOS/Linux:`READY` 时已用 `reverify` 复核同一配置;步骤 1 或本步骤得到 `CREATE_PENDING|VERIFY_PENDING` 时,未读取或使用无效配置,已保留待配置状态并继续步骤 4
|
|
212
|
+
- [INT.SANDBOX.WINDOWS_REVERIFIED] Windows:`READY` 时已静默复核步骤 1 通过的项目实际配置、密钥格式和版本控制保护;`VERIFY_PENDING` 时未读取配置或重复展示申领提示,已直接继续代码开发
|
|
200
213
|
|
|
201
|
-
> 沙箱必含字段、落盘格式、路径输出、重复创建红线和失败处理均以 `modules/sandbox/sandbox-setup-guide.md`
|
|
214
|
+
> 沙箱必含字段、落盘格式、路径输出、重复创建红线和失败处理均以 `modules/sandbox/sandbox-setup-guide.md` 为准。`READY` 时实际本机配置路径是后续唯一可信来源;待配置时 `SANDBOX_PENDING_PATH` 只是预期路径,不得作为配置存在或字段有效的证据。禁止从对话或历史代码复制密钥;对客沙箱摘要只能在代码开发完成且配置后置校验通过后展示。
|
|
202
215
|
|
|
203
216
|
**操作流程**:
|
|
204
|
-
1.
|
|
205
|
-
2.
|
|
206
|
-
3.
|
|
207
|
-
4.
|
|
217
|
+
1. 继承步骤 1 的操作系统、规范化项目路径和服务端语言;任一值变化就返回步骤 1,不在本步骤重新探测。
|
|
218
|
+
2. Unix/macOS/Linux 的 `sandboxConfigState=CREATE_PENDING|VERIFY_PENDING` 时不再次调用脚本、不读取配置,直接进入步骤 4;本轮后续保持同一状态,直到用户另行要求重新配置。
|
|
219
|
+
3. Windows 的 `sandboxConfigState=VERIFY_PENDING` 时不读取或探测配置、不渲染 `sandbox.windows.manual_setup`,直接进入步骤 4;`READY` 时才静默复核步骤 1 由 Agent 写入的同一本机敏感配置路径、项目实际读取字段、密钥格式和版本控制保护。路径、字段或保护发生变化时返回步骤 1 的 Windows 分支,只补问实际缺失或错误字段。
|
|
220
|
+
4. Unix/macOS/Linux 仅在 `sandboxConfigState=READY` 时执行以下唯一复核命令,不先检查文件、不读取字段、不运行其他诊断:
|
|
221
|
+
|
|
222
|
+
```bash
|
|
223
|
+
bash modules/scripts/sandbox_config.sh reverify "<规范化项目路径>" "<已确认服务端语言>"
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
5. `reverify` 只接受与步骤 1 相同的三个互斥终态。`READY` 更新 `sandboxConfigState=READY` 并立即进入步骤 4;`VERIFY_PENDING` 已由脚本输出唯一待配置正文,更新状态后立即进入步骤 4。`reverify` 不允许创建分支,若异常出现 `CREATED|CREATE_PENDING` 标记必须按协议失败停止。所有终态之后禁止追加任何 `jq`、`cat`、`grep`、`ls`、`stat` 或临时脚本。
|
|
227
|
+
6. Windows 手工申领分支不伪装成快速沙箱脚本结果,只按本步骤和指南检查目标项目实际使用的本地配置。沙箱就绪时不输出复核进度、沙箱环境摘要、独立校验结果或字段核对表,直接进入步骤 4。
|
|
208
228
|
|
|
209
229
|
---
|
|
210
230
|
|
|
211
|
-
### 步骤
|
|
231
|
+
### 步骤 4:代码开发前置
|
|
232
|
+
|
|
233
|
+
**任务**:阅读 SDK 要点、本地契约和当前语言示例
|
|
212
234
|
|
|
213
|
-
|
|
235
|
+
开始读取本地依据前,先执行 `node ../normal/scripts/telemetry.mjs stage integration.pre_dev_reading.start --root-intent "$ROOT_INTENT" --product-type "$PRODUCT_TYPE"`。
|
|
236
|
+
|
|
237
|
+
本步骤只加载和核对代码开发依据;成功时不发送“文档已读取”“准备完成”等对客进度,直接进入步骤 5。本地依据缺失时输出实际缺口,禁止猜测。在线文档只在 fallback 条件下读取,不作为默认必读材料。
|
|
214
238
|
|
|
215
239
|
**完成条件**:
|
|
216
|
-
- [
|
|
217
|
-
- [
|
|
218
|
-
- [
|
|
219
|
-
- [
|
|
240
|
+
- [INT.PRE.SDK_GUIDE_READ] 已阅读 `modules/alipay-sdk-reminder.md` 完整内容(私钥格式、页面跳转方法、验签排查等)
|
|
241
|
+
- [INT.PRE.SDK_RULES_APPLIED] 已理解 SDK 选择和 SDK 防幻觉强制规则
|
|
242
|
+
- [INT.PRE.LOCAL_CONTRACTS_READ] 已按当前产品读取 `modules/interface-guide.md` 路由的本地接口契约;网站支付和 APP 支付同时读取通用收单与异步通知契约
|
|
243
|
+
- [INT.PRE.OFFICIAL_DOCS_FALLBACK_BOUNDARY] 在线文档仅在本地依据缺失、字段不确定、排查官方错误码、用户明确要求或官方能力变化时读取;未无条件 curl 或递归抓取无关文档
|
|
244
|
+
- [INT.PRE.EXAMPLES_READ] 已阅读产品相关接口代码示例
|
|
220
245
|
|
|
221
|
-
|
|
246
|
+
**官方文档 fallback 访问**:
|
|
222
247
|
|
|
223
|
-
|
|
248
|
+
触发 fallback 时,只读取当前本地契约 `sourceUrl` 中与本产品、本接口直接相关的官方页面:
|
|
224
249
|
```bash
|
|
225
|
-
curl -sL "
|
|
250
|
+
curl -sL "<当前契约 sourceUrl 中的官方页面>"
|
|
226
251
|
```
|
|
227
|
-
|
|
252
|
+
不得为了默认代码开发无条件执行 `curl`,也不得继续递归抓取无关页面。在线文档不可达且本地依据不足时,停止并标记待核验,不得猜测。
|
|
228
253
|
|
|
229
254
|
**必须阅读的文件**:
|
|
230
255
|
- `modules/alipay-sdk-reminder.md` - SDK防坑指南(含私钥格式、页面跳转方法、验签排查等)
|
|
231
|
-
- `modules/
|
|
232
|
-
- `
|
|
256
|
+
- `modules/interface-guide.md` - 本地契约与示例索引
|
|
257
|
+
- 当前产品契约和当前语言示例 - 按 `interface-guide.md` 的默认读取路由加载
|
|
233
258
|
|
|
234
259
|
**🚫 SDK 防幻觉强制规则**:
|
|
235
260
|
|
|
@@ -243,51 +268,77 @@ curl -sL "https://ideservice.alipay.com/cms/site/{文档ID}"
|
|
|
243
268
|
| 4 | 时间戳格式 | 必须使用 `yyyy-MM-dd HH:mm:ss`,禁止使用 ISO 格式 |
|
|
244
269
|
| 5 | SDK 引入方式 | 必须通过查阅 SDK 文档或类型定义确定正确的引入方式,禁止凭猜测选择 |
|
|
245
270
|
| 6 | 遇到 `invalid-signature` 报错 | 严禁凭猜测归因到私钥格式;先核对实际发送、参与签名和服务端验签的参数是否完全一致 |
|
|
246
|
-
| 7 |
|
|
271
|
+
| 7 | 配置接入后必须后置校验 | Unix/macOS/Linux 必须确认服务端加载器直接读取已验证文件、字段映射正确且 SDK 配置匹配;Windows 必须确认项目读取同一套本机沙箱应用配置;失败时禁止继续联调 |
|
|
247
272
|
|
|
248
273
|
---
|
|
249
274
|
|
|
250
|
-
### 步骤
|
|
275
|
+
### 步骤 5:代码生成
|
|
251
276
|
|
|
252
277
|
**任务**:根据用户选择的开发语言和产品,在已确认的目标项目根目录中生成集成代码
|
|
253
278
|
|
|
279
|
+
开始修改或生成用户项目代码前,先执行 `node ../normal/scripts/telemetry.mjs stage integration.code_dev.start --root-intent "$ROOT_INTENT" --product-type "$PRODUCT_TYPE"`。
|
|
280
|
+
|
|
254
281
|
**完成条件**:
|
|
255
|
-
- [
|
|
256
|
-
- [
|
|
257
|
-
- [
|
|
258
|
-
- [
|
|
259
|
-
- [
|
|
260
|
-
- [
|
|
261
|
-
- [
|
|
282
|
+
- [INT.CODE.BASE_IMPLEMENTED] 已完成支付宝支付产品集成代码实现
|
|
283
|
+
- [INT.CODE.INTERFACES_COMPLETE] 已按目标产品文档完成全部适用接口;网站支付/APP 支付覆盖下单、交易查询、退款、退款查询、关闭交易和异步通知处理代码,按量付费覆盖 402、`payment.verify` 和 `fulfillment.confirm`
|
|
284
|
+
- [INT.CODE.SELF_CHECKED] 已完成代码自检并确认无误
|
|
285
|
+
- [INT.CODE.CONFIG_VERIFIED] 已完成支付配置准确性后置校验:Unix/macOS/Linux 服务端加载器直接读取已验证文件且字段映射、SDK 配置匹配;Windows 项目读取同一套本机沙箱应用配置
|
|
286
|
+
- [INT.WEBPAY.RETURN_IMPLEMENTED] 网站支付在用户未明确要求不使用同步回跳时,已配置与当前项目一致的 `return_url`,并实现可通过 GET 访问的回跳路由和结果页;页面不直接信任同步回跳参数判定支付成功
|
|
287
|
+
- [INT.LOCAL_ACCEPTANCE.NOTIFY_DEFERRED] 用户处于“本地生产参数验收模式”时,已明确记录当前暂不联调公网 `notify_url`,支付结果确认依赖异步通知处理代码加主动查询兜底;未把同步回跳参数当作支付成功依据
|
|
288
|
+
- [INT.A2M.PRODUCTION_CONTROLS] 按量付费生产接入中已补齐订单持久化、本地订单匹配、金额一致性、资源防串、幂等履约和履约确认失败可重试逻辑,不存在未实现的关键 TODO
|
|
289
|
+
|
|
290
|
+
**实现与自检入口**:按当前语言和产品读取 `modules/interface-guide.md` 路由的本地接口契约和专用/通用接口示例,并完整应用 `modules/alipay-sdk-reminder.md` 的生成前自检与配置后置校验。`interface-guide.md` 中的 `./code-examples/...` 链接相对 `modules/interface-guide.md` 所在目录解析;从本 flow 所在目录读取实际示例时必须使用 `modules/code-examples/...`,例如 Node.js 按量付费示例为 `modules/code-examples/nodejs/4-按量付费/A2MPaymentDemo.js`,不得查找 `code-examples/...` 或 `references/integration/code-examples/...`。本地缺少示例不等于接口不适用;用户限定本轮范围时,未实现的适用接口必须列为待办,不得宣称完整集成。
|
|
262
291
|
|
|
263
|
-
|
|
292
|
+
**Node.js 项目前置核对**:目标语言为 Node.js 时,生成或修改代码前必须先读取目标项目 `package.json`,确认 `type`、启动脚本、已安装依赖和框架版本;安装或发现 `alipay-sdk` 后,必须按 `modules/alipay-sdk-reminder.md` 读取实际 `node_modules/alipay-sdk/package.json` 与类型定义来确定导入方式、`pageExec`/`sdkExecute`/`checkNotifySign` 等方法名。不得凭本地示例中的 `require`/`import` 行、历史记忆或其他项目版本推断当前项目写法。
|
|
264
293
|
|
|
265
|
-
|
|
294
|
+
开始执行代码自检、语法/静态检查或支付配置后置校验前,先执行 `node ../normal/scripts/telemetry.mjs stage integration.local_verify.start --root-intent "$ROOT_INTENT" --product-type "$PRODUCT_TYPE"`。
|
|
266
295
|
|
|
267
|
-
|
|
296
|
+
**支付配置接入与后置校验**:`sandboxConfigState=READY` 时,Unix/macOS/Linux 快速沙箱由商家服务端代码使用当前语言的标准 JSON 解析器,在运行时读取步骤 1/3 已验证的 `.alipay-sandbox.json`,并从 `appIds[0]` 映射 `appId`、`alipayPublicKey` 和当前语言私钥字段;不得先用 `jq`、`cat` 或临时脚本把字段原文打印到工具输出、复制到源码或重复写入 `.env`。项目已有配置抽象时在其服务端加载边界接入该 JSON,不改变字段原值。Windows 从步骤 1 由 Agent 写入并校验的本机敏感配置读取。后置校验按 `modules/sandbox/sandbox-setup-guide.md` 第 7 节检查实际加载路径、字段选择、SDK 初始化和版本控制保护;Java 使用 `appPrivateKey`,其他四种语言使用 `appPrivatePkcsKey`。A2M 的 `seller_signature` 使用原生密码库时,只在调用边界按库要求解析密钥。失败时修正加载器或 SDK 配置,禁止猜测、转换格式或改写原始值。
|
|
268
297
|
|
|
269
|
-
|
|
298
|
+
`sandboxConfigState=CREATE_PENDING|VERIFY_PENDING` 时仍完整实现当前产品全部适用接口、安全校验和配置加载边界,但不得读取当前无效配置、写入占位 appId/密钥、把示例值当作运行配置或声称 `INT.CODE.CONFIG_VERIFIED` 通过。加载器在配置缺失或无效时必须明确失败并阻止真实 SDK 调用;本轮所有依赖沙箱值的运行验证保持未完成。
|
|
299
|
+
|
|
300
|
+
**沙箱摘要展示入口**:只有 `sandboxConfigState=READY`、本步骤的代码实现和支付配置后置校验都已完成,才允许对客展示沙箱环境配置。待配置状态跳过本入口,不另写摘要或失败话术。Unix/macOS/Linux 从本 flow 所在目录执行:
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
bash modules/scripts/sandbox_config.sh summary "<productType>" "<规范化项目路径>" "<已确认服务端语言>"
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
该命令 stdout 只渲染 `sandbox.environment.summary` 与 `sandbox.environment.reminder`;带 `ALIPAY_AIPAY_INTERNAL:` 前缀的配置路径和 `FLOW:SANDBOX_CONFIGURED` 只用于流程转移,严禁对客。命令不重新创建沙箱,不调用 `createAnonymousSandbox`。`productType` 只能来自步骤 2 已确认的 `aipay|webpay|apppay`;配置路径和语言必须与步骤 1/3 一致。摘要展示失败时不得进入沙箱测试或付款体验,也不得改用 Agent 自写表格。
|
|
307
|
+
|
|
308
|
+
Windows 从项目实际读取的同一本机配置构造不含密码和密钥原文的 `ENVIRONMENT_ROWS`,再从本 flow 所在目录执行以下固定命令;不得重新索取或复述步骤 1 已提供的敏感值,也不得改用 Unix 快速沙箱脚本:
|
|
309
|
+
|
|
310
|
+
```powershell
|
|
311
|
+
node ../normal/scripts/integration_message_runner.mjs windows-sandbox-summary --product-name "$PRODUCT_NAME" --config-path "$CONFIG_PATH" --environment-rows "$ENVIRONMENT_ROWS"
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
Windows 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实际本机配置绝对路径;`ENVIRONMENT_ROWS` 只包含实际取得的非敏感应用、商家、买家和沙箱标识,缺失可选项直接省略。两个 renderer 任一失败都按摘要展示失败处理,禁止手写补齐。
|
|
315
|
+
|
|
316
|
+
**网站支付回跳默认规则**:用户未特别说明时,默认实现支付后同步回跳。`return_url` 必须来自已确认目标项目的实际协议、主机、端口和路由,禁止保留 `your-domain.com`、示例端口或猜测路径。项目没有结果页时,在当前技术栈内新增与既有 UI 一致的 GET 回跳路由和页面。用户已明确不需要同步回跳时,直接按关闭分支验收,不增加第二次确认;仍必须保留异步通知、交易查询和商户订单查询页。用户未明确关闭但代码缺少 `return_url` 时,必须修复为默认同步回跳分支,不得要求用户接受遗漏。验收结论必须从实际代码重新检查,不接受调用方自报 `returnMode`。
|
|
317
|
+
|
|
318
|
+
**本地生产参数验收模式**:用户项目尚未上线、无法提供真实公网地址,或当前自定义域名/TLS 检查失败时,网站支付/APP 支付可以进入本模式。要求如下:
|
|
270
319
|
|
|
271
320
|
1. 代码层必须已经实现异步通知处理入口、验签、关键字段校验、幂等和成功响应 `success`,只是当前环境不对外联调。
|
|
272
|
-
2. 运行层可以临时关闭异步通知发起配置或不传 `notify_url`;如项目已有显式开关,也可使用项目内已有的 `notify_enabled=false`
|
|
273
|
-
3. 本地模式下,网站支付保留 `localhost` 或当前可访问开发地址的 `return_url`/结果页,APP支付保留本地订单查询链路,并统一提供服务端交易查询或订单查询页作为结果确认兜底。
|
|
321
|
+
2. 运行层可以临时关闭异步通知发起配置或不传 `notify_url`;如项目已有显式开关,也可使用项目内已有的 `notify_enabled=false` 等等价配置,并执行 `node ../normal/scripts/integration_message_runner.mjs local-acceptance-notice`,不得另写近似话术。
|
|
322
|
+
3. 本地模式下,网站支付保留 `localhost` 或当前可访问开发地址的 `return_url`/结果页,APP 支付保留本地订单查询链路,并统一提供服务端交易查询或订单查询页作为结果确认兜底。
|
|
274
323
|
4. 任何本地模式结果都只能表述为“本地正式验收完成”或“本地生产参数验收完成,公网异步通知待补齐”,不得表述为“生产就绪”。
|
|
275
324
|
|
|
276
325
|
**按量付费沙箱 serviceId**:生成或写入按量付费沙箱运行配置时,`serviceId` 固定使用 `api_mock_service_id`,禁止向用户索要正式 `serviceId` 才继续沙箱联调。该值必须与正式环境配置隔离;正式上线前替换为服务市场注册或复用结果中的真实 `serviceId`。
|
|
277
326
|
|
|
278
|
-
**按量付费生产边界**:五语言 A2M 文件只是核心协议与 SDK 调用示例。生产实现必须通过 `modules/checklist.md` 的全部按量付费专项校验;任一关键控制仍为 TODO、注释、内存演示或伪代码时,不得满足
|
|
327
|
+
**按量付费生产边界**:五语言 A2M 文件只是核心协议与 SDK 调用示例。生产实现必须通过 `modules/checklist.md` 的全部按量付费专项校验;任一关键控制仍为 TODO、注释、内存演示或伪代码时,不得满足 `INT.CODE.*` / `INT.A2M.PRODUCTION_CONTROLS` 或标记生产就绪。
|
|
279
328
|
|
|
280
|
-
> ⚠️ **按量付费**:代码生成后启动本地服务,后续步骤
|
|
329
|
+
> ⚠️ **按量付费**:代码生成后启动本地服务,后续步骤 6 将默认进行端到端沙箱服务端联调。服务需实现 402 协议(无 `Payment-Proof` 时返回 HTTP 402 + `Payment-Needed` 头)。
|
|
281
330
|
|
|
282
331
|
---
|
|
283
332
|
|
|
284
|
-
### 步骤
|
|
333
|
+
### 步骤 6:沙箱测试与体验(按量付费、网站支付)
|
|
334
|
+
|
|
335
|
+
> APP 支付跳过本步骤,直接进入步骤 7。按量付费和网站支付只有在 `sandboxConfigState=READY` 且配置后置校验通过时才执行本步骤;`CREATE_PENDING|VERIFY_PENDING` 时跳过全部沙箱依赖动作并进入步骤 7,不渲染 `a2m.test.*`、`a2m.payment.experience`、`webpay.sandbox.experience*` 或 `sandbox.android.client`。只有按量付费满足本步骤全部端到端完成条件时,才能对客输出“沙箱测试通过”或等价结论;网站支付和 APP 支付不得输出该结论。
|
|
285
336
|
|
|
286
|
-
|
|
337
|
+
实际进入本步骤的沙箱联调或付款体验前,先执行 `node ../normal/scripts/telemetry.mjs stage integration.sandbox_acceptance.start --root-intent "$ROOT_INTENT" --product-type "$PRODUCT_TYPE"`。APP 支付跳过本步骤时不输出该事件。
|
|
287
338
|
|
|
288
339
|
#### 网站支付:提供人工沙箱付款指引
|
|
289
340
|
|
|
290
|
-
网站支付步骤
|
|
341
|
+
网站支付步骤 6 是用户可操作的付款体验交付,不是支付接口冒烟测试。启动服务、访问首页、用 `curl` 调用下单接口或取得 HTML 支付表单,只能证明对应本地接口有响应;没有向用户提供可在浏览器打开的真实支付页面和以下两种付款方式时,禁止标记步骤 6 完成:
|
|
291
342
|
|
|
292
343
|
- 方式一:在沙箱收银台输入沙箱买家账号和登录密码,再输入支付密码付款。
|
|
293
344
|
- 方式二:仅限 Android,安装沙箱支付宝并登录沙箱买家账号,在沙箱收银台使用客户端扫码,再输入支付密码付款。
|
|
@@ -299,21 +350,22 @@ curl -sL "https://ideservice.alipay.com/cms/site/{文档ID}"
|
|
|
299
350
|
1. 从已确认的目标项目确定真实的服务启动命令和支付页面访问地址,禁止使用占位符、示例端口或猜测地址。
|
|
300
351
|
2. 用户未明确关闭同步回跳时,确认 SDK 实际传入的 `return_url`,且其与项目实现的 GET 回跳路由完全一致。
|
|
301
352
|
3. 默认分支继续启动服务,并对不带支付结果参数的 `return_url` 发起 GET 访问。这一步只验证路由和页面壳:无订单上下文时应展示安全的中性状态,不得因没有签名参数而绕过真实回跳请求的验签和订单归属校验。确认响应成功、无认证或重定向循环;单页应用直接刷新不得返回 404。
|
|
302
|
-
4. 默认分支中,Agent 具备浏览器/UI
|
|
353
|
+
4. 默认分支中,Agent 具备浏览器/UI 验证能力时,实际打开回跳页,确认页面非空白、无可见报错且关键状态内容正常渲染。不具备时,不向用户追加人工确认;将“回跳页 UI 人工待验证”记录到最终 checklist 的 `manualItems`,并继续提供沙箱付款入口。
|
|
354
|
+
|
|
303
355
|
5. 用户已明确关闭同步回跳时,不要求或猜测 `return_url`;确认 SDK 请求未传该字段,并改为验证异步通知处理代码、交易查询和商户订单查询页。本地生产参数验收模式下,如暂无公网 HTTPS `notify_url`,将公网异步通知联调标记为人工待验证,不以此阻塞本地正式验收。
|
|
304
|
-
6. 按 `modules/sandbox/sandbox-setup-guide.md` 第 5.
|
|
356
|
+
6. 按 `modules/sandbox/sandbox-setup-guide.md` 第 5.5 节输出沙箱付款说明。操作顺序为:启动服务 → 用浏览器访问支付页面 → 发起支付 → 唤起沙箱收银台 → 用户从“收银台账号登录”与“安卓沙箱支付宝扫码”中二选一完成付款 → 返回商户结果页并查询展示订单状态。
|
|
305
357
|
|
|
306
|
-
|
|
358
|
+
回跳地址无法确定、访问失败或页面出现确定错误时,必须先修正;本轮无法继续修正时进入最终 checklist 的未完成项,不得宣称网站支付代码开发完成。仅缺少浏览器/UI 证据时记录“回跳页 UI 人工待验证”,不得宣称回跳页已验证,但不阻塞沙箱付款入口交付。该体验不新增业务写操作确认点,用户暂未付款不阻止后续代码校验。
|
|
307
359
|
|
|
308
360
|
网站支付本步骤的完成语义是“沙箱付款入口与操作说明已提供,并已按实际证据验证回跳页面或关闭回跳分支”,不是“沙箱支付测试通过”。即使用户随后反馈已完成付款,也只记录“用户已完成一笔沙箱付款”以及能够实际核验的订单、回跳或查询结果,不输出笼统的“沙箱环境测试通过”。
|
|
309
361
|
|
|
310
362
|
**完成条件(网站支付)**:
|
|
311
|
-
- [
|
|
363
|
+
- [INT.WEBPAY.EXPERIENCE_DELIVERED] 已向用户明确提供真实服务启动命令、浏览器支付页面访问地址、完整沙箱付款顺序、“沙箱买家账号登录”与“安卓沙箱支付宝扫码”两种二选一体验方式,以及结果判断提醒;未用 `curl` 返回的 HTML 表单替代浏览器付款入口
|
|
312
364
|
|
|
313
365
|
以下两项按实际分支二选一,不得同时要求:
|
|
314
366
|
|
|
315
|
-
- [
|
|
316
|
-
- [
|
|
367
|
+
- [INT.WEBPAY.RETURN_VERIFIED] 默认分支已确认实际 `return_url` 与项目路由一致,启动服务后 GET 访问通过,且已通过 Agent 浏览器/UI 验证取得页面正常渲染的证据;当前环境无法取得 UI 证据时只能记为人工待验证,不能满足本完成条件
|
|
368
|
+
- [INT.WEBPAY.NO_RETURN_VERIFIED] 关闭分支已记录用户先前明确提出的不使用同步回跳,确认 SDK 请求未传 `return_url`,并完成异步通知处理代码、交易查询和商户订单查询页校验;缺少公网 HTTPS `notify_url` 时,已明确标记公网通知联调为人工待验证
|
|
317
369
|
|
|
318
370
|
#### 按量付费:自动沙箱联调
|
|
319
371
|
|
|
@@ -324,182 +376,159 @@ curl -sL "https://ideservice.alipay.com/cms/site/{文档ID}"
|
|
|
324
376
|
> 沙箱联调经验集中维护在 `modules/sandbox/a2m-sandbox-test.md`。遇到收银接口临时失败、`ORDER_NOT_FOUND`、资源防串失败或履约确认失败时,先按该文档排查,不要反复请求用户服务生成新订单。
|
|
325
377
|
|
|
326
378
|
**完成条件**:
|
|
327
|
-
- [
|
|
328
|
-
- [
|
|
329
|
-
- [
|
|
330
|
-
- [
|
|
331
|
-
- [
|
|
379
|
+
- [INT.A2M.SERVICE_READY] 已确认用户本地按量付费服务已启动可访问
|
|
380
|
+
- [INT.A2M.PRECHECK_PASSED] 已执行 Payment-Needed 预检,确认 HTTP 402 和关键字段存在
|
|
381
|
+
- [INT.A2M.AUTO_COMPLETE_RUN] 已执行沙箱支付测试脚本 `run --auto-complete --require-payment-validation`,成功获取 Payment-Needed、生成付款链接并连续执行服务端联调
|
|
382
|
+
- [INT.A2M.DELIVERY_EVIDENCE] 已携带 `Payment-Proof` 重试原服务,并取得 HTTP 200、非空可归属资源、无明确业务失败和有效 `Payment-Validation` 的组合成功证据
|
|
383
|
+
- [INT.A2M.TEST_PASSED] 已确认 402 沙箱服务端联调流程通过
|
|
332
384
|
|
|
333
|
-
**测试前预检**:执行沙箱测试脚本前,先按 `modules/sandbox/a2m-sandbox-test.md` 的“测试前预检”确认服务返回 HTTP 402
|
|
385
|
+
**测试前预检**:执行沙箱测试脚本前,先按 `modules/sandbox/a2m-sandbox-test.md` 的“测试前预检”确认服务返回 HTTP 402,`Payment-Needed` 包含 `seller_signature` 等关键字段,且 `method.service_id` 等于 `api_mock_service_id`。
|
|
334
386
|
|
|
335
387
|
**沙箱支付宝体验提醒**:服务端联调结论输出后,按 `modules/sandbox/a2m-sandbox-test.md` 向用户提供付款链接、沙箱买家账号和安卓客户端下载说明作为可选付款体验;该体验不新增阻塞确认点。
|
|
336
388
|
|
|
337
389
|
**默认执行规则**:
|
|
338
|
-
1. 从已确认的目标项目和步骤
|
|
390
|
+
1. 从已确认的目标项目和步骤 3 已校验的沙箱配置中确定服务请求地址、HTTP 方法和沙箱买家 `userId`;仅缺少无法从当前上下文取得的真实参数时才询问对应信息,禁止编造或猜测。
|
|
339
391
|
2. 确认本地服务可访问;项目已有明确启动方式且当前环境可执行时直接启动,否则只要求用户完成必要的服务启动。服务恢复可访问后自动继续,不询问是否执行沙箱测试。
|
|
340
|
-
3.
|
|
341
|
-
4. 立即执行测试前预检和 `run --auto-complete`,连续输出服务端联调结果,中途不新增确认点。
|
|
392
|
+
3. 从本 flow 所在目录执行下列固定 runner 命令,输出固定联调说明后立即继续,不等待用户确认;禁止另写开始话术。服务地址和 HTTP 方法只用于后续实际命令,不在本消息中展示:
|
|
342
393
|
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
394
|
+
```bash
|
|
395
|
+
node ../normal/scripts/integration_message_runner.mjs a2m-test-start
|
|
396
|
+
```
|
|
346
397
|
|
|
347
|
-
|
|
398
|
+
4. Unix/macOS/Linux 按实际 HTTP 方法从本 flow 所在目录继续执行且只执行以下既有命令。POST body 必须来自已确认目标项目中的实际文件,不把动态 JSON 拼进命令文本:
|
|
348
399
|
|
|
349
|
-
|
|
400
|
+
```bash
|
|
401
|
+
# GET
|
|
402
|
+
python3 modules/scripts/local_402_sandbox_pay.py run \
|
|
403
|
+
--url "$SERVICE_URL" \
|
|
404
|
+
--method GET \
|
|
405
|
+
--buyer-id "$BUYER_2088" \
|
|
406
|
+
--auto-complete \
|
|
407
|
+
--require-payment-validation
|
|
408
|
+
|
|
409
|
+
# POST
|
|
410
|
+
python3 modules/scripts/local_402_sandbox_pay.py run \
|
|
411
|
+
--url "$SERVICE_URL" \
|
|
412
|
+
--method POST \
|
|
413
|
+
--body "@$POST_BODY_FILE" \
|
|
414
|
+
--buyer-id "$BUYER_2088" \
|
|
415
|
+
--auto-complete \
|
|
416
|
+
--require-payment-validation
|
|
417
|
+
```
|
|
350
418
|
|
|
351
|
-
|
|
352
|
-
- [M-06] 已向用户明文打印安全红线
|
|
353
|
-
- [M-06] 已向用户输出完整的后续指引
|
|
419
|
+
Windows 使用 Node 启动器选择 `py -3|python|python3`,不依赖 Bash 命令解析。先按实际 HTTP 方法执行只读预检的对应单行命令:
|
|
354
420
|
|
|
355
|
-
|
|
421
|
+
```powershell
|
|
422
|
+
# GET
|
|
423
|
+
node ../normal/scripts/python_script_runner.mjs modules/scripts/local_402_sandbox_pay.py precheck --url "$SERVICE_URL" --method GET
|
|
356
424
|
|
|
357
|
-
|
|
425
|
+
# POST
|
|
426
|
+
node ../normal/scripts/python_script_runner.mjs modules/scripts/local_402_sandbox_pay.py precheck --url "$SERVICE_URL" --method POST --body "@$POST_BODY_FILE"
|
|
427
|
+
```
|
|
358
428
|
|
|
359
|
-
|
|
360
|
-
- 私钥禁止记日志:私钥不得出现在任何日志中
|
|
361
|
-
- 私钥禁止传公共仓库:私钥不得上传到 GitHub、GitLab 等公共代码仓库
|
|
362
|
-
- 前台支付结果不可信:前台同步跳转结果不可信,必须以支付宝异步通知或调用交易查询接口获取结果为准(⚠️ 不适用于按量付费,按量付费依赖 `alipay.aipay.agent.payment.verify` 接口验证支付凭证)
|
|
363
|
-
- 未确认不重付:在未确认支付结果前,不得要求用户再次付款
|
|
364
|
-
- 异步通知必须先验签:收到异步通知后必须先验签,确保通知来自支付宝(⚠️ 不适用于按量付费,按量付费不使用异步通知)
|
|
365
|
-
- 🤖 Payment-Proof 必须验证:收到 Payment-Proof 头后必须调用 `alipay.aipay.agent.payment.verify` 验证凭证有效性
|
|
366
|
-
- 🤖 履约必须确认:服务交付后必须调用 `alipay.aipay.agent.fulfillment.confirm` 发送履约确认
|
|
367
|
-
- 🤖 凭证不过期复用:验证 `active` 字段,已过期的支付凭证拒绝服务
|
|
429
|
+
预检通过后再执行对应联调单行命令:
|
|
368
430
|
|
|
369
|
-
|
|
370
|
-
|
|
431
|
+
```powershell
|
|
432
|
+
# GET
|
|
433
|
+
node ../normal/scripts/python_script_runner.mjs modules/scripts/local_402_sandbox_pay.py run --url "$SERVICE_URL" --method GET --buyer-id "$BUYER_2088" --auto-complete --require-payment-validation
|
|
371
434
|
|
|
372
|
-
|
|
435
|
+
# POST
|
|
436
|
+
node ../normal/scripts/python_script_runner.mjs modules/scripts/local_402_sandbox_pay.py run --url "$SERVICE_URL" --method POST --body "@$POST_BODY_FILE" --buyer-id "$BUYER_2088" --auto-complete --require-payment-validation
|
|
437
|
+
```
|
|
373
438
|
|
|
374
|
-
|
|
375
|
-
- `appId`、应用公钥、应用私钥必须来自同一套生产应用密钥;不要混用沙箱应用、其他生产应用或重新生成的另一套密钥。
|
|
376
|
-
- 根据项目编程语言确认应用私钥格式:Java 使用 PKCS#8,非 Java(Node.js、Python、PHP、.NET 等)使用 PKCS#1。
|
|
377
|
-
- 如果生产应用私钥格式与当前语言 SDK 要求不一致,请使用支付宝开放平台密钥工具进行私钥格式转换后再写入配置。
|
|
378
|
-
- 写入配置时仍使用不带 PEM 头尾、包装行或说明文字的原始私钥字符串。
|
|
439
|
+
只传已确认的本机服务 URL、GET/POST、实际沙箱买家 userId 和项目内 POST body 文件;禁止传入自定义收银端点、`Payment-Proof` 或 attestation。只有同一次命令退出码为 0,且输出包含实际资源交付校验通过和敏感产物已清理,才能记录联调通过;204、空响应、空资源、明确验付/履约失败或异常 `Payment-Validation` 均不得通过。失败后清理本轮敏感产物并重新执行完整联调。
|
|
379
440
|
|
|
380
|
-
|
|
381
|
-
- 如果当前意图是 `integration_only`:提醒用户正式上线前还需要完成对应产品的商家签约/入驻。
|
|
382
|
-
- 如果当前意图是 `full_process`:本步骤只说明仍需完成步骤 7 集成校验,不展示签约待办、MCC、授权范围或材料。只有全部适用集成步骤和校验通过后,才按 `../../SKILL.md` 的“完整接入编排”进入 onboarding。
|
|
441
|
+
服务未就绪时固定使用 `integration.service.not_ready` 输出实际缺口和恢复动作;必须执行下列命令。不得运行测试、登记 `INT.A2M.SERVICE_READY=PASS` 或临场改写近似话术。
|
|
383
442
|
|
|
384
|
-
|
|
443
|
+
```bash
|
|
444
|
+
node ../normal/scripts/integration_message_runner.mjs service-not-ready --recovery-action "$RECOVERY_ACTION"
|
|
445
|
+
```
|
|
385
446
|
|
|
386
|
-
|
|
447
|
+
> 详细测试流程见 `modules/sandbox/a2m-sandbox-test.md`
|
|
387
448
|
|
|
388
|
-
|
|
389
|
-
- [M-07] 已按照集成校验清单逐项校验并保留判断依据;已按摘要规则输出结论、问题和人工待验证项
|
|
449
|
+
---
|
|
390
450
|
|
|
391
|
-
|
|
451
|
+
### 步骤 7:集成后说明
|
|
392
452
|
|
|
393
|
-
|
|
453
|
+
**任务**:在最终校验前一次输出安全红线和上线指引,不得提前宣称集成已经完成
|
|
394
454
|
|
|
395
|
-
|
|
396
|
-
-
|
|
397
|
-
- 异步通知
|
|
398
|
-
- 异常处理
|
|
455
|
+
**完成条件**:
|
|
456
|
+
- [INT.CLOSEOUT.SAFETY_AND_NEXT_STEPS_PRINTED] 已向用户明文输出安全红线和完整上线指引
|
|
399
457
|
|
|
400
|
-
|
|
458
|
+
**安全与上线提醒(必须明文打印给用户)**:使用 `../normal/json/customer-messages.json` 的 `integration.safety.closeout`,按已确认 `PRODUCT_TYPE` 固定映射 `PRODUCT_VARIANT`:`aipay=AIPAY`、`webpay=WEBPAY`、`apppay=APPPAY`,并传入实际验收口径。模板一次覆盖服务端私钥、日志/公共仓库、支付结果依据、重复付款、异步通知或 `Payment-Proof`/履约确认、沙箱到生产配置替换、同套生产密钥、按量付费真实 `serviceId` 和语言私钥格式;不得临场删减、拆成第二条消息或维护近似话术。必须执行:
|
|
401
459
|
|
|
402
|
-
|
|
460
|
+
```bash
|
|
461
|
+
node ../normal/scripts/integration_message_runner.mjs safety-closeout --variant "$PRODUCT_VARIANT" --acceptance-summary "$ACCEPTANCE_SUMMARY"
|
|
462
|
+
```
|
|
403
463
|
|
|
404
|
-
|
|
464
|
+
生产密钥的一致性、语言格式、官方工具转换、沙箱/生产配置替换、`notify_url` 公网联调边界、按量付费 `api_mock_service_id` 替换和生产就绪表述限制均由上述一条标准消息统一输出。实际写入配置时仍使用不带 PEM 头尾、包装行或说明文字的原始私钥字符串;该执行细节不得省略或改写密钥内容。
|
|
405
465
|
|
|
406
|
-
|
|
466
|
+
**签约衔接提醒(必须输出)**:
|
|
467
|
+
- 如果当前意图是 `integration_only`:提醒用户正式上线前还需要完成对应支付产品的产品开通。
|
|
468
|
+
- 如果当前意图是 `full_process`:本步骤只说明仍需完成步骤 8 集成校验;此时不展示签约待办、MCC、授权范围或材料。全部适用步骤通过时进入 onboarding;只有沙箱待配置且其余检查通过,或沙箱 `READY` 且仅剩非阻塞人工待验证项时,也以“部分通过”继续 onboarding;其他阻塞缺口仍停在代码开发。
|
|
407
469
|
|
|
408
470
|
---
|
|
409
471
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
**触发条件**:用户在集成支付宝支付产品过程中遇到报错或其他问题。触发关键词:"报错"、"错误码"、"问题"、"排查"、"调试"、"异常"等。
|
|
413
|
-
|
|
414
|
-
执行下述问题排查步骤之前,**必须明确用户当前集成的支付产品**(按量付费/网站支付/APP支付),否则暂停输出并要求用户澄清。
|
|
415
|
-
|
|
416
|
-
### 问题识别与分流
|
|
417
|
-
|
|
418
|
-
根据用户输入判断问题类型,分流到对应排查路径:
|
|
472
|
+
### 步骤 8:代码开发校验
|
|
419
473
|
|
|
420
|
-
|
|
421
|
-
用户问题
|
|
422
|
-
|
|
|
423
|
-
+-- 验签失败(invalid-signature / 验签出错) ← 优先匹配
|
|
424
|
-
| |
|
|
425
|
-
| └───> 常见问题排查(验签失败专项)
|
|
426
|
-
|
|
|
427
|
-
+-- 有明确错误码(如 "ACQ.TRADE_HAS_SUCCESS"、"INVALID_PARAMETER")
|
|
428
|
-
| |
|
|
429
|
-
| └───> 错误码排查
|
|
430
|
-
|
|
|
431
|
-
+-- 无明确错误码(如流程疑问、功能异常等)
|
|
432
|
-
|
|
|
433
|
-
└───> 常见问题排查
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
### 错误码排查
|
|
437
|
-
|
|
438
|
-
**适用**:用户提供了明确的错误码。
|
|
474
|
+
**完成条件**:已执行 `modules/checklist.md` 的全部适用检查,并保留每项实际命令、文件检查或人工待验证依据;不得使用 Agent 自拟 attestation、空哈希或口头结论代替。
|
|
439
475
|
|
|
440
|
-
|
|
476
|
+
**自动执行规则**:步骤 7 完成后先执行 `node ../normal/scripts/telemetry.mjs stage integration.checklist.start --root-intent "$ROOT_INTENT" --product-type "$PRODUCT_TYPE"`,再直接读取 `modules/checklist.md`,默认只执行代码阅读、配置后置校验、语法/静态检查,以及无需安装依赖、联网或监听端口的已有定向测试,并复用步骤 5、步骤 6 已取得的校验证据,不增加“是否需要校验”的用户确认。
|
|
441
477
|
|
|
442
|
-
|
|
478
|
+
**执行边界**:默认禁止安装依赖或浏览器、切换运行时版本、启动长期服务、申请网络/端口权限、执行截图或 UI 自动化,也不得重复步骤 6 已完成的端到端测试。遇到 `EPERM`、网络受限、缺少浏览器等环境限制时,将对应项标记为“人工待验证”并停止扩展排查;不得据此推断代码或运行时兼容问题。只有用户明确要求继续扩展验证时,才展示拟执行动作并按原确认规则处理。
|
|
443
479
|
|
|
444
|
-
|
|
480
|
+
步骤 3 至步骤 7 的必要依据、配置摘要、代码修复、网站回跳或按量付费联调在本轮无法继续时,跳过所有依赖该失败事实的后续动作,但仍进入本步骤:把未满足条件和被跳过动作按实际证据标记为失败或人工待验证,并使用同一 `integration.checklist.result` 收口。不得为了生成结果重新执行已阻断的外部动作。`full_process` 中,只有沙箱为 `CREATE_PENDING|VERIFY_PENDING` 且代码实现与不依赖沙箱的安全检查均通过、或沙箱为 `READY` 且仅剩非阻塞人工待验证项时,才在输出标准“部分通过”结果后继续 onboarding;存在其他代码、安全或必要依据失败时仍停在代码开发。
|
|
445
481
|
|
|
446
|
-
|
|
482
|
+
校验项包括:
|
|
483
|
+
- 签名验签
|
|
484
|
+
- 异步通知
|
|
485
|
+
- 异常处理
|
|
447
486
|
|
|
448
|
-
|
|
487
|
+
> 详细校验清单见 `modules/checklist.md`
|
|
449
488
|
|
|
450
|
-
|
|
489
|
+
**校验完整性要求**:内部必须覆盖 `modules/checklist.md` 的密钥与安全、异步通知、适用接口覆盖、支付结果处理、按量付费专项、退款和上线前七类校验,不得只检查上方三个摘要项。通过时默认对客只输出通过结论和下一步;部分通过或未通过时只输出实际未完成项、人工待验证项和下一步。步骤 5/6 已展示的沙箱配置、联调或付款体验结论不在 checklist 结果中重复。通过项与不适用项无需逐行展开,用户要求明细时再输出完整逐项结果。精简输出不得导致任何适用校验被跳过。
|
|
451
490
|
|
|
452
|
-
|
|
491
|
+
先在内部汇总 checklist 证据。发现本轮范围内可直接修复的代码或配置缺口时,先修复并重新执行受影响检查;在仍可继续自动修复期间不得渲染中间 checklist 结果。只有已通过、只剩人工待验证,或本轮无法继续修复时,才生成最终 `CHECKLIST_RESULT_JSON` 并渲染一次对客结论。
|
|
453
492
|
|
|
454
|
-
|
|
493
|
+
对客结论统一使用 `integration.checklist.result`,并严格按当前产品选择 `AIPAY`、`WEBPAY` 或 `APPPAY` 变体;整体结论、失败/部分通过项和人工待验证项必须来自最终一轮 checklist 实际证据。必须从本 flow 所在目录执行下列 runner;runner stdout 是唯一对客正文,必须把 stdout 原文作为当前回复正文发给用户:
|
|
455
494
|
|
|
456
|
-
|
|
495
|
+
```bash
|
|
496
|
+
printf '%s' "$CHECKLIST_RESULT_JSON" \
|
|
497
|
+
| node ../normal/scripts/integration_message_runner.mjs checklist-result --variant <AIPAY|WEBPAY|APPPAY>
|
|
498
|
+
```
|
|
457
499
|
|
|
458
|
-
|
|
459
|
-
3. 对代码集成、SDK 使用、应用创建、应用发布等没有确定依据的问题,必须明确说明无法确认,并引导用户前往支付宝开放平台或支付宝技术支持咨询客服。
|
|
500
|
+
上方 stdin 命令保持用于 Unix/macOS/Linux。Windows 不使用 shell 管道或续行符,按当前产品在 PowerShell 中执行对应单行命令;参数值仍来自同一最终 checklist 事实:
|
|
460
501
|
|
|
461
|
-
|
|
502
|
+
```powershell
|
|
503
|
+
node ../normal/scripts/integration_message_runner.mjs checklist-result --variant AIPAY --overall-result "$OVERALL_RESULT" --failed-items "$FAILED_ITEMS" --manual-items "$MANUAL_ITEMS" --sandbox-result "$SANDBOX_RESULT" --sandbox-config-state "$SANDBOX_CONFIG_STATE" --blocking-defect-state "$BLOCKING_DEFECT_STATE" --execution-mode "$EXECUTION_MODE" --next-flow-reminder "$NEXT_FLOW_REMINDER"
|
|
504
|
+
node ../normal/scripts/integration_message_runner.mjs checklist-result --variant WEBPAY --overall-result "$OVERALL_RESULT" --failed-items "$FAILED_ITEMS" --manual-items "$MANUAL_ITEMS" --webpay-experience-result "$WEBPAY_EXPERIENCE_RESULT" --sandbox-config-state "$SANDBOX_CONFIG_STATE" --blocking-defect-state "$BLOCKING_DEFECT_STATE" --execution-mode "$EXECUTION_MODE" --next-flow-reminder "$NEXT_FLOW_REMINDER"
|
|
505
|
+
node ../normal/scripts/integration_message_runner.mjs checklist-result --variant APPPAY --overall-result "$OVERALL_RESULT" --failed-items "$FAILED_ITEMS" --manual-items "$MANUAL_ITEMS" --sandbox-config-state "$SANDBOX_CONFIG_STATE" --blocking-defect-state "$BLOCKING_DEFECT_STATE" --execution-mode "$EXECUTION_MODE" --next-flow-reminder "$NEXT_FLOW_REMINDER"
|
|
506
|
+
```
|
|
462
507
|
|
|
463
|
-
|
|
464
|
-
|----------|-------------|
|
|
465
|
-
| 按量付费 | [按量付费常见问题](https://ideservice.alipay.com/cms/site/0j7uos) |
|
|
466
|
-
| 网站支付 | [网站支付常见问题](https://ideservice.alipay.com/cms/site/0j3kh1) |
|
|
467
|
-
| APP支付 | [APP支付常见问题](https://ideservice.alipay.com/cms/site/0j3pih) |
|
|
508
|
+
`failedItems` 与 `manualItems` 必须在各自受控单行值中包含对应的确定下一步;没有对应项目时明确传入“无”。`sandboxConfigState` 必须直接复用本轮脚本终态,只允许 `READY|CREATE_PENDING|VERIFY_PENDING`。`blockingDefectState` 来自同一最终 checklist:除沙箱配置及其直接依赖动作外,存在任一代码、安全或必要依据缺口时必须为 `PRESENT`,否则为 `NONE`。待配置时 `failedItems` 必须包含沙箱配置及其依赖动作未完成;恢复口令已经由步骤 1/3 的 `sandbox.configuration.pending` 输出,本结果不再重复。
|
|
468
509
|
|
|
469
|
-
|
|
510
|
+
同一次代码开发流程只渲染一次最终 checklist 结果;renderer stdout 是本次默认收口的唯一对客正文,禁止在前后追加风险说明、通过项摘要、执行说明、衔接提醒或第二份待办。
|
|
470
511
|
|
|
471
|
-
|
|
512
|
+
`integration_only` 的 `executionMode` 固定为“仅代码开发”,`nextFlowReminder` 固定为“正式上线前还需完成支付产品-产品开通。”。`full_process` 使用“完整接入”:`READY` 且整体结果为“通过”时使用“代码开发校验通过后将自动进入支付产品-产品开通;未通过时停留在代码开发。”;沙箱待配置、整体结果为“部分通过”且 `blockingDefectState=NONE` 时,使用“沙箱配置尚未完成,但不阻塞本轮继续支付产品-产品开通;完成配置后再进行沙箱测试。”;沙箱为 `READY`、整体结果为“部分通过”、`failedItems=无` 且仅剩人工待验证项时,使用“代码开发自动校验已完成,仍有人工待验证项;本轮继续产品开通。”,并把本次 `manualItems` 原样作为后续 onboarding Step 6 的 `MANUAL_VERIFICATION_ITEMS`;`blockingDefectState=PRESENT` 或整体结果为“未通过”时仍停在代码开发。renderer 会校验执行模式、沙箱状态、阻塞缺口、整体结果和衔接文案一致。
|
|
472
513
|
|
|
473
|
-
|
|
514
|
+
只有 `AIPAY` 传入 `sandboxResult`,且只能复用步骤 6 的实际服务端联调证据;`WEBPAY` 必须按步骤 6 的实际证据传入消息目录登记的 `webpayExperienceResult` 枚举,区分已提供、未提供和用户已完成一笔体验,不得自由改写。这些字段只用于 renderer 校验最终结论,不在 checklist 对客结果中重复展示。APP 支付未来沙箱测试对客引导的维护 TODO 只保留在消息目录对应变体,不得渲染给用户;补充时必须同步本 flow、`modules/checklist.md` 和测试。
|
|
474
515
|
|
|
475
|
-
|
|
516
|
+
**完成语义**:只有步骤 1-8 的适用完成条件均满足且 `sandboxConfigState=READY` 后,才可声明支付产品-代码开发完成。沙箱待配置但代码实现与其余检查通过时只能输出“部分通过”,不得改写为完成;存在其他未通过项时输出“未通过”;若配置已就绪且仅剩无法自动验证项,输出“部分通过”并登记人工待验证项,不得改写为完成或生产就绪。
|
|
476
517
|
|
|
477
|
-
|
|
478
|
-
- 检查实际发送、签名和验签参数的一致性
|
|
479
|
-
- 检查私钥字段是否正确(Java 用 `appPrivateKey`,其他语言用 `appPrivatePkcsKey`)
|
|
480
|
-
- 检查 signType 是否为 RSA2
|
|
481
|
-
- 检查网关地址是否正确
|
|
518
|
+
完成结论必须逐项来自本轮实际检查:项目和代码项重新扫描目标目录;Unix/macOS/Linux 只有 `sandboxConfigState=READY` 时才重新执行严格的 `sandbox_config.sh verify`,待配置时直接复用本轮脚本终态并标记相关项未完成,不得在 checklist 中再次创建或复核;Windows 只有 `READY` 时重新检查项目实际读取的本地配置、密钥格式和版本控制保护,`VERIFY_PENDING` 时直接标记配置及依赖动作未完成;按量付费联调只接受本轮 `run --auto-complete --require-payment-validation` 的实际成功;用户确认项只接受当前摘要后的回复。任何一项缺失、失败或无法执行都标记为失败或人工待验证,不得由 Agent 自填 `PASS`。
|
|
482
519
|
|
|
483
|
-
|
|
484
|
-
- 登录支付宝开放平台**重新上传应用公钥**
|
|
485
|
-
- 在应用配置中重新配置应用公私钥对
|
|
520
|
+
**沙箱结论边界**:步骤 8 的代码与配置校验不得把步骤 3 的字段完整性、网站支付的付款指引或 APP 支付跳过步骤 6 改写为“沙箱测试通过”。只有按量付费步骤 6 已取得完整端到端成功证据时,最终摘要才可复用该测试结论。
|
|
486
521
|
|
|
487
522
|
---
|
|
488
523
|
|
|
489
|
-
##
|
|
524
|
+
## 问题排查(按需加载)
|
|
490
525
|
|
|
491
|
-
|
|
492
|
-
|------|------|
|
|
493
|
-
| 沙箱配置 | appId + 支付宝公钥 + 商家私钥 |
|
|
494
|
-
| 集成代码 | 各语言支付代码示例 |
|
|
495
|
-
| 校验结果 | checklist核对结果 |
|
|
526
|
+
仅在用户报告报错、错误码、问题、排查、调试或异常时读取 `modules/troubleshooting-flow.md`;正常路径不得预加载。先确认产品,有错误码时再确认接口;禁止猜测密钥格式、MCP 方法或业务规则。
|
|
496
527
|
|
|
497
528
|
---
|
|
498
529
|
|
|
499
|
-
##
|
|
500
|
-
|
|
501
|
-
集成校验完成后输出实际状态:
|
|
530
|
+
## 代码开发完成确认
|
|
502
531
|
|
|
503
|
-
- `integration_only
|
|
504
|
-
- `full_process
|
|
505
|
-
-
|
|
532
|
+
- `integration_only`:仅由 `integration.checklist.result` 输出未通过项、人工待验证项和产品开通提醒,不追加第二份话术。
|
|
533
|
+
- `full_process`:全部适用步骤通过后进入 `references/onboarding/flow.md`;仅沙箱待配置,或沙箱 `READY` 且仅剩非阻塞人工待验证项时,以“部分通过”继续并保留未完成事实。其他代码、安全或依据缺口停在 Integration,不提前执行 Onboarding。
|
|
534
|
+
- 未通过时不得宣称完成;沙箱状态不得被产品开通结果覆盖。
|