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