@alipay/alipay-aipay 1.8.0 → 1.8.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -3
- package/skill/VERSION +1 -1
- package/skill/references/integration/flow.md +21 -15
- package/skill/references/integration/modules/checklist.md +10 -8
- 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 +1 -1
- 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 +1 -1
- package/skill/references/integration/modules/code-examples/csharp/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.md +3 -1
- 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 +1 -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 +1 -1
- package/skill/references/integration/modules/code-examples/java/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemoController.md +3 -1
- 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 +1 -1
- 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 +1 -1
- package/skill/references/integration/modules/code-examples/nodejs/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.md +6 -2
- 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 +1 -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 +1 -1
- package/skill/references/integration/modules/code-examples/php/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.md +3 -1
- 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 +1 -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 +1 -1
- package/skill/references/integration/modules/code-examples/python/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.md +8 -3
- package/skill/references/integration/modules/interface-contract/aipay-interface-contract.md +3 -1
- package/skill/references/integration/modules/interface-contract/apppay-interface-contract.md +4 -4
- package/skill/references/integration/modules/interface-contract/common-trade-contract.md +8 -8
- package/skill/references/integration/modules/interface-contract/notify-url-contract.md +12 -11
- package/skill/references/integration/modules/interface-contract/webpay-interface-contract.md +3 -3
- package/skill/references/integration/modules/interface-guide.md +1 -1
- package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +4 -4
- package/skill/references/integration/modules/sandbox/sandbox-setup-guide.md +10 -8
- package/skill/references/normal/conversation-telemetry.md +1 -1
- package/skill/references/normal/integration-worker.md +2 -2
- package/skill/references/normal/json/customer-messages.json +1 -1
- package/skill/references/normal/json/policy-rules.json +1 -1
- package/skill/references/normal/scripts/integration_message_runner.mjs +7 -2
- package/skill/references/normal/scripts/onboarding_message_runner.mjs +9 -5
- package/skill/references/normal/scripts/render_customer_message.mjs +145 -48
- package/skill/references/onboarding/flow.md +12 -6
- package/skill/references/runtime-entry.md +3 -1
- package/skill-pre/VERSION +1 -1
- package/skill-pre/references/integration/flow.md +28 -19
- package/skill-pre/references/integration/modules/checklist.md +12 -8
- package/skill-pre/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 +1 -1
- package/skill-pre/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 +1 -1
- package/skill-pre/references/integration/modules/code-examples/csharp/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.md +3 -1
- package/skill-pre/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 +1 -1
- package/skill-pre/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 +1 -1
- package/skill-pre/references/integration/modules/code-examples/java/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemoController.md +3 -1
- package/skill-pre/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 +1 -1
- package/skill-pre/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 +1 -1
- package/skill-pre/references/integration/modules/code-examples/nodejs/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.md +6 -2
- package/skill-pre/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 +1 -1
- package/skill-pre/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 +1 -1
- package/skill-pre/references/integration/modules/code-examples/php/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.md +3 -1
- package/skill-pre/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 +1 -1
- package/skill-pre/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 +1 -1
- package/skill-pre/references/integration/modules/code-examples/python/4-/346/214/211/351/207/217/344/273/230/350/264/271/A2MPaymentDemo.md +8 -3
- package/skill-pre/references/integration/modules/interface-contract/aipay-interface-contract.md +3 -1
- package/skill-pre/references/integration/modules/interface-contract/apppay-interface-contract.md +4 -4
- package/skill-pre/references/integration/modules/interface-contract/common-trade-contract.md +8 -8
- package/skill-pre/references/integration/modules/interface-contract/notify-url-contract.md +12 -11
- package/skill-pre/references/integration/modules/interface-contract/webpay-interface-contract.md +3 -3
- package/skill-pre/references/integration/modules/interface-guide.md +1 -1
- package/skill-pre/references/integration/modules/sandbox/a2m-sandbox-test.md +4 -4
- package/skill-pre/references/integration/modules/sandbox/sandbox-setup-guide.md +11 -9
- package/skill-pre/references/normal/full-process-routing.md +2 -2
- package/skill-pre/references/normal/integration-worker.md +2 -2
- package/skill-pre/references/normal/json/customer-messages.json +1 -1
- package/skill-pre/references/normal/json/policy-rules.json +1 -1
- package/skill-pre/references/normal/scripts/integration_message_runner.mjs +7 -2
- package/skill-pre/references/normal/scripts/onboarding_message_runner.mjs +9 -5
- package/skill-pre/references/normal/scripts/render_customer_message.mjs +150 -48
- package/skill-pre/references/normal/windows-environment.md +4 -4
- package/skill-pre/references/onboarding/flow.md +12 -6
- package/skill-pre/references/runtime-entry.md +5 -3
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_CORE:START -->
|
|
2
2
|
# 支付产品-代码开发流程
|
|
3
3
|
|
|
4
|
-
本 flow 的 Windows READY/LEGACY/CODE_ONLY 指根入口的唯一兼容环境分流事实,或 Windows 环境文档明确修复后唯一、根意图匹配的新 READY 事实;BLOCKED 停在环境恢复点,不进入本 flow。后续命令附加当前有效的 `--windows-route`。Windows READY 通过 Git Bash 执行登记的快速沙箱脚本;Windows LEGACY/CODE_ONLY 保留原 Node 独立开发和手工沙箱分支。三者都由当前 Agent 串行执行,不启用 Integration Worker。Windows 沙箱项目配置不要求精确 NTFS ACL 白名单;仍校验字段、项目实际加载路径及防误提交。登录凭据与生产配置沿各自动作的保护规则处理。CODE_ONLY 允许 `integration_only/full_process`
|
|
4
|
+
本 flow 的 Windows READY/LEGACY/CODE_ONLY 指根入口的唯一兼容环境分流事实,或 Windows 环境文档明确修复后唯一、根意图匹配的新 READY 事实;BLOCKED 停在环境恢复点,不进入本 flow。后续命令附加当前有效的 `--windows-route`。Windows READY 通过 Git Bash 执行登记的快速沙箱脚本;Windows LEGACY/CODE_ONLY 保留原 Node 独立开发和手工沙箱分支。三者都由当前 Agent 串行执行,不启用 Integration Worker。Windows 沙箱项目配置不要求精确 NTFS ACL 白名单;仍校验字段、项目实际加载路径及防误提交。登录凭据与生产配置沿各自动作的保护规则处理。CODE_ONLY 允许 `integration_only/full_process` 在可选工具故障时继续代码开发,沙箱默认 `VERIFY_PENDING`,用户主动提供完整有效手工资料并完成项目配置校验后可记 `READY`;配置就绪不改变环境分流,各测试仍须满足自身实际依赖。完整接入完成代码部分后停在开通前,不把 CODE_ONLY 用于 Onboarding。根意图变化必须重跑 Windows 入口。
|
|
5
5
|
|
|
6
6
|
> ⚠️ **前置声明**:本 flow 仅支持 **AI 网页应用收款、AI 移动应用收款、AI 按量付费**三种产品的集成。原有“网站支付”“APP 支付”“按量付费”仍作为输入别名和资源目录名。**其他产品(当面付、订单码支付、JSAPI支付、预授权支付、商家扣款等)暂不支持**,如需集成请前往[支付宝开放平台](https://open.alipay.com/)查阅相关文档。
|
|
7
7
|
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
先确认唯一项目和服务端语言,再在产品确定前执行步骤 1;匿名沙箱不传 `PRODUCT`,缺失时创建、存在时复核,待配置只阻止沙箱依赖动作。步骤 2 的完整方案可见送达前不得改代码;送达后按步骤 2 完成执行者分流,再由确定的执行者按同一产品、项目和技术栈开工,不再执行方案 receipt 或项目快照二次校验。`integration_only/full_process` 共用检查器事实和非阻塞 `integration.start.confirm`,一次只开发一个产品。网站支付/APP 支付必须实现下单、查询、退款、退款查询、关闭和异步通知;按量付费只实现 402、验付和履约确认。本流程不主动发起真实生产交易。
|
|
21
21
|
|
|
22
|
-
生产 `appId`、应用公钥、应用私钥和支付宝公钥必须属于同一生产应用,私钥格式必须匹配当前语言,格式转换只用支付宝官方密钥工具。网站支付/APP
|
|
22
|
+
生产 `appId`、应用公钥、应用私钥和支付宝公钥必须属于同一生产应用,私钥格式必须匹配当前语言,格式转换只用支付宝官方密钥工具。网站支付/APP 支付必须同时实现通知处理和交易查询;缺少 notify_url 时下单省略该字段并由服务端主动查单兜底,不会仅因缺少该地址而报错,也不因此将本轮校验判为失败;`notify_url` 可选,生产也可省略。使用通知时验证公网 HTTPS 地址、验签、关键字段、幂等、`success` 回写及补偿查询;不使用时验证商家服务端可靠主动查单、响应验签、订单/金额/状态/归属校验、持久化幂等、后台重试及未决订单恢复。未验证所选链路前不得宣称生产就绪。
|
|
23
23
|
|
|
24
24
|
### 标准消息执行规则
|
|
25
25
|
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
## 用户阻塞点索引
|
|
39
39
|
|
|
40
40
|
<!-- GENERATED:INTEGRATION-GUARDS:START -->
|
|
41
|
-
共享护栏:`P-MCP-CONTRACT-FROZEN` 仅用已验证脚本;禁推断或尝试近似方法;`P-SANDBOX-CREDENTIAL-EXCEPTION` Unix/macOS/Linux 与 Windows READY
|
|
41
|
+
共享护栏:`P-MCP-CONTRACT-FROZEN` 仅用已验证脚本;禁推断或尝试近似方法;`P-SANDBOX-CREDENTIAL-EXCEPTION` Unix/macOS/Linux 与 Windows READY 已校验快速沙箱买家密码按既有登记摘要/付款体验展示;Windows LEGACY/CODE_ONLY 手工资料用于受保护项目,仅网页收款登记摘要可明文展示买家密码;最终收口仅网页收款三项买家信息;其他原文禁复述、另存或扩展到生产值;`P-SENSITIVE-STATE` 公钥限当前 app 调用且禁复述/保存;敏感值禁入回复/摘要/日志/状态/宽权限文件;临时 URL 仅由登记动作展示;`P-PROJECT-PROTECT` 禁清空/覆盖/删除既有项目;仅改已确认路径和范围;`P-CUSTOMER-OUTPUT-EXCLUSIVE` 登记 stdout 原文是唯一正文;阻塞送达后立即等待;`P-DETERMINISTIC-HANDOFF` 仅执行登记命令并按唯一终态转移;禁追加解析;失败只走登记恢复。
|
|
42
42
|
<!-- GENERATED:INTEGRATION-GUARDS:END -->
|
|
43
43
|
<!-- GENERATED:INTEGRATION-GUARDS-AIPAY:START -->
|
|
44
44
|
共享护栏:`P-A2M-SANDBOX` A2M 沙箱固定 api_mock_service_id 与沙箱网关;生产值仅用于正式配置;`P-A2M-SUCCESS` 联调仅在 HTTP 200、资源可归属、无业务失败且适用回执有效时通过。
|
|
@@ -144,7 +144,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message loc
|
|
|
144
144
|
- [INT.ENV.PROJECT_LANGUAGE_READY] 已确认唯一目标项目路径和服务端语言,且目标项目包含已确认语言的构建标识
|
|
145
145
|
- [INT.SANDBOX.OS_DETECTED] 已检测用户操作系统类型
|
|
146
146
|
- [INT.SANDBOX.PREPARATION_RECORDED] Unix/macOS/Linux 或 Windows READY 已从固定脚本取得唯一 `READY|CREATE_PENDING|VERIFY_PENDING` 终态。`READY` 时配置已安全落盘或复核;待配置不是成功,不满足任何沙箱配置、测试或生产就绪条件,但本步骤允许继续产品确认和代码开发
|
|
147
|
-
- [INT.SANDBOX.WINDOWS_STATE_RECORDED] Windows LEGACY/CODE_ONLY
|
|
147
|
+
- [INT.SANDBOX.WINDOWS_STATE_RECORDED] Windows LEGACY/CODE_ONLY:本轮用户主动提供或既有标准消息后提供的完整有效沙箱资料已写入并校验为 `READY`;没有完整有效资料时记录 `VERIFY_PENDING` 并继续代码实现;只有用户明确要求立即配置时才使用既有标准消息收集资料
|
|
148
148
|
|
|
149
149
|
**执行规则**:
|
|
150
150
|
|
|
@@ -156,13 +156,13 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message loc
|
|
|
156
156
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" sandbox ensure "<规范化项目路径>" "<已确认服务端语言>" [--telemetry-run-id "$RUN_ID" --telemetry-history-count "$HISTORY_COUNT"] --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
-
4. Windows LEGACY/CODE_ONLY
|
|
159
|
+
4. Windows LEGACY/CODE_ONLY 不调用快速沙箱脚本。普通代码开发或完整接入请求没有明确要求当前配置沙箱且未主动提供资料时,不展示申领消息、不补问,直接记录 `sandboxConfigState=VERIFY_PENDING` 并继续步骤 2。用户主动提供本轮目标项目的完整有效手工沙箱资料时,直接校验并写入目标项目实际使用的本机配置,记录 `READY`,无需再次展示申领消息;该状态只证明配置就绪,不将 `CODE_ONLY` 改为环境 `READY`。只有用户明确要求现在配置/恢复沙箱时才执行下列既有标准消息 `sandbox.windows.manual_setup`;该消息使用自由资料回复,不要求用户输入 `1` 或自行执行脚本。主动资料不完整或无效时不使用字段、不记 `READY`,沿用既有受控失败分支只补问实际缺失/错误字段;资料校验通过后继续:
|
|
160
160
|
|
|
161
161
|
```bash
|
|
162
162
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message windows-sandbox-setup --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
163
163
|
```
|
|
164
164
|
|
|
165
|
-
资料校验通过后必须建立适用的版本控制忽略和访问保护。该例外只适用于当前沙箱资料;生产环境应用私钥和密码禁止提供给 Agent。Agent
|
|
165
|
+
资料校验通过后必须建立适用的版本控制忽略和访问保护。该例外只适用于当前沙箱资料;生产环境应用私钥和密码禁止提供给 Agent。Agent 不得在回复、摘要或普通日志中复述收到的值;仅 AI 网页应用收款在本步骤 5 已校验后,允许登记沙箱摘要展示买家账号及两个密码,最终 summary 只展示这三项。
|
|
166
166
|
|
|
167
167
|
5. Unix/macOS/Linux 或 Windows READY 的 `ensure` 只依据同一目标项目的 `.alipay-sandbox.json` 当前事实分流:文件不存在时执行既有 `create`;文件存在或为符号链接时执行既有 `verify` 安全路径。已存在配置不得再次调用 `createAnonymousSandbox`、不得覆盖,也不得因为中断重来要求用户删除配置;无效、不安全或被 Git 跟踪时不得使用,脚本按待配置终态统一输出后继续代码开发。
|
|
168
168
|
6. 只有 Unix/macOS/Linux 或 Windows READY 创建分支会调用冻结的 `alipay-anonymous-sandbox.createAnonymousSandbox`、`{"request":{"appType":"PUBLICAPP"}}`、`PLATFORM`、`PLATFORM_ID`、`ALIPAYCLI_BIZ_INFO` 环境变量和 `result.content[0].text -> success -> data` 解包逻辑;`ALIPAYCLI_BIZ_INFO` 固定标识当前调用方 Skill、当前生效版本和匿名 `skill_user_id`,禁止传入 `PRODUCT`。Windows LEGACY/CODE_ONLY 不调用该方法或 `sandbox_config.sh`。
|
|
@@ -334,21 +334,21 @@ curl -sL "<当前契约 sourceUrl 中的官方页面>"
|
|
|
334
334
|
|
|
335
335
|
**沙箱摘要展示入口**:只有 `sandboxConfigState=READY`、本步骤的代码实现和支付配置后置校验都已完成,才允许对客展示沙箱环境配置。待配置状态跳过本入口,不另写摘要或失败话术。Unix/macOS/Linux 或 Windows READY 从本 flow 所在目录执行:
|
|
336
336
|
|
|
337
|
-
`environmentRows` 的具体值严禁编造、猜测、补全,禁止使用示例值、占位值或历史对话值替代本轮已校验配置。Unix/macOS/Linux 或 Windows READY 必须由登记脚本直接读取同一配置并生成四行,Agent 不得手填或改写;Windows LEGACY/CODE_ONLY
|
|
337
|
+
`environmentRows` 的具体值严禁编造、猜测、补全,禁止使用示例值、占位值或历史对话值替代本轮已校验配置。Unix/macOS/Linux 或 Windows READY 必须由登记脚本直接读取同一配置并生成四行,Agent 不得手填或改写;Windows LEGACY/CODE_ONLY 的字段必须来自步骤 1/3 已校验的同一本机配置;网页收款使用已校验沙箱买家密码明文,其他产品两个密码行仅在确认密码已写入文件后使用固定保存提示。任一必需字段缺失、为空、配置无法读取或来源无法确认时,停止摘要展示并按既有配置失败分支处理,禁止为凑齐四行补值。
|
|
338
338
|
|
|
339
339
|
```bash
|
|
340
340
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" sandbox summary "<productType>" "<规范化项目路径>" "<已确认服务端语言>" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
341
341
|
```
|
|
342
342
|
|
|
343
|
-
|
|
343
|
+
仅 AI 网页应用收款在该命令成功交付后,在当前对话上下文保留剔除内部行的完整 stdout 为 `SANDBOX_SUMMARY`;只允许本轮原始登记摘要,不写业务状态、不摘出或复述凭据。配置后置校验失败、最终状态不再 READY 或实际配置变化时立即丢弃,禁止拿旧摘要补齐。该命令 stdout 只渲染 `sandbox.environment.summary` 与 `sandbox.environment.reminder`;Unix/macOS/Linux 和 Windows READY 都从已校验的快速沙箱配置展示买家账号、登录密码与支付密码。命令必须产生唯一 `ALIPAY_AIPAY_INTERNAL:CUSTOMER_MESSAGE_DELIVERY_REQUIRED=sandbox.environment.summary`,带 `ALIPAY_AIPAY_INTERNAL:` 前缀的配置路径和 `FLOW:SANDBOX_CONFIGURED` 只用于流程转移,严禁对客。命令返回后下一动作必须将剔除内部行后的 stdout 原文独立送达,再进入后续沙箱测试或付款体验;不得把工具面板输出或自写摘要当作已送达。命令不重新创建沙箱,不调用 `createAnonymousSandbox`。`productType` 只能来自步骤 2 已确认的 `aipay|webpay|apppay`;配置路径和语言必须与步骤 1/3 一致。摘要展示失败时不得进入沙箱测试或付款体验,也不得改用 Agent 自写表格。
|
|
344
344
|
|
|
345
|
-
Windows LEGACY/CODE_ONLY
|
|
345
|
+
Windows LEGACY/CODE_ONLY 从项目实际读取的同一本机配置构造 `ENVIRONMENT_ROWS`:网页收款允许已校验沙箱买家密码明文,其他产品继续使用本地保存提示,所有产品均不得包含密钥原文,再从本 flow 所在目录执行以下固定命令;除上述网页收款买家密码外,不得重新索取或复述步骤 1 已提供的敏感值,也不得改用 Unix 快速沙箱脚本:
|
|
346
346
|
|
|
347
347
|
```powershell
|
|
348
348
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message windows-sandbox-summary --product-name "$PRODUCT_NAME" --config-path "$CONFIG_PATH" --environment-rows "$ENVIRONMENT_ROWS" --telemetry-run-id "$RUN_ID" --telemetry-history-count "$HISTORY_COUNT" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
349
349
|
```
|
|
350
350
|
|
|
351
|
-
Windows LEGACY/CODE_ONLY 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实际本机配置绝对路径;`ENVIRONMENT_ROWS` 固定依次为“沙箱支付宝应用ID(appID)”“沙箱买家测试账号”“沙箱买家登录密码”“沙箱买家支付密码”四行。前两行使用实际沙箱应用 ID
|
|
351
|
+
Windows LEGACY/CODE_ONLY 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实际本机配置绝对路径;`ENVIRONMENT_ROWS` 固定依次为“沙箱支付宝应用ID(appID)”“沙箱买家测试账号”“沙箱买家登录密码”“沙箱买家支付密码”四行。前两行使用实际沙箱应用 ID 和买家登录账号;网页收款两个密码行使用已校验沙箱买家密码明文;其他产品两个密码行只展示“已写入本地配置文件,默认不在对话中展开”,不得传入密码原文。不追加 pid、商家或买家 userId、sandboxId。两个 renderer 任一失败都按摘要展示失败处理,禁止手写补齐。仅网页收款成功交付后保留完整原始 stdout 为 `SANDBOX_SUMMARY`,供最终收口提取三项买家信息;其他产品不保留该变量。
|
|
352
352
|
|
|
353
353
|
<!-- ALIPAY_AIPAY_PRODUCT:webpay:START -->
|
|
354
354
|
**网站支付回跳默认规则**:用户未特别说明时,默认实现支付后同步回跳。`return_url` 必须来自已确认目标项目的实际协议、主机、端口和路由,禁止保留 `your-domain.com`、示例端口或猜测路径。项目没有结果页时,在当前技术栈内新增与既有 UI 一致的 GET 回跳路由和页面。用户已明确不需要同步回跳时,直接按关闭分支验收,不增加第二次确认;仍必须保留异步通知、交易查询和商户订单查询页。用户未明确关闭但代码缺少 `return_url` 时,必须修复为默认同步回跳分支,不得要求用户接受遗漏。验收结论必须从实际代码重新检查,不接受调用方自报 `returnMode`。
|
|
@@ -402,7 +402,7 @@ Windows LEGACY/CODE_ONLY 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实
|
|
|
402
402
|
3. 默认分支继续启动服务,并对不带支付结果参数的 `return_url` 发起 GET 访问。这一步只验证路由和页面壳:无订单上下文时应展示安全的中性状态,不得因没有签名参数而绕过真实回跳请求的验签和订单归属校验。确认响应成功、无认证或重定向循环;单页应用直接刷新不得返回 404。
|
|
403
403
|
4. 默认分支中,Agent 具备浏览器/UI 验证能力时,实际打开回跳页,确认页面非空白、无可见报错且关键状态内容正常渲染。不具备时,不向用户追加人工确认;将“回跳页 UI 人工待验证”记录到最终 checklist 的 `manualItems`,并继续提供沙箱付款入口。
|
|
404
404
|
|
|
405
|
-
5. 用户已明确关闭同步回跳时,不要求或猜测 `return_url`;确认 SDK
|
|
405
|
+
5. 用户已明确关闭同步回跳时,不要求或猜测 `return_url`;确认 SDK 请求未传该字段,并改为验证异步通知处理代码、交易查询和商户订单查询页。如尚未部署公网 HTTPS `notify_url`,保留上线前提醒,不单独计入本轮失败或人工待验证项;生产不使用通知时需验证服务端可靠主动查单。
|
|
406
406
|
6. 输出沙箱付款说明。操作顺序为:启动服务 → 用浏览器访问支付页面 → 发起支付 → 唤起沙箱收银台 → 用户从“收银台账号登录”与“安卓沙箱支付宝扫码”中二选一完成付款 → 返回商户结果页并查询展示订单状态。
|
|
407
407
|
|
|
408
408
|
回跳地址无法确定、访问失败或页面出现确定错误时,必须先修正;本轮无法继续修正时进入最终 checklist 的未完成项,不得宣称网站支付代码开发完成。仅缺少浏览器/UI 证据时记录“回跳页 UI 人工待验证”,不得宣称回跳页已验证,但不阻塞沙箱付款入口交付。该体验不新增业务写操作确认点,用户暂未付款不阻止后续代码校验。
|
|
@@ -415,7 +415,7 @@ Windows LEGACY/CODE_ONLY 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实
|
|
|
415
415
|
以下两项按实际分支二选一,不得同时要求:
|
|
416
416
|
|
|
417
417
|
- [INT.WEBPAY.RETURN_VERIFIED] 默认分支已确认实际 `return_url` 与项目路由一致,启动服务后 GET 访问通过,且已通过 Agent 浏览器/UI 验证取得页面正常渲染的证据;当前环境无法取得 UI 证据时只能记为人工待验证,不能满足本完成条件
|
|
418
|
-
- [INT.WEBPAY.NO_RETURN_VERIFIED] 关闭分支已记录用户先前明确提出的不使用同步回跳,确认 SDK 请求未传 `return_url`,并完成异步通知处理代码、交易查询和商户订单查询页校验;缺少公网 HTTPS `notify_url`
|
|
418
|
+
- [INT.WEBPAY.NO_RETURN_VERIFIED] 关闭分支已记录用户先前明确提出的不使用同步回跳,确认 SDK 请求未传 `return_url`,并完成异步通知处理代码、交易查询和商户订单查询页校验;缺少公网 HTTPS `notify_url` 时已保留上线前提醒;不使用通知时验证服务端可靠主动查单
|
|
419
419
|
<!-- ALIPAY_AIPAY_PRODUCT:END -->
|
|
420
420
|
|
|
421
421
|
<!-- ALIPAY_AIPAY_PRODUCT:aipay:START -->
|
|
@@ -423,6 +423,8 @@ Windows LEGACY/CODE_ONLY 的 `CONFIG_PATH` 必须是步骤 1/3 已校验的实
|
|
|
423
423
|
|
|
424
424
|
**任务**:验证按量付费 402 协议端到端服务端联调流程
|
|
425
425
|
|
|
426
|
+
Windows `CODE_ONLY` 下手工沙箱配置为 `READY` 时,按本动作实际依赖判断可执行性;不因缺少 Git Bash 单独跳过原生 Python 402 联调,仍须 Python、curl、服务可访问及本步骤全部前置就绪。缺失工具所依赖的动作列为未完成,不据此调用快速沙箱或进入 Onboarding。
|
|
427
|
+
|
|
426
428
|
> ⚠️ **必须完整阅读** `modules/sandbox/a2m-sandbox-test.md` 后方可执行本步骤
|
|
427
429
|
>
|
|
428
430
|
> 沙箱联调经验集中维护在 `modules/sandbox/a2m-sandbox-test.md`。遇到收银接口临时失败、`ORDER_NOT_FOUND`、资源防串失败或履约确认失败时,先按该文档排查,不要反复请求用户服务生成新订单。
|
|
@@ -548,6 +550,8 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message saf
|
|
|
548
550
|
|
|
549
551
|
**自动执行规则**:步骤 7 完成后进入 `checklist` 阶段;最终收口阶段统一记录 `integration_summary`,输出唯一 `ALIPAY_AIPAY_INTERNAL:CHECKLIST_SCOPE_RECEIPT=<receipt>`,并在本 bundle 末尾直接附带当前产品适用清单。该 scope receipt 仅绑定当前产品、路径与快照,防止错配或变更后沿用旧结论,不证明检查已执行。不得再单独读取整份 `modules/checklist.md`。默认只执行代码阅读、最终 runner 内固定 implementation audit、配置后置校验、语法/静态检查,以及无需安装依赖、联网或监听端口的已有定向测试,并复用步骤 5、步骤 6 已取得的校验证据,不增加“是否需要校验”的用户确认。
|
|
550
552
|
|
|
553
|
+
**禁止循环与定向复检**:首次覆盖全部适用项,并复用本轮已有且仍有效的证据。局部修复后严禁重新运行全部测试、全部 checklist 动作或无关端到端联调;只复检修复项及有直接依赖、接口、配置或安全影响的关联项,先明确受影响范围,其余未受影响项沿用原证据。每个问题自动修复后最多一次定向复检;仍失败、结果无变化、缺少新证据或受环境阻断时立即停止该问题的重复检测,保留失败/待验证结果并进入最终收口,不以换命令、重载阶段、刷新 scope、重新进入 flow 或主 Agent 要求继续来重置次数。局部复检新发现的问题直接列入本轮结果,不开启无限修复链;后续只有用户明确要求继续处理时再按实际缺口推进。重新取得 scope 只绑定修改后的快照,不代表必须重测所有项目;最终 runner 的固定只读 implementation audit 仍按原契约执行,不等于授权全量测试。
|
|
554
|
+
|
|
551
555
|
**执行边界**:默认禁止安装依赖或浏览器、切换运行时版本、启动长期服务、申请网络/端口权限、执行截图或 UI 自动化,也不得重复步骤 6 已完成的端到端测试。遇到 `EPERM`、网络受限、缺少浏览器等环境限制时,将对应项标记为“人工待验证”并停止扩展排查;不得据此推断代码或运行时兼容问题。只有用户明确要求继续扩展验证时,才展示拟执行动作并按原确认规则处理。
|
|
552
556
|
|
|
553
557
|
步骤 3 至步骤 7 的必要依据、配置摘要、代码修复、网站回跳或按量付费联调在本轮无法继续时,跳过所有依赖该失败事实的后续动作,但仍进入本步骤:把未满足条件和被跳过动作按实际证据标记为失败或人工待验证,并使用同一 `integration.checklist.result` 收口。不得为了生成结果重新执行已阻断的外部动作。该 runner 只能在当前产品匹配且未收口的 `integration_only|full_process` active run 内执行;telemetry 开启时缺少或不匹配 run 会直接停止,禁止完成 checklist 后静默丢失 `integration.complete_coding`。`full_process` 中,只有沙箱为 `CREATE_PENDING|VERIFY_PENDING` 且代码实现与不依赖沙箱的安全检查均通过、或沙箱为 `READY` 且仅剩非阻塞人工待验证项时,才在输出标准“部分通过”结果后继续 onboarding;存在其他代码、安全或必要依据失败时仍停在代码开发。
|
|
@@ -559,19 +563,22 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message saf
|
|
|
559
563
|
|
|
560
564
|
> 详细校验清单已附在当前阶段 bundle 的“当前产品适用校验清单”。
|
|
561
565
|
|
|
562
|
-
|
|
566
|
+
**验收阶段边界**:本轮代码开发按沙箱集成验收;checklist 第七节中尚未开通产品或尚未取得、切换生产实值的检查,记为当前阶段不适用并保留上线前待办,不计入失败项或人工待验证项,不单独阻止 Onboarding。仍须检查生产配置加载边界、环境隔离和所有适用代码/安全控制;已发现的实现缺陷、泄露或环境混用仍是阻断缺口。不得为完成本轮检查索取生产私钥、提前改用生产配置或宣称生产就绪。
|
|
563
567
|
|
|
564
|
-
|
|
568
|
+
**校验完整性要求**:内部必须覆盖当前 bundle 中适用于目标产品的密钥与安全、异步通知、接口覆盖、支付结果处理、按量付费专项、退款、上线前和结果输出章节,不得只检查上方三个摘要项。checklist 校验结果段落:通过时只输出通过结论和下一步;完整接入部分通过或未通过时只输出实际未完成项、人工待验证项和下一步;仅代码开发不展示“未完成项”“人工待验证”独立标签,将实际失败问题及下一步放在【当前状态】,需核实事项只在上线关键点内列一次;仅代码开发另由同一 renderer 追加下述最终摘要。联调或付款体验结论不重复展开;仅网页收款在仅代码开发的最终 checklist 上线关键点前展示步骤 5 已交付摘要中的三项买家信息,完整接入则留到 Onboarding 最终总收口;按量付费与 APP 支付最终 summary 不展示沙箱配置。通过项与不适用项无需逐行展开,用户要求明细时再输出完整逐项结果。精简输出不得导致任何适用校验被跳过。
|
|
569
|
+
|
|
570
|
+
先汇总 checklist 证据;本轮可修复时按上述有限修复预算处理,只定向复检受影响项,不渲染中间结果。项目快照变化会使旧 `CHECKLIST_SCOPE_RECEIPT` 失效,必须重新加载本阶段并重跑受影响检查。
|
|
565
571
|
|
|
566
572
|
项目不再变化且准备生成最终结论时,按 `aipay=AIPAY`、`webpay=WEBPAY`、`apppay=APPPAY` 得到 `PRODUCT_VARIANT`。下方唯一 runner 会重算项目快照、校验 scope,并执行固定 implementation audit;审计只读非测试生产源码,检查核心接口标记和登记的高置信度危险模式,不替代完整 checklist,也不接受 Agent 审计 receipt。
|
|
567
573
|
|
|
568
|
-
若审计发现问题且命令未传 `--finalize-audit-findings true`,stdout 为空,stderr 只接受唯一 `ALIPAY_AIPAY_INTERNAL:CHECKLIST_AUDIT={state:"REPAIR_REQUIRED",findings:[...]}
|
|
574
|
+
若审计发现问题且命令未传 `--finalize-audit-findings true`,stdout 为空,stderr 只接受唯一 `ALIPAY_AIPAY_INTERNAL:CHECKLIST_AUDIT={state:"REPAIR_REQUIRED",findings:[...]}`。本轮仍有修复预算时先修复,只定向复检受影响项,重新加载 checklist 阶段取得新 scope,再用更新后的实际证据执行同一结论命令,禁止渲染中间结果。预算耗尽、无进展或无法修复时向同一命令追加 `--finalize-audit-findings true`,runner 将 findings 合入“未通过”并收口;该内部重跑不新增用户操作点。`full_process` 必须停在 Integration。
|
|
569
575
|
|
|
570
576
|
对客结论统一使用 `integration.checklist.result`;整体结论、失败/部分通过项和人工待验证项必须来自最终一轮 checklist 实际证据。最终渲染成功时必须产生唯一 `ALIPAY_AIPAY_INTERNAL:CUSTOMER_MESSAGE_DELIVERY_REQUIRED=integration.checklist.result`;命令返回后的下一动作先将 stdout 原文独立送达,不得以工具面板或自写总结替代。首次调用前先按以下完整契约确定参数,禁止改枚举:
|
|
571
577
|
|
|
572
578
|
- `variant` 映射 `aipay=AIPAY`、`webpay=WEBPAY`、`apppay=APPPAY`;`overallResult` 只允许“通过、部分通过、未通过”。
|
|
573
|
-
- `failedItems`/`manualItems`
|
|
579
|
+
- `failedItems`/`manualItems` 必须是含下一步的受控单行值,无项目传“无”。先按证据分类:单纯尚无公网 `notify_url` 属于通用上线提醒,用户尚未自愿完成沙箱付款属于可选体验,两者不得进入 `failedItems`、`manualItems` 或影响完成判定的待办;付款入口及完整指引仍须按步骤 6 交付。实际 UI/已选通知链路证据缺口进入 `manualItems` 并保留部分通过,代码/安全缺陷进入 `failedItems` 并按原门禁处理。不得为每个项目固定添加 UI 或通知幂等待验证项;不得仅因沙箱摘要未展示而改变分类。renderer 拒绝把上述通用提醒、可选体验作为缺口的旧输入;遇到分类错误只修正结果参数,不重新执行已完成检查。`sandboxConfigState` 只允许 `READY|CREATE_PENDING|VERIFY_PENDING`;除沙箱配置及其直接依赖外存在代码、安全或必要依据缺口时 `blockingDefectState=PRESENT`,否则 `NONE`。待配置时 `failedItems` 必须列出沙箱配置及依赖动作未完成;恢复口令只由步骤 1/3 已发送的 `sandbox.configuration.pending` 正文提供。
|
|
574
580
|
- `executionMode`:`integration_only` 固定“仅代码开发”,`nextFlowReminder` 固定“正式上线前还需完成支付产品-产品开通。”。`full_process` 固定“完整接入”:`READY` 且“通过”时提醒“代码开发校验通过后将自动进入支付产品-产品开通;未通过时停留在代码开发。”;沙箱待配置且 `blockingDefectState=NONE` 时提醒“沙箱配置尚未完成,但不阻塞本轮继续支付产品-产品开通;完成配置后再进行沙箱测试。”;`READY`、`failedItems=无` 且仅有人工待验证项时提醒“代码开发自动校验已完成,仍有人工待验证项;本轮继续产品开通。”,并把 `manualItems` 原样带入 Onboarding Step 6。其他阻断结果停在 Integration。
|
|
581
|
+
- 上述 `nextFlowReminder` 仍按代码校验事实传入;Windows `CODE_ONLY` 且 `executionMode=完整接入` 时,renderer 在原有校验后统一使用消息目录的 `windowsCodeOnlyReminder` 替换对客后续提示。无论代码通过、沙箱待配置、仅人工待验证或阻塞失败,都不得承诺本轮继续开通;本轮停在代码开发,工具恢复后按 `../normal/windows-environment.md` 重新执行原根意图的 `windows-entry`,取得唯一 `READY` 后才可恢复开通。该显示覆盖不改变代码结果、沙箱状态、失败项或现有门禁。
|
|
575
582
|
- 仅 `AIPAY` 传 `sandboxResult`:步骤 6 端到端联调通过为“AI 按量付费沙箱服务端联调通过”,否则为“AI 按量付费沙箱服务端联调未通过”。仅 `WEBPAY` 传 `webpayExperienceResult`,按步骤 6 证据从三个登记值中选择:已提供入口指引且待用户实际付款、未提供完整入口指引、或用户已完成一笔沙箱付款且结果有核验证据。`APPPAY` 不传这两个参数。
|
|
576
583
|
|
|
577
584
|
必须从本 flow 所在目录执行当前产品对应单行 runner;runner stdout 是唯一对客正文,必须把 stdout 原文作为当前回复正文发给用户:
|
|
@@ -583,7 +590,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message che
|
|
|
583
590
|
<!-- ALIPAY_AIPAY_PRODUCT:END -->
|
|
584
591
|
<!-- ALIPAY_AIPAY_PRODUCT:webpay:START -->
|
|
585
592
|
```bash
|
|
586
|
-
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message 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" --telemetry-run-id "$RUN_ID" --telemetry-history-count "$HISTORY_COUNT" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
593
|
+
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message 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" [--sandbox-summary "$SANDBOX_SUMMARY"] --telemetry-run-id "$RUN_ID" --telemetry-history-count "$HISTORY_COUNT" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
587
594
|
```
|
|
588
595
|
<!-- ALIPAY_AIPAY_PRODUCT:END -->
|
|
589
596
|
<!-- ALIPAY_AIPAY_PRODUCT:apppay:START -->
|
|
@@ -596,11 +603,13 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message che
|
|
|
596
603
|
|
|
597
604
|
同一次代码开发流程只渲染一次最终 checklist 结果;renderer stdout 是本次默认收口的唯一对客正文,禁止在前后追加风险说明、通过项摘要、执行说明、衔接提醒或第二份待办。
|
|
598
605
|
|
|
606
|
+
最终摘要:仅代码开发时,runner 在 checklist 结论后统一输出【当前状态】、符合条件时的【沙箱测试配置】、【上线前有以下关键点】和【提示】。仅网页收款在 `sandboxConfigState=READY` 且步骤 5 的配置后置校验与摘要交付成功、当前实际配置未变化时,传 `--sandbox-summary "$SANDBOX_SUMMARY"`;没有有效原摘要时省略该参数,不读文件、不重建沙箱、不编造字段。最终回放遇到原摘要缺失、过期、格式异常或校验失败时,只省略【沙箱测试配置】,严禁阻塞其余 summary 对客正文;首次配置校验和实际业务门禁保持不变。该区块仅保留沙箱买家测试账号、沙箱买家登录密码、沙箱买家支付密码三项,密码明文展示(含 Windows),不展示产品、配置路径、appId 或密钥行,不表示付款测试通过。按量付费与 APP 支付不得传此参数,不展示该区块。完整接入的中间 checklist 禁止传该参数、禁止提前重复上线清单,原摘要保留给 Onboarding Step 6。传参使用宿主进程参数数组或安全引用,不把多行正文嵌入手写 Shell/JSON。
|
|
607
|
+
|
|
599
608
|
这些产品专属字段只用于 renderer 校验最终结论,不在 checklist 对客结果中重复展示。APP 支付未来沙箱测试对客引导的维护 TODO 只保留在消息目录对应变体,不得渲染给用户;补充时必须同步本 flow、`modules/checklist.md` 和测试。
|
|
600
609
|
|
|
601
610
|
**完成语义**:只有步骤 1-8 的适用完成条件均满足且 `sandboxConfigState=READY` 后,才可声明支付产品-代码开发完成。沙箱待配置但代码实现与其余检查通过时只能输出“部分通过”,不得改写为完成;存在其他未通过项时输出“未通过”;若配置已就绪且仅剩无法自动验证项,输出“部分通过”并登记人工待验证项,不得改写为完成或生产就绪。
|
|
602
611
|
|
|
603
|
-
|
|
612
|
+
完成结论必须逐项来自本轮实际检查:首次覆盖时检查项目和代码;局部修复后的检查与下述配置验证仅在相关证据受影响时重新执行,未受影响的有效证据沿用;Unix/macOS/Linux 或 Windows READY 只有 `sandboxConfigState=READY` 时才重新执行严格的 `sandbox_config.sh verify`,待配置时直接复用本轮脚本终态并标记相关项未完成,不得在 checklist 中再次创建或复核;Windows LEGACY/CODE_ONLY 只有 `READY` 时重新检查项目实际读取的本地配置、密钥格式和版本控制保护,`VERIFY_PENDING` 时直接标记配置及依赖动作未完成;按量付费联调只接受本轮 `run --auto-complete --require-payment-validation` 的实际成功;用户确认项只接受当前摘要后的回复。任何一项缺失、失败或无法执行都标记为失败或人工待验证,不得由 Agent 自填 `PASS`。
|
|
604
613
|
|
|
605
614
|
**沙箱结论边界**:步骤 8 的代码与配置校验不得把步骤 3 的字段完整性、网站支付的付款指引或 APP 支付跳过步骤 6 改写为“沙箱测试通过”。只有按量付费步骤 6 已取得完整端到端成功证据时,最终摘要才可复用该测试结论。
|
|
606
615
|
|
|
@@ -615,6 +624,6 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message che
|
|
|
615
624
|
## 代码开发完成确认
|
|
616
625
|
|
|
617
626
|
- `integration_only`:仅由 `integration.checklist.result` 输出未通过项、人工待验证项和产品开通提醒,不追加第二份话术。
|
|
618
|
-
- `full_process
|
|
627
|
+
- `full_process`:Windows `CODE_ONLY` 始终先停在产品开通前,环境恢复并复检取得唯一 `READY` 后才按原完成条件衔接。其他环境下,全部适用步骤通过后进入 `references/onboarding/flow.md`;仅沙箱待配置,或沙箱 `READY` 且仅剩非阻塞人工待验证项时,以“部分通过”继续并保留未完成事实。其他代码、安全或依据缺口停在 Integration,不提前执行 Onboarding。
|
|
619
628
|
- 未通过时不得宣称完成;沙箱状态不得被产品开通结果覆盖。
|
|
620
629
|
<!-- ALIPAY_AIPAY_FLOW:INTEGRATION_CHECKLIST:END -->
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
|
|
27
27
|
先区分两种验收层级,再判断是否通过:
|
|
28
28
|
|
|
29
|
-
-
|
|
30
|
-
-
|
|
29
|
+
- **本地开发 / 沙箱集成**:通知处理代码和主动查询仍须实现;仅尚未部署公网 HTTPS `notify_url` 属于上线前提醒,不计入本轮失败或人工待验证项。通知代码或查询链路的实际缺陷仍须修复。
|
|
30
|
+
- **真实生产上线**:可使用异步通知加补偿查询,或省略 `notify_url` 并由服务端可靠主动查单。使用通知时验证公网 HTTPS 地址、验签、关键字段、幂等和 `success`;不使用时验证后台查单、响应验签、订单/金额/状态/归属校验、幂等交付、重试及未决订单恢复,用户关闭页面后也能继续。所选链路未验证时不得判定生产就绪。
|
|
31
31
|
|
|
32
32
|
| 校验项 | 校验要求 | 说明 |
|
|
33
33
|
|----------|----------|----------|
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
| 响应值 | 商户侧处理成功后需返回字符串 `success` | 否则支付宝会重试通知 |
|
|
39
39
|
| URL 格式 | notify_url 不能包含空格和 HTML 标签 | 否则可能导致通知失败 |
|
|
40
40
|
| 重定向 | notify_url 不能重定向 | 重定向会导致支付宝收不到 success |
|
|
41
|
-
| 外网可访问 |
|
|
41
|
+
| 外网可访问 | 使用通知时,notify_url 必须可公网访问;不使用通知时本项不适用 | 使用通知时确保支付宝服务器可访问;仅尚未部署公网地址保留上线前提醒,不误记为本轮人工待验证 |
|
|
42
42
|
|
|
43
43
|
<!-- ALIPAY_AIPAY_CHECKLIST_PRODUCTS:aipay,webpay,apppay -->
|
|
44
44
|
## 三、适用接口覆盖校验
|
|
@@ -80,11 +80,11 @@
|
|
|
80
80
|
| Payment-Proof 验证 | 收到 `Payment-Proof` 后必须调用 `alipay.aipay.agent.payment.verify` | 验证成功只代表支付宝凭证有效,不代表本地订单已完成校验 |
|
|
81
81
|
| 本地订单匹配 | 验付成功后必须查询本地订单并校验状态 | 防止凭证有效但商户订单不存在、过期或状态异常 |
|
|
82
82
|
| 资源防串 | 必须校验本地订单的 `resource_id` 与验付结果/请求资源一致 | 防止用户通过篡改资源标识获取其他资源 |
|
|
83
|
-
| 金额一致性 |
|
|
83
|
+
| 金额一致性 | 商家服务端必须校验本地持久化订单金额与 `Payment-Needed` 账单金额和服务定价一致;验付返回非空金额时必须与本地订单匹配。仅精确沙箱模式(沙箱 SDK 网关且 `serviceId=api_mock_service_id`)缺金额时允许使用本地订单金额继续判断;生产缺金额必须拒绝交付 | 按本地接口契约核对商家代码;自动联调脚本不直接比较验付金额与本地订单金额,通过结果不能替代此项审查 |
|
|
84
84
|
| 幂等履约 | 同一订单重复携带 `Payment-Proof` 时不得重复发放资源 | 应返回历史履约结果或可重试确认结果 |
|
|
85
85
|
| 履约确认 | 资源生成后必须调用 `alipay.aipay.agent.fulfillment.confirm` | 确认成功后再标记订单 `FULFILLED` 并返回成功交付 |
|
|
86
86
|
| 自动联调成功证据 | 必须同时具备 HTTP 200、非空 `resource_id` / `resourceId`、非空 `content`、无明确业务失败,以及当前五语言示例有效的 `Payment-Validation` | 204、空体、空对象、`VERIFY_FAILED`、履约失败或异常响应头均不得判为通过 |
|
|
87
|
-
| 敏感过程产物 | 单次联调仅使用本次临时目录,Unix/macOS/Linux 的目录/文件权限不得宽于 `0700/0600`;Windows 检查实际可写和非符号链接,不以 ACL 白名单为完成条件;命令结束时立即清理 | 禁止打印 Payment-Proof 或 Payment-Validation
|
|
87
|
+
| 敏感过程产物 | 单次联调仅使用本次临时目录,Unix/macOS/Linux 的目录/文件权限不得宽于 `0700/0600`;Windows 检查实际可写和非符号链接,不以 ACL 白名单为完成条件;命令结束时立即清理 | 禁止打印 Payment-Proof 或 Payment-Validation 原始值;失败或中断后按 flow 的执行 guard 判定,不得无变化重跑或自动重放结果未知的请求 |
|
|
88
88
|
| 沙箱 serviceId | 沙箱联调的 `serviceId` 固定为 `api_mock_service_id` | 不向用户索要正式 `serviceId`,不使用其他占位符 |
|
|
89
89
|
| 沙箱空字段边界 | 沙箱联调中字段为空可用于排查定位,生产环境关键字段为空必须按异常处理 | 不得把沙箱容错逻辑直接迁移成生产跳过校验 |
|
|
90
90
|
| 生产实现完整性 | 订单持久化、本地订单匹配、金额一致性、资源防串、幂等履约、待确认状态和确认失败重试均已实际实现 | 任一关键控制仍为 TODO、注释、内存演示或伪代码时只能判定沙箱演示可测试,不得判定生产就绪 |
|
|
@@ -107,6 +107,8 @@
|
|
|
107
107
|
<!-- ALIPAY_AIPAY_CHECKLIST_PRODUCTS:aipay,webpay,apppay -->
|
|
108
108
|
## 七、上线前校验
|
|
109
109
|
|
|
110
|
+
本节区分当前代码开发验收与生产上线验收。沙箱代码开发阶段检查生产配置加载边界、沙箱/生产隔离及适用安全控制;尚未开通产品、尚未取得生产 APPID/密钥/真实 serviceId 或尚未切换生产网关,记录为上线前待办,相应生产实值检查记为“当前阶段不适用”,不计入 `failedItems`、`manualItems` 或 `blockingDefectState`,不单独阻止继续 Onboarding。沿用既有上线提醒交付这些要求,不索取生产私钥、不提前切换配置。代码缺陷、密钥泄露、环境混用等安全问题仍须修复;已有生产配置也须检查其适用保护。实际生产上线验收必须满足本节全部适用项,否则不得宣称生产就绪。
|
|
111
|
+
|
|
110
112
|
| 校验项 | 校验要求 | 说明 |
|
|
111
113
|
|----------|----------|----------|
|
|
112
114
|
| 网关地址切换 | 五语言 A2M 示例默认沙箱网关为 `https://openapi-sandbox.dl.alipaydev.com/gateway.do`;上线时显式切换为 `https://openapi.alipay.com/gateway.do` | 禁止把生产网关复制进沙箱运行配置 |
|
|
@@ -133,7 +135,7 @@
|
|
|
133
135
|
> - ➖ 不适用:当前集成场景不涉及此项
|
|
134
136
|
> - 🟡 人工待验证:当前环境无法自动取得充分证据
|
|
135
137
|
|
|
136
|
-
|
|
138
|
+
首次按当前证据覆盖全部适用项;本轮可修复时只在 `../flow.md` 步骤 8 的有限预算内修复、定向复检,不渲染中间结果。严禁循环检测;局部修复后只检查修复项及直接受影响项,未受影响且证据仍有效的项目不重复执行,严禁重新运行全量测试。定向复检仍失败或没有新进展时按实际未解决项收口,不以刷新快照或 scope 重置预算。项目稳定后按 `../flow.md` 执行唯一 `checklist-result`,由 runner 在同一次最终调用中校验 scope 并对同一项目快照执行固定 implementation audit。审计失败是阻断缺口,不能被 Agent 自报结论覆盖;可修复时先返回结构化 findings,项目变化后重新加载 checklist 阶段取得新 scope。
|
|
137
139
|
|
|
138
140
|
最终 action、完整参数和失败转移只以 `../flow.md` 步骤 8 为准,本模块不复制命令。runner 只接受最终一轮实际证据:Unix/macOS/Linux 或 Windows READY 的 `sandboxConfigState` 复用脚本终态,Windows LEGACY/CODE_ONLY 复用步骤 1/3 的 `READY|VERIFY_PENDING`;待配置时不重跑或读取配置,并把配置及依赖动作列为未完成。
|
|
139
141
|
|
|
@@ -142,13 +144,15 @@
|
|
|
142
144
|
| 产品 | checklist 内部校验事实 | 实际待办来源 |
|
|
143
145
|
|---|---|---|
|
|
144
146
|
| `AIPAY` | 通过必须绑定本轮 AI 按量付费服务端联调成功;只有完整 402、沙箱收银、Payment-Proof 重试和资源交付证据才能称沙箱测试通过 | 失败/部分通过项、人工待验证项、联调恢复动作 |
|
|
145
|
-
| `WEBPAY` |
|
|
147
|
+
| `WEBPAY` | 未提供浏览器付款入口和完整指引时不得通过;仅未配置 `notify_url` 不判为失败;生产就绪需按所选通知或可靠主动查单链路验证 | 失败/部分通过项、实际人工待验证项;可选付款体验不计入缺口 |
|
|
146
148
|
| `APPPAY` | 当前没有沙箱付款验证结论,不据此生成通过或失败,也不临场补充沙箱付款步骤 | 失败/部分通过项、人工待验证项 |
|
|
147
149
|
|
|
148
|
-
`failedItems`、`manualItems`
|
|
150
|
+
`failedItems`、`manualItems` 必须包含确定下一步,无对应项时传“无”。生成结果前完成分类:普通上线提醒(包括仅未部署公网 `notify_url`)和可选沙箱付款体验不得混入这两个字段或影响完成判定的待办;它们沿用已有上线说明/付款指引。真实 UI、已选通知链路的证据缺口才进入 `manualItems`,并在最终上线关键点逐项可见;已确认的实现缺陷进入 `failedItems`。不固定增加待验证事项,不在 summary 末端隐藏实际缺口;可选沙箱配置区块有无不参与完成判定。`overallResult=通过` 要求两者为“无”、`sandboxConfigState=READY`、`blockingDefectState=NONE`;“部分通过”至少有一类缺口;“未通过”必须列出失败项。`blockingDefectState` 只表示沙箱配置及其直接依赖以外的代码、安全或必要依据缺口;单纯 UI、浏览器或已选通知链路实际联调待验证只进入 `manualItems`;仅未部署公网地址不计入其中。`full_process` 仅在沙箱待配置且无其他阻断,或 `READY` 且只剩非阻塞人工项时继续 Onboarding。
|
|
149
151
|
|
|
150
152
|
内部保留适用项依据;明细按实际证据输出,不维护第二份模板。同一次代码开发只渲染一次;renderer stdout 是默认收口的唯一对客正文,前后不得追加摘要、风险或待办。
|
|
151
153
|
|
|
154
|
+
Windows `CODE_ONLY` 的环境门禁优先于上述 `full_process` 衔接条件:代码校验结果和待办仍按实际证据保留,但本轮停止在代码开发,不能进入 Onboarding。后续提示由 renderer 使用消息目录的环境恢复提示,不承诺立即继续产品开通;恢复工具并取得环境 `READY` 后才按原条件衔接。沙箱配置 `READY` 不能代替环境 `READY`。
|
|
155
|
+
|
|
152
156
|
---
|
|
153
157
|
|
|
154
158
|
> 📖 本文档内容整理自支付宝开放平台官方文档,如有更新请以官方文档为准。
|
|
@@ -15,7 +15,7 @@ var request = new AlipayTradePagePayRequest();
|
|
|
15
15
|
var notifyUrl = Environment.GetEnvironmentVariable("ALIPAY_NOTIFY_URL");
|
|
16
16
|
if (!string.IsNullOrWhiteSpace(notifyUrl))
|
|
17
17
|
{
|
|
18
|
-
request.SetNotifyUrl(notifyUrl.Trim()); //
|
|
18
|
+
request.SetNotifyUrl(notifyUrl.Trim()); // 使用异步通知时传入;未配置时由服务端可靠主动查单。没有公网 HTTPS notify_url 时不要传 null、空字符串或占位 URL
|
|
19
19
|
}
|
|
20
20
|
request.SetReturnUrl("https://your-domain.com/return"); // 默认传入并替换为已验证结果页;仅用户明确关闭同步回跳时省略
|
|
21
21
|
|
|
@@ -23,7 +23,7 @@ namespace SdkDemoTest
|
|
|
23
23
|
var notifyUrl = Environment.GetEnvironmentVariable("ALIPAY_NOTIFY_URL");
|
|
24
24
|
if (!string.IsNullOrWhiteSpace(notifyUrl))
|
|
25
25
|
{
|
|
26
|
-
request.SetNotifyUrl(notifyUrl.Trim()); //
|
|
26
|
+
request.SetNotifyUrl(notifyUrl.Trim()); // 使用异步通知时传入;未配置时由服务端可靠主动查单。没有公网 HTTPS notify_url 时不要传 null、空字符串或占位 URL
|
|
27
27
|
}
|
|
28
28
|
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
|
|
29
29
|
|
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
以下代码展示严格验付和幂等履约的完整控制流。生成项目代码时,请按当前项目结构拆分并绑定真实持久化实现。
|
|
4
4
|
|
|
5
|
+
金额校验由商家服务端执行:验付返回非空金额时必须与本地持久化订单匹配;仅 SDK 网关严格为 `https://openapi-sandbox.dl.alipaydev.com/gateway.do` 且 `serviceId=api_mock_service_id` 的精确沙箱模式下,验付缺少金额才允许使用本地订单金额继续判断。生产缺少金额必须拒绝交付。自动沙箱联调脚本不直接比较这两个金额,脚本通过不能代替商家代码校验。
|
|
6
|
+
|
|
5
7
|
```csharp
|
|
6
8
|
/*
|
|
7
9
|
* A2M 智能收产品接入示例 - C# 版本
|
|
8
10
|
*
|
|
9
11
|
* 本示例展示 A2M 核心协议、严格验付和幂等履约流程。
|
|
10
12
|
* 必须通过 ConfigureOrderRepository 绑定项目真实持久化实现;端口未绑定时明确失败,
|
|
11
|
-
*
|
|
13
|
+
* 不使用内存订单或固定资源;生产环境不使用验付字段缺失兜底。
|
|
12
14
|
*
|
|
13
15
|
* 本文件演示 A2M 核心协议调用流程:
|
|
14
16
|
* 1. 返回 402 Payment-Needed Header
|
|
@@ -22,7 +22,7 @@ public class AlipayTradePagePay {
|
|
|
22
22
|
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
|
|
23
23
|
String notifyUrl = System.getenv("ALIPAY_NOTIFY_URL");
|
|
24
24
|
if (notifyUrl != null && !notifyUrl.isBlank()) {
|
|
25
|
-
request.setNotifyUrl(notifyUrl.trim()); //
|
|
25
|
+
request.setNotifyUrl(notifyUrl.trim()); // 使用异步通知时传入;未配置时由服务端可靠主动查单。没有公网 HTTPS notifyUrl 时不要调用 setNotifyUrl(null/空字符串/占位 URL)
|
|
26
26
|
}
|
|
27
27
|
request.setReturnUrl("https://your-domain.com/return"); // 默认传入并替换为已验证结果页;仅用户明确关闭同步回跳时省略
|
|
28
28
|
|
|
@@ -31,7 +31,7 @@ public class AlipayTradeAppPay {
|
|
|
31
31
|
AlipayTradeAppPayRequest request = new AlipayTradeAppPayRequest();
|
|
32
32
|
String notifyUrl = System.getenv("ALIPAY_NOTIFY_URL");
|
|
33
33
|
if (notifyUrl != null && !notifyUrl.isBlank()) {
|
|
34
|
-
request.setNotifyUrl(notifyUrl.trim()); //
|
|
34
|
+
request.setNotifyUrl(notifyUrl.trim()); // 使用异步通知时传入;未配置时由服务端可靠主动查单。没有公网 HTTPS notifyUrl 时不要调用 setNotifyUrl(null/空字符串/占位 URL)
|
|
35
35
|
}
|
|
36
36
|
AlipayTradeAppPayModel model = new AlipayTradeAppPayModel();
|
|
37
37
|
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
以下代码展示严格验付和幂等履约的完整控制流。生成项目代码时,请按当前项目结构拆分并绑定真实持久化实现。
|
|
4
4
|
|
|
5
|
+
金额校验由商家服务端执行:验付返回非空金额时必须与本地持久化订单匹配;仅 SDK 网关严格为 `https://openapi-sandbox.dl.alipaydev.com/gateway.do` 且 `serviceId=api_mock_service_id` 的精确沙箱模式下,验付缺少金额才允许使用本地订单金额继续判断。生产缺少金额必须拒绝交付。自动沙箱联调脚本不直接比较这两个金额,脚本通过不能代替商家代码校验。
|
|
6
|
+
|
|
5
7
|
```java
|
|
6
8
|
/*
|
|
7
9
|
* Copyright (C) 2015-2026 Ant Group
|
|
@@ -21,7 +23,7 @@
|
|
|
21
23
|
/*
|
|
22
24
|
* 本示例展示 A2M 核心协议、严格验付和幂等履约流程。
|
|
23
25
|
* 必须通过 OrderRepository 绑定项目真实持久化实现;端口未绑定时明确失败,
|
|
24
|
-
*
|
|
26
|
+
* 不使用内存订单或固定资源;生产环境不使用验付字段缺失兜底。
|
|
25
27
|
*/
|
|
26
28
|
package com.alipay.aipayweb.demo;
|
|
27
29
|
|
|
@@ -17,7 +17,7 @@ const alipaySdk = new AlipaySdk({
|
|
|
17
17
|
|
|
18
18
|
// ⚠️ 网站支付必须使用 pageExec() 方法,不能使用 exec()
|
|
19
19
|
// ⚠️ pageExec() 第二个参数必须传 'POST'
|
|
20
|
-
// ⚠️ notifyUrl
|
|
20
|
+
// ⚠️ notifyUrl 可选;生产也可省略,但服务端必须可靠主动查单,仍需实现通知处理代码
|
|
21
21
|
// ⚠️ 本地没有公网 HTTPS notifyUrl 时,直接省略 notifyUrl,不要向 SDK 传 undefined、空字符串或占位 URL
|
|
22
22
|
// ⚠️ returnUrl 默认传入,仅在用户明确关闭同步回跳时省略
|
|
23
23
|
const notifyUrl = (process.env.ALIPAY_NOTIFY_URL || "").trim();
|
|
@@ -13,7 +13,7 @@ const alipaySdk = new AlipaySdk({
|
|
|
13
13
|
appAuthToken: "<-- 请填写应用授权令牌 -->",
|
|
14
14
|
});
|
|
15
15
|
|
|
16
|
-
//
|
|
16
|
+
// 使用异步通知时传入 notifyUrl;生产也可省略并由服务端可靠主动查单。没有公网 HTTPS notifyUrl 时直接省略,不要向 SDK 传 undefined、空字符串或占位 URL。
|
|
17
17
|
const notifyUrl = (process.env.ALIPAY_NOTIFY_URL || "").trim();
|
|
18
18
|
const requestOptions = {
|
|
19
19
|
bizContent: {
|
|
@@ -2,13 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
以下代码展示严格验付和幂等履约的完整控制流。生成项目代码时,请按当前项目结构拆分并绑定真实持久化实现。
|
|
4
4
|
|
|
5
|
+
金额校验由商家服务端执行:验付返回非空金额时必须与本地持久化订单匹配;仅 SDK 网关严格为 `https://openapi-sandbox.dl.alipaydev.com/gateway.do` 且 `serviceId=api_mock_service_id` 的精确沙箱模式下,验付缺少金额才允许使用本地订单金额继续判断。生产缺少金额必须拒绝交付。自动沙箱联调脚本不直接比较这两个金额,脚本通过不能代替商家代码校验。
|
|
6
|
+
|
|
5
7
|
```javascript
|
|
6
8
|
/**
|
|
7
9
|
* A2M 智能收产品接入示例 - Node.js 版本
|
|
8
10
|
*
|
|
9
11
|
* 本示例展示 A2M 核心协议、严格验付和幂等履约流程。
|
|
10
12
|
* 必须通过 configureOrderRepository 绑定项目真实持久化实现;
|
|
11
|
-
*
|
|
13
|
+
* 端口未绑定时明确失败,不使用内存订单或固定资源;生产环境不使用验付字段缺失兜底。
|
|
12
14
|
*
|
|
13
15
|
* 本文件演示 A2M 核心协议调用流程:
|
|
14
16
|
* 1. 返回 402 Payment-Needed Header
|
|
@@ -161,6 +163,7 @@ function base64UrlDecode(str) {
|
|
|
161
163
|
}
|
|
162
164
|
|
|
163
165
|
function normalizeAmount(value) {
|
|
166
|
+
if (typeof value !== 'string' && typeof value !== 'number') return null;
|
|
164
167
|
const match = /^(\d+)(?:\.(\d{1,2}))?$/.exec(String(value ?? '').trim());
|
|
165
168
|
if (!match) return null;
|
|
166
169
|
return `${BigInt(match[1]).toString()}.${(match[2] || '').padEnd(2, '0')}`;
|
|
@@ -345,7 +348,8 @@ async function verifyPaymentAndDeliverResource(req, res, paymentProof) {
|
|
|
345
348
|
const order = verifyOutTradeNo ? await repository.findByOutTradeNo(verifyOutTradeNo) : null;
|
|
346
349
|
const sandboxMode = isExactSandboxMode();
|
|
347
350
|
const verifyTradeNo = returnedTradeNo || (sandboxMode ? tradeNo : '');
|
|
348
|
-
const
|
|
351
|
+
const amountMissing = returnedAmount === undefined || returnedAmount === null || returnedAmount === '';
|
|
352
|
+
const verifyAmount = amountMissing && sandboxMode && order ? order.amount : returnedAmount;
|
|
349
353
|
const resourceIdVerified = returnedResourceId || (sandboxMode && order ? order.resourceId : '');
|
|
350
354
|
|
|
351
355
|
if (process.env.A2M_DEBUG === 'true') {
|
|
@@ -22,7 +22,7 @@ $aop->signType = 'RSA2';
|
|
|
22
22
|
$request = new AlipayTradePagePayRequest();
|
|
23
23
|
$notifyUrl = trim(getenv('ALIPAY_NOTIFY_URL') ?: '');
|
|
24
24
|
if ($notifyUrl !== '') {
|
|
25
|
-
$request->setNotifyUrl($notifyUrl); //
|
|
25
|
+
$request->setNotifyUrl($notifyUrl); // 使用异步通知时传入;未配置时由服务端可靠主动查单。没有公网 HTTPS notify_url 时不要传 null、空字符串或占位 URL
|
|
26
26
|
}
|
|
27
27
|
$request->setReturnUrl('https://your-domain.com/return'); // 默认传入并替换为已验证结果页;仅用户明确关闭同步回跳时省略
|
|
28
28
|
|
|
@@ -16,7 +16,7 @@ $alipayClient = new AopClient(getAlipayConfig());
|
|
|
16
16
|
$request = new AlipayTradeAppPayRequest();
|
|
17
17
|
$notifyUrl = trim(getenv('ALIPAY_NOTIFY_URL') ?: '');
|
|
18
18
|
if ($notifyUrl !== '') {
|
|
19
|
-
$request->setNotifyUrl($notifyUrl); //
|
|
19
|
+
$request->setNotifyUrl($notifyUrl); // 使用异步通知时传入;未配置时由服务端可靠主动查单。没有公网 HTTPS notify_url 时不要传 null、空字符串或占位 URL
|
|
20
20
|
}
|
|
21
21
|
$model = array();
|
|
22
22
|
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
以下代码展示严格验付和幂等履约的完整控制流。生成项目代码时,请按当前项目结构拆分并绑定真实持久化实现。
|
|
4
4
|
|
|
5
|
+
金额校验由商家服务端执行:验付返回非空金额时必须与本地持久化订单匹配;仅 SDK 网关严格为 `https://openapi-sandbox.dl.alipaydev.com/gateway.do` 且 `serviceId=api_mock_service_id` 的精确沙箱模式下,验付缺少金额才允许使用本地订单金额继续判断。生产缺少金额必须拒绝交付。自动沙箱联调脚本不直接比较这两个金额,脚本通过不能代替商家代码校验。
|
|
6
|
+
|
|
5
7
|
```php
|
|
6
8
|
<?php
|
|
7
9
|
/**
|
|
@@ -9,7 +11,7 @@
|
|
|
9
11
|
*
|
|
10
12
|
* 本示例展示 A2M 核心协议、严格验付和幂等履约流程。
|
|
11
13
|
* 必须通过 configureOrderRepository 绑定项目真实持久化实现;
|
|
12
|
-
*
|
|
14
|
+
* 端口未绑定时明确失败,不使用内存订单或固定资源;生产环境不使用验付字段缺失兜底。
|
|
13
15
|
* 订单快照将支付状态映射为 PENDING_PAYMENT/PAID,
|
|
14
16
|
* 将履约状态映射为 UNFULFILLED/PENDING_CONFIRM/FULFILLED。
|
|
15
17
|
*
|
|
@@ -23,7 +23,7 @@ client = DefaultAlipayClient(alipay_client_config=config)
|
|
|
23
23
|
request = AlipayTradePagePayRequest()
|
|
24
24
|
notify_url = os.getenv("ALIPAY_NOTIFY_URL", "").strip()
|
|
25
25
|
if notify_url:
|
|
26
|
-
request.notify_url = notify_url #
|
|
26
|
+
request.notify_url = notify_url # 使用异步通知时传入;未配置时由服务端可靠主动查单。没有公网 HTTPS notify_url 时不要传 None、空字符串或占位 URL
|
|
27
27
|
request.return_url = "https://your-domain.com/return" # 默认传入并替换为已验证结果页;仅用户明确关闭同步回跳时省略
|
|
28
28
|
|
|
29
29
|
model = AlipayTradePagePayModel()
|
|
@@ -24,7 +24,7 @@ client = DefaultAlipayClient(alipay_client_config=config)
|
|
|
24
24
|
request = AlipayTradeAppPayRequest()
|
|
25
25
|
notify_url = os.getenv("ALIPAY_NOTIFY_URL", "").strip()
|
|
26
26
|
if notify_url:
|
|
27
|
-
request.notify_url = notify_url #
|
|
27
|
+
request.notify_url = notify_url # 使用异步通知时传入;未配置时由服务端可靠主动查单。没有公网 HTTPS notify_url 时不要传 None、空字符串或占位 URL
|
|
28
28
|
model = AlipayTradeAppPayModel()
|
|
29
29
|
|
|
30
30
|
model.out_trade_no = "MERCHANT_ORDER_NO_PLACEHOLDER"
|
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
以下代码展示严格验付和幂等履约的完整控制流。生成项目代码时,请按当前项目结构拆分并绑定真实持久化实现。
|
|
4
4
|
|
|
5
|
+
金额校验由商家服务端执行:验付返回非空金额时必须与本地持久化订单匹配;仅 SDK 网关严格为 `https://openapi-sandbox.dl.alipaydev.com/gateway.do` 且 `serviceId=api_mock_service_id` 的精确沙箱模式下,验付缺少金额才允许使用本地订单金额继续判断。生产缺少金额必须拒绝交付。自动沙箱联调脚本不直接比较这两个金额,脚本通过不能代替商家代码校验。
|
|
6
|
+
|
|
5
7
|
```python
|
|
6
8
|
#!/usr/bin/env python3
|
|
7
9
|
# -*- coding: utf-8 -*-
|
|
@@ -10,7 +12,7 @@ A2M 智能收产品接入示例 - Python 版本
|
|
|
10
12
|
|
|
11
13
|
本示例展示 A2M 核心协议、严格验付和幂等履约流程。
|
|
12
14
|
必须通过 configure_order_repository 绑定项目真实持久化实现;
|
|
13
|
-
|
|
15
|
+
端口未绑定时明确失败,不使用内存订单或固定资源;生产环境不使用验付字段缺失兜底。
|
|
14
16
|
|
|
15
17
|
本文件演示 A2M 核心协议调用流程:
|
|
16
18
|
1. 返回 402 Payment-Needed Header
|
|
@@ -167,7 +169,9 @@ def base64url_decode(data):
|
|
|
167
169
|
|
|
168
170
|
|
|
169
171
|
def normalize_amount(value):
|
|
170
|
-
|
|
172
|
+
if isinstance(value, bool) or not isinstance(value, (str, int, float, Decimal)):
|
|
173
|
+
return None
|
|
174
|
+
text = str(value).strip()
|
|
171
175
|
if not re.fullmatch(r'\d+(?:\.\d{1,2})?', text):
|
|
172
176
|
return None
|
|
173
177
|
return f'{Decimal(text):.2f}'
|
|
@@ -381,7 +385,8 @@ def verify_payment_and_deliver_resource(payment_proof):
|
|
|
381
385
|
order = repository.find_by_out_trade_no(verify_out_trade_no) if verify_out_trade_no else None
|
|
382
386
|
sandbox_mode = is_exact_sandbox_mode()
|
|
383
387
|
verify_trade_no = returned_trade_no or (trade_no if sandbox_mode else '')
|
|
384
|
-
|
|
388
|
+
amount_missing = returned_amount is None or returned_amount == ''
|
|
389
|
+
verify_amount = order.get('amount') if amount_missing and sandbox_mode and order else returned_amount
|
|
385
390
|
resource_id_verified = returned_resource_id or (order.get('resource_id') if sandbox_mode and order else '')
|
|
386
391
|
|
|
387
392
|
print(f"支付凭证验证成功:tradeNo={verify_trade_no}, outTradeNo={verify_out_trade_no}")
|
package/skill-pre/references/integration/modules/interface-contract/aipay-interface-contract.md
CHANGED
|
@@ -39,7 +39,7 @@ AI 按量付费只实现 HTTP 402、`Payment-Needed`、`Payment-Proof`、`alipay
|
|
|
39
39
|
验付成功不能只看 SDK 调用成功,还必须同时校验:
|
|
40
40
|
|
|
41
41
|
- `active=true`。
|
|
42
|
-
-
|
|
42
|
+
- 返回非空 `amount` 时,必须与本地持久化订单金额一致;金额不匹配或格式非法时拒绝交付。仅在精确沙箱模式(SDK 网关严格为 `https://openapi-sandbox.dl.alipaydev.com/gateway.do` 且 `serviceId=api_mock_service_id`)下,验付响应缺少金额时允许使用本地持久化订单金额继续判断;生产环境缺少金额必须拒绝交付,不能使用该回退。
|
|
43
43
|
- 返回 `out_trade_no` 等于本地订单号。
|
|
44
44
|
- 返回 `resource_id` 等于当前请求资源。
|
|
45
45
|
- `trade_no` 未被重复履约。
|
|
@@ -47,6 +47,8 @@ AI 按量付费只实现 HTTP 402、`Payment-Needed`、`Payment-Proof`、`alipay
|
|
|
47
47
|
|
|
48
48
|
任一校验失败时返回 402,让智能体重新支付;不得返回资源。
|
|
49
49
|
|
|
50
|
+
上述金额判断由商家服务端实现。自动沙箱联调脚本从商家返回的 `Payment-Needed` 读取并传递金额,不直接比较验付响应金额与本地订单金额;脚本通过不能替代商家金额校验的代码审查。
|
|
51
|
+
|
|
50
52
|
## 履约确认
|
|
51
53
|
|
|
52
54
|
资源生成后调用 `alipay.aipay.agent.fulfillment.confirm`,业务入参只有 `trade_no`。必须在履约确认成功后再把订单标记为最终完成。确认失败时允许同一 `Payment-Proof` 重试确认,避免资源已生成但平台未记录履约。
|
package/skill-pre/references/integration/modules/interface-contract/apppay-interface-contract.md
CHANGED
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
sourceUrl:
|
|
6
6
|
|
|
7
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/app-pay-integration-guide-new.md>
|
|
8
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/alipay-trade-app-pay.md>
|
|
9
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/sync-result.md>
|
|
7
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/app-pay-integration-guide-new.md>
|
|
8
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/alipay-trade-app-pay.md>
|
|
9
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/sync-result.md>
|
|
10
10
|
|
|
11
11
|
## 默认范围
|
|
12
12
|
|
|
@@ -27,7 +27,7 @@ AI 移动应用收款必须覆盖:`alipay.trade.app.pay`、交易查询、退
|
|
|
27
27
|
| 字段 | 要求 |
|
|
28
28
|
| --- | --- |
|
|
29
29
|
| `method` | 固定 `alipay.trade.app.pay` |
|
|
30
|
-
| `notify_url` |
|
|
30
|
+
| `notify_url` | 可选,生产也可省略;使用通知时传入商家公网 HTTPS 地址,不使用时由服务端可靠主动查单;通知处理代码仍须实现 |
|
|
31
31
|
|
|
32
32
|
业务参数:
|
|
33
33
|
|