@alipay/alipay-aipay 1.8.0 → 1.8.1
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 +2 -0
- package/skill/references/integration/modules/checklist.md +4 -2
- 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/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/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/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/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 +3 -3
- package/skill/references/integration/modules/interface-contract/common-trade-contract.md +8 -8
- package/skill/references/integration/modules/interface-contract/notify-url-contract.md +7 -7
- package/skill/references/integration/modules/interface-contract/webpay-interface-contract.md +2 -2
- package/skill/references/integration/modules/sandbox/a2m-sandbox-test.md +4 -4
- package/skill/references/normal/conversation-telemetry.md +1 -1
- package/skill-pre/VERSION +1 -1
- package/skill-pre/references/integration/flow.md +7 -3
- package/skill-pre/references/integration/modules/checklist.md +4 -2
- 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/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/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/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/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 +3 -3
- 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 +7 -7
- package/skill-pre/references/integration/modules/interface-contract/webpay-interface-contract.md +2 -2
- package/skill-pre/references/integration/modules/sandbox/a2m-sandbox-test.md +4 -4
- package/skill-pre/references/integration/modules/sandbox/sandbox-setup-guide.md +2 -2
- package/skill-pre/references/normal/full-process-routing.md +2 -2
- package/skill-pre/references/normal/windows-environment.md +4 -4
- package/skill-pre/references/runtime-entry.md +2 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@alipay/alipay-aipay",
|
|
3
|
-
"version": "1.8.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "支付宝 AI 付接入 Skill 安装包 - 优先安装 Agent Skill,并在 macOS/Linux 后台准备用户级 CLI 工具",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"typescript": "^5.3.3"
|
|
56
56
|
},
|
|
57
57
|
"alipayAipayChannels": {
|
|
58
|
-
"stable": "1.7.
|
|
59
|
-
"pre": "1.
|
|
58
|
+
"stable": "1.7.7",
|
|
59
|
+
"pre": "1.8.0-pre"
|
|
60
60
|
}
|
|
61
61
|
}
|
package/skill/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.7.
|
|
1
|
+
1.7.7
|
|
@@ -541,6 +541,8 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message saf
|
|
|
541
541
|
|
|
542
542
|
> 详细校验清单已附在当前阶段 bundle 的“当前产品适用校验清单”。
|
|
543
543
|
|
|
544
|
+
**验收阶段边界**:本轮代码开发按沙箱集成验收;checklist 第七节中尚未开通产品或尚未取得、切换生产实值的检查,记为当前阶段不适用并保留上线前待办,不计入失败项或人工待验证项,不单独阻止 Onboarding。仍须检查生产配置加载边界、环境隔离和所有适用代码/安全控制;已发现的实现缺陷、泄露或环境混用仍是阻断缺口。不得为完成本轮检查索取生产私钥、提前改用生产配置或宣称生产就绪。
|
|
545
|
+
|
|
544
546
|
**校验完整性要求**:内部必须覆盖当前 bundle 中适用于目标产品的密钥与安全、异步通知、接口覆盖、支付结果处理、按量付费专项、退款、上线前和结果输出章节,不得只检查上方三个摘要项。通过时默认对客只输出通过结论和下一步;部分通过或未通过时只输出实际未完成项、人工待验证项和下一步。步骤 5/6 已展示的沙箱配置、联调或付款体验结论不在 checklist 结果中重复。通过项与不适用项无需逐行展开,用户要求明细时再输出完整逐项结果。精简输出不得导致任何适用校验被跳过。
|
|
545
547
|
|
|
546
548
|
先汇总 checklist 证据;本轮可修复时先修复、重检,不渲染中间结果。项目快照变化会使旧 `CHECKLIST_SCOPE_RECEIPT` 失效,必须重新加载本阶段并重跑受影响检查。
|
|
@@ -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
|
-
| 敏感过程产物 | 单次联调的临时目录/文件权限不得宽于 `0700/0600`,命令结束时立即清理 | 禁止打印 Payment-Proof 或 Payment-Validation
|
|
87
|
+
| 敏感过程产物 | 单次联调的临时目录/文件权限不得宽于 `0700/0600`,命令结束时立即清理 | 禁止打印 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` | 禁止把生产网关复制进沙箱运行配置 |
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -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') {
|
|
@@ -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
|
*
|
|
@@ -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}")
|
|
@@ -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/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
|
|
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
sourceUrl:
|
|
6
6
|
|
|
7
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-query.md>
|
|
8
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-refund.md>
|
|
9
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-fastpay-refund-query.md>
|
|
10
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-close.md>
|
|
11
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/alipay-trade-query.md>
|
|
12
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/alipay-trade-refund.md>
|
|
13
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/alipay-trade-fastpay-refund-query.md>
|
|
14
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/alipay-trade-close.md>
|
|
7
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-query.md>
|
|
8
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-refund.md>
|
|
9
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-fastpay-refund-query.md>
|
|
10
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-close.md>
|
|
11
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/alipay-trade-query.md>
|
|
12
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/alipay-trade-refund.md>
|
|
13
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/alipay-trade-fastpay-refund-query.md>
|
|
14
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/alipay-trade-close.md>
|
|
15
15
|
|
|
16
16
|
网页应用付款和移动应用收款的查询、退款、退款查询、关闭文档当前内容一致,本 Skill 本地维护一份通用契约。
|
|
17
17
|
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
sourceUrl:
|
|
6
6
|
|
|
7
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/async-notify-verify.md>
|
|
8
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/async-notify-verify.md>
|
|
7
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/async-notify-verify.md>
|
|
8
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/async-notify-verify.md>
|
|
9
9
|
|
|
10
10
|
当前两份官方文档内容一致。运行时默认读取本文和当前语言 `1-通用接口/异步通知处理代码示例.md`;在线文档只在 fallback 条件下读取。
|
|
11
11
|
|
|
@@ -59,10 +59,10 @@ sourceUrl:
|
|
|
59
59
|
|
|
60
60
|
| 语言 | 示例 |
|
|
61
61
|
| --- | --- |
|
|
62
|
-
| Java |
|
|
63
|
-
| Python |
|
|
64
|
-
| Node.js |
|
|
65
|
-
| PHP |
|
|
66
|
-
| C# |
|
|
62
|
+
| Java | `../code-examples/java/1-通用接口/异步通知处理代码示例.md` |
|
|
63
|
+
| Python | `../code-examples/python/1-通用接口/异步通知处理代码示例.md` |
|
|
64
|
+
| Node.js | `../code-examples/nodejs/1-通用接口/异步通知处理代码示例.md` |
|
|
65
|
+
| PHP | `../code-examples/php/1-通用接口/异步通知处理代码示例.md` |
|
|
66
|
+
| C# | `../code-examples/csharp/1-通用接口/异步通知处理代码示例.md` |
|
|
67
67
|
|
|
68
68
|
Java 官方示例明确使用 `AlipaySignature.rsaCheckV1`。Node.js 示例给出 `checkNotifySignV2(params)` 的落地形态,但 Agent 落地前必须先读取目标项目 `alipay-sdk` 的 package.json 和类型定义,确认当前版本确实暴露该 API。Python、PHP、C# 示例使用项目内支付宝 SDK 验签适配器表示验签边界;适配器必须封装当前项目实际 SDK API,禁止临时手写不确定的 RSA 验签实现。
|
package/skill/references/integration/modules/interface-contract/webpay-interface-contract.md
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
sourceUrl:
|
|
6
6
|
|
|
7
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/ai-web-app-payment-integration-guide.md>
|
|
8
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-page-pay.md>
|
|
7
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/ai-web-app-payment-integration-guide.md>
|
|
8
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-page-pay.md>
|
|
9
9
|
|
|
10
10
|
## 默认范围
|
|
11
11
|
|
|
@@ -123,7 +123,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m run --url "$SERVICE
|
|
|
123
123
|
8. 生成浏览器付款链接
|
|
124
124
|
9. 使用同一过程产物构建 Payment-Proof 并重试原始服务
|
|
125
125
|
10. 仅在 HTTP 200、非空且可归属的资源、无明确业务失败,并且当前示例要求的 `Payment-Validation` 校验通过时输出服务端联调成功
|
|
126
|
-
11.
|
|
126
|
+
11. 命令结束前清理敏感过程产物,不保存跨轮恢复状态;失败或中断后必须重新按执行 guard 判定,不得直接重跑
|
|
127
127
|
|
|
128
128
|
**脚本输出**:
|
|
129
129
|
- Payment-Needed 获取结果(终端不输出原始值)
|
|
@@ -134,7 +134,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m run --url "$SERVICE
|
|
|
134
134
|
- Payment-Proof 重试后的服务响应与测试结论;`Payment-Validation` 原始值不在终端输出
|
|
135
135
|
|
|
136
136
|
**错误处理**:
|
|
137
|
-
- 沙箱化 Agent
|
|
137
|
+
- 沙箱化 Agent 环境执行本脚本时,首次执行即申请可联网权限;权限恢复只允许原样重试可确认尚未发出的命令。命令可能已发出时仍按执行 guard 处理,不以网络恢复为由重放结果未知的请求
|
|
138
138
|
- 如果未找到 `Payment-Needed` 响应头,确认服务端是否实现了 402 协议
|
|
139
139
|
- 如果收银接口返回 `PARAM_INVALID: protocol.sellerSignature不能为空`,回到预检步骤检查 `protocol.seller_signature` 是否为空、缺失或仍是占位符
|
|
140
140
|
- 如果 `pay_before` 相关参数报错,检查是否使用 ISO 8601 带时区格式
|
|
@@ -142,7 +142,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m run --url "$SERVICE
|
|
|
142
142
|
|
|
143
143
|
### 第三步:连续验证 Payment-Proof 重试
|
|
144
144
|
|
|
145
|
-
标准流程只使用第二步命令中的 `--auto-complete`。脚本生成付款链接后,在同一次进程内继续构建 Payment-Proof
|
|
145
|
+
标准流程只使用第二步命令中的 `--auto-complete`。脚本生成付款链接后,在同一次进程内继续构建 Payment-Proof、重试原始服务并输出结果;进程中断后按执行 guard 处理,结果未知时不得自动重新执行完整联调。
|
|
146
146
|
|
|
147
147
|
**脚本执行步骤**:
|
|
148
148
|
1. 读取过程产物目录中的 `state.json`
|
|
@@ -154,7 +154,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m run --url "$SERVICE
|
|
|
154
154
|
**Payment-Proof 处理约束**:
|
|
155
155
|
- `trade_no` 必须使用前面沙箱收银接口返回并写入 `state.json` 的交易号;不得改用商户侧 `out_trade_no` 或重新生成。
|
|
156
156
|
- `payment_proof`、`client_session` 和最终请求头由脚本按沙箱联调约定自动处理;Agent 不得手工拼接、改写或向用户展开其原始值和内部处理规则。
|
|
157
|
-
-
|
|
157
|
+
- 进程中断后,不得以过程产物缺失或已清理推定请求未发出;`UNKNOWN_PREVIOUS_EXECUTION` 固定记录结果未知,禁止自动重跑。明确业务失败、服务实现失败或脚本已输出失败结论时,禁止立即重复执行同一联调命令;输入未变化时按 `BLOCK_UNCHANGED` 停止;只有代码、配置、URL、方法或 POST body 实际变化且 guard 返回新 `RUN` 时,才允许重新发起完整联调,禁止复用旧过程产物。
|
|
158
158
|
|
|
159
159
|
Payment-Proof 参考结构:
|
|
160
160
|
|
|
@@ -100,4 +100,4 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" telemetry end-conversat
|
|
|
100
100
|
|
|
101
101
|
除上述对话上报的超时与后台发送规则外,上传、claim 恢复、补传和队列保留/清理规则沿用 [telemetry.md 的“进度与上传”](telemetry.md#进度与上传)。对话消息先在会话状态中私有保存待确认序号、去重 hash 与事件时间戳,成功入队后再提交正式序号和去重记录;待确认标记不含正文,不代表采集成功。入队失败不推进正式序号、不输出成功回执,目录恢复后可重试同一消息。状态提交失败时尝试清理本次队列记录。异常退出后,下一次采集或后台上传在同一会话锁内核对待确认标记与队列:已入队则恢复原序号及去重,未入队则清除标记;核对或保存失败时停止本次采集/发送,不占用或重复分配序号。后台仍跳过尚未提交且无法恢复的记录。采集成功仅表示本地入队和状态提交成功,不表示已上传。失败时停止继续传入正文,Skill 业务继续运行。
|
|
102
102
|
|
|
103
|
-
|
|
103
|
+
正式版默认遥测根目录为系统临时目录下 `alipay-aipay-telemetry`,预发版使用其下的 `pre` 子目录;两渠道的 run、outbox、上传状态及采集授权隔离;手动设置目录/文件覆盖变量时须自行按渠道分开,不能指向同一状态位置。阶段与对话队列各自保留最多 1000 条及 7 天;对话数量不挤占阶段配额。后台先处理阶段队列,再发送对话;对话写入/启动/上传失败均不改写阶段上传状态,前台联网补传判定只统计阶段队列。对话入队外壳采用 schema_ver=2,固定采集时的 platform,跨宿主补传不改变 d2;旧 schema_ver=1 外壳仍兼容。
|
package/skill-pre/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
1.
|
|
1
|
+
1.8.0-pre
|
|
@@ -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
|
|
|
@@ -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,7 +156,7 @@ 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>"
|
|
@@ -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`、资源防串失败或履约确认失败时,先按该文档排查,不要反复请求用户服务生成新订单。
|
|
@@ -559,6 +561,8 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message saf
|
|
|
559
561
|
|
|
560
562
|
> 详细校验清单已附在当前阶段 bundle 的“当前产品适用校验清单”。
|
|
561
563
|
|
|
564
|
+
**验收阶段边界**:本轮代码开发按沙箱集成验收;checklist 第七节中尚未开通产品或尚未取得、切换生产实值的检查,记为当前阶段不适用并保留上线前待办,不计入失败项或人工待验证项,不单独阻止 Onboarding。仍须检查生产配置加载边界、环境隔离和所有适用代码/安全控制;已发现的实现缺陷、泄露或环境混用仍是阻断缺口。不得为完成本轮检查索取生产私钥、提前改用生产配置或宣称生产就绪。
|
|
565
|
+
|
|
562
566
|
**校验完整性要求**:内部必须覆盖当前 bundle 中适用于目标产品的密钥与安全、异步通知、接口覆盖、支付结果处理、按量付费专项、退款、上线前和结果输出章节,不得只检查上方三个摘要项。通过时默认对客只输出通过结论和下一步;部分通过或未通过时只输出实际未完成项、人工待验证项和下一步。步骤 5/6 已展示的沙箱配置、联调或付款体验结论不在 checklist 结果中重复。通过项与不适用项无需逐行展开,用户要求明细时再输出完整逐项结果。精简输出不得导致任何适用校验被跳过。
|
|
563
567
|
|
|
564
568
|
先汇总 checklist 证据;本轮可修复时先修复、重检,不渲染中间结果。项目快照变化会使旧 `CHECKLIST_SCOPE_RECEIPT` 失效,必须重新加载本阶段并重跑受影响检查。
|
|
@@ -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` | 禁止把生产网关复制进沙箱运行配置 |
|
|
@@ -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
|
|
@@ -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
|
|
|
@@ -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') {
|
|
@@ -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
|
*
|
|
@@ -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
|
|
package/skill-pre/references/integration/modules/interface-contract/common-trade-contract.md
CHANGED
|
@@ -4,14 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
sourceUrl:
|
|
6
6
|
|
|
7
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-query.md>
|
|
8
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-refund.md>
|
|
9
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-fastpay-refund-query.md>
|
|
10
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-close.md>
|
|
11
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/alipay-trade-query.md>
|
|
12
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/alipay-trade-refund.md>
|
|
13
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/alipay-trade-fastpay-refund-query.md>
|
|
14
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/alipay-trade-close.md>
|
|
7
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-query.md>
|
|
8
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-refund.md>
|
|
9
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-fastpay-refund-query.md>
|
|
10
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-close.md>
|
|
11
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/alipay-trade-query.md>
|
|
12
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/alipay-trade-refund.md>
|
|
13
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/alipay-trade-fastpay-refund-query.md>
|
|
14
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/alipay-trade-close.md>
|
|
15
15
|
|
|
16
16
|
网页应用付款和移动应用收款的查询、退款、退款查询、关闭文档当前内容一致,本 Skill 本地维护一份通用契约。
|
|
17
17
|
|
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
sourceUrl:
|
|
6
6
|
|
|
7
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/async-notify-verify.md>
|
|
8
|
-
- <https://aipay.alipay.com/docs/mobile-app-pay/ai-app-pay/async-notify-verify.md>
|
|
7
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/async-notify-verify.md>
|
|
8
|
+
- <https://aipay.alipay.com/docs/vibe-pay/mobile-app-pay/ai-app-pay/async-notify-verify.md>
|
|
9
9
|
|
|
10
10
|
当前两份官方文档内容一致。运行时默认读取本文和当前语言 `1-通用接口/异步通知处理代码示例.md`;在线文档只在 fallback 条件下读取。
|
|
11
11
|
|
|
@@ -59,10 +59,10 @@ sourceUrl:
|
|
|
59
59
|
|
|
60
60
|
| 语言 | 示例 |
|
|
61
61
|
| --- | --- |
|
|
62
|
-
| Java |
|
|
63
|
-
| Python |
|
|
64
|
-
| Node.js |
|
|
65
|
-
| PHP |
|
|
66
|
-
| C# |
|
|
62
|
+
| Java | `../code-examples/java/1-通用接口/异步通知处理代码示例.md` |
|
|
63
|
+
| Python | `../code-examples/python/1-通用接口/异步通知处理代码示例.md` |
|
|
64
|
+
| Node.js | `../code-examples/nodejs/1-通用接口/异步通知处理代码示例.md` |
|
|
65
|
+
| PHP | `../code-examples/php/1-通用接口/异步通知处理代码示例.md` |
|
|
66
|
+
| C# | `../code-examples/csharp/1-通用接口/异步通知处理代码示例.md` |
|
|
67
67
|
|
|
68
68
|
Java 官方示例明确使用 `AlipaySignature.rsaCheckV1`。Node.js 示例给出 `checkNotifySignV2(params)` 的落地形态,但 Agent 落地前必须先读取目标项目 `alipay-sdk` 的 package.json 和类型定义,确认当前版本确实暴露该 API。Python、PHP、C# 示例使用项目内支付宝 SDK 验签适配器表示验签边界;适配器必须封装当前项目实际 SDK API,禁止临时手写不确定的 RSA 验签实现。
|
package/skill-pre/references/integration/modules/interface-contract/webpay-interface-contract.md
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
sourceUrl:
|
|
6
6
|
|
|
7
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/ai-web-app-payment-integration-guide.md>
|
|
8
|
-
- <https://aipay.alipay.com/docs/ai-web-app-payment-qianyi/api-list/alipay-trade-page-pay.md>
|
|
7
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/ai-web-app-payment-integration-guide.md>
|
|
8
|
+
- <https://aipay.alipay.com/docs/vibe-pay/ai-web-app-payment-qianyi/api-list/alipay-trade-page-pay.md>
|
|
9
9
|
|
|
10
10
|
## 默认范围
|
|
11
11
|
|
|
@@ -123,7 +123,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m run --url "$SERVICE
|
|
|
123
123
|
8. 生成浏览器付款链接
|
|
124
124
|
9. 使用同一过程产物构建 Payment-Proof 并重试原始服务
|
|
125
125
|
10. 仅在 HTTP 200、非空且可归属的资源、无明确业务失败,并且当前示例要求的 `Payment-Validation` 校验通过时输出服务端联调成功
|
|
126
|
-
11.
|
|
126
|
+
11. 命令结束前清理敏感过程产物,不保存跨轮恢复状态;失败或中断后必须重新按执行 guard 判定,不得直接重跑
|
|
127
127
|
|
|
128
128
|
**脚本输出**:
|
|
129
129
|
- Payment-Needed 获取结果(终端不输出原始值)
|
|
@@ -134,7 +134,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m run --url "$SERVICE
|
|
|
134
134
|
- Payment-Proof 重试后的服务响应与测试结论;`Payment-Validation` 原始值不在终端输出
|
|
135
135
|
|
|
136
136
|
**错误处理**:
|
|
137
|
-
- 沙箱化 Agent
|
|
137
|
+
- 沙箱化 Agent 环境执行本脚本时,首次执行即申请可联网权限;权限恢复只允许原样重试可确认尚未发出的命令。命令可能已发出时仍按执行 guard 处理,不以网络恢复为由重放结果未知的请求
|
|
138
138
|
- 如果未找到 `Payment-Needed` 响应头,确认服务端是否实现了 402 协议
|
|
139
139
|
- 如果收银接口返回 `PARAM_INVALID: protocol.sellerSignature不能为空`,回到预检步骤检查 `protocol.seller_signature` 是否为空、缺失或仍是占位符
|
|
140
140
|
- 如果 `pay_before` 相关参数报错,检查是否使用 ISO 8601 带时区格式
|
|
@@ -142,7 +142,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m run --url "$SERVICE
|
|
|
142
142
|
|
|
143
143
|
### 第三步:连续验证 Payment-Proof 重试
|
|
144
144
|
|
|
145
|
-
标准流程只使用第二步命令中的 `--auto-complete`。脚本生成付款链接后,在同一次进程内继续构建 Payment-Proof
|
|
145
|
+
标准流程只使用第二步命令中的 `--auto-complete`。脚本生成付款链接后,在同一次进程内继续构建 Payment-Proof、重试原始服务并输出结果;进程中断后按执行 guard 处理,结果未知时不得自动重新执行完整联调。
|
|
146
146
|
|
|
147
147
|
**脚本执行步骤**:
|
|
148
148
|
1. 读取过程产物目录中的 `state.json`
|
|
@@ -154,7 +154,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" a2m run --url "$SERVICE
|
|
|
154
154
|
**Payment-Proof 处理约束**:
|
|
155
155
|
- `trade_no` 必须使用前面沙箱收银接口返回并写入 `state.json` 的交易号;不得改用商户侧 `out_trade_no` 或重新生成。
|
|
156
156
|
- `payment_proof`、`client_session` 和最终请求头由脚本按沙箱联调约定自动处理;Agent 不得手工拼接、改写或向用户展开其原始值和内部处理规则。
|
|
157
|
-
-
|
|
157
|
+
- 进程中断后,不得以过程产物缺失或已清理推定请求未发出;`UNKNOWN_PREVIOUS_EXECUTION` 固定记录结果未知,禁止自动重跑。明确业务失败、服务实现失败或脚本已输出失败结论时,禁止立即重复执行同一联调命令;输入未变化时按 `BLOCK_UNCHANGED` 停止;只有代码、配置、URL、方法或 POST body 实际变化且 guard 返回新 `RUN` 时,才允许重新发起完整联调,禁止复用旧过程产物。
|
|
158
158
|
|
|
159
159
|
Payment-Proof 参考结构:
|
|
160
160
|
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
### 1.2 Windows LEGACY/CODE_ONLY 用户注意事项
|
|
15
15
|
Windows READY 通过兼容层执行 flow 登记的快速沙箱;下述手工分支适用于 Windows LEGACY/CODE_ONLY;CODE_ONLY 只放行代码开发,不代表站点开通选择。Windows 沙箱项目配置不要求精确 NTFS ACL 白名单,配置是否可用仍由字段校验、实际项目加载路径和防误提交检查决定。
|
|
16
16
|
|
|
17
|
-
Windows LEGACY/CODE_ONLY
|
|
17
|
+
Windows LEGACY/CODE_ONLY 普通代码开发或完整接入请求未明确要求当前配置沙箱且未主动提供资料时,记录 `sandboxConfigState=VERIFY_PENDING` 并继续代码实现,不展示资料收集消息。用户主动提供本轮目标项目的完整有效手工沙箱资料时,直接校验并写入项目实际使用的本地沙箱配置,记录沙箱 `READY`,无需再次展示资料收集消息。只有用户明确要求现在配置或恢复 Windows LEGACY/CODE_ONLY 沙箱时,才使用 `../../../normal/json/customer-messages.json` 的既有 `sandbox.windows.manual_setup`,引导用户前往支付宝 AI 付站点的“选择产品 → 一站式接入 → 技术集成”页面获取当前沙箱的 APPID、公私钥和账号信息。主动提供或本轮消息后提供的资料均须校验;部分或错误时不使用无效字段、不记 `READY`,只补问实际缺失或错误字段。沙箱 `READY` 只证明配置就绪,不改变 `CODE_ONLY` 环境分流;测试按自身实际依赖执行,不调用快速沙箱,Skill 内产品开通仍须环境 `READY`。不得要求用户自行配置、理解 `sandbox_config.sh`、执行 Bash 或手工拼接 Skill 的规范化 JSON。该资料输入例外只适用于沙箱,生产环境应用私钥和密码禁止提供给 Agent;Agent 不得在回复、摘要或普通日志中复述收到的值。
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
20
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message windows-sandbox-setup --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
@@ -65,7 +65,7 @@ Windows LEGACY/CODE_ONLY 手工沙箱:
|
|
|
65
65
|
|
|
66
66
|
1. 没有资料且没有明确配置请求时记录 `VERIFY_PENDING` 并继续代码实现,不渲染消息、不探测猜测配置。
|
|
67
67
|
2. 用户明确要求配置且尚未提供资料时,才使用标准消息一次收集当前沙箱应用的 APPID、支付宝公钥、应用公钥、与已确认语言匹配的应用私钥和沙箱账号信息;缺失或校验失败时只补问对应字段。
|
|
68
|
-
3.
|
|
68
|
+
3. 用户主动提供或本轮标准消息后提供的资料均按第 4 节校验;完整有效时由 Agent 写入目标项目实际使用的本地沙箱配置并记录沙箱 `READY`,已有完整有效资料时不重复索取。部分或错误时不使用无效字段、不记 `READY`,只补问实际缺失或错误字段。不要求采用快速沙箱 `data` 的嵌套结构,不把值复制到源码或普通日志。
|
|
69
69
|
4. 检查沙箱配置未被 Git 跟踪,并已有适用于实际路径的版本控制忽略保护;不因项目目录继承额外 Windows ACL 权限而阻断沙箱配置。
|
|
70
70
|
5. 只有 `READY` 时才输出第 5 节规定的摘要和 Windows LEGACY/CODE_ONLY 提醒并从实际本机配置映射到 SDK;Agent 不得在回复或摘要中复述用户提供的沙箱密钥和密码,生产环境应用私钥和密码禁止提供给 Agent。
|
|
71
71
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 完整接入编排
|
|
2
2
|
|
|
3
|
-
本文件是 `full_process` 唯一入口。Windows 复用根入口的 READY/LEGACY/CODE_ONLY 分流,或明确修复后唯一、根意图匹配的新 READY 事实;BLOCKED 先恢复环境,不进入本流程。CODE_ONLY
|
|
3
|
+
本文件是 `full_process` 唯一入口。Windows 复用根入口的 READY/LEGACY/CODE_ONLY 分流,或明确修复后唯一、根意图匹配的新 READY 事实;BLOCKED 先恢复环境,不进入本流程。CODE_ONLY 继续独立代码开发,沙箱默认 `VERIFY_PENDING`;用户主动提供完整有效手工资料并完成项目配置校验后可记沙箱 `READY`,各测试按实际依赖执行,但环境分流仍为 CODE_ONLY,最终如实列出未完成项并停在 Onboarding 前;不得登录、开通或宣称完整接入完成。从仅开发切换为完整接入时必须先用 `full_process` 重新执行 Windows 入口。命令携带当前有效的 `--windows-route`。READY 执行 Integration 快速沙箱及 Onboarding 本地流程,LEGACY 仅在不支持的平台映射或用户明确选站点时先完成可独立开发内容,再在原衔接点输出站点引导。三者都不重新安装、不创建 Integration Worker。启动方案送达前只复用 Integration 步骤 1 的项目、语言、当前系统分支环境和沙箱准备;不得开发代码、进入 Onboarding 或读取开通信息。
|
|
4
4
|
|
|
5
5
|
目标项目和技术栈确定后执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow integration entry --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"`,只加载当前入口阶段并按步骤 1/2 准备及展示方案;代码开发满足衔接条件后执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" flow onboarding entry --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"`。禁止整读两个 flow。所有 Skill 自有运行时动作只用当前 Skill 绝对路径下的统一入口单命令执行,不前置 `cd`、不拼接管道;用户项目命令仍以已确认项目根为 workdir。
|
|
6
6
|
|
|
@@ -86,7 +86,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" integration-message sta
|
|
|
86
86
|
|
|
87
87
|
- 启动方案送达后先完成上述 Worker 分流,再由确定的执行者进入 Integration 步骤 3;用户中断后若项目、产品、语言或框架变化,重新澄清和扫描并输出当前方案。
|
|
88
88
|
- Integration 先完整执行和校验。只有沙箱待配置,或 READY 且仅剩非阻塞人工待验证项时,保持“部分通过”进入 Onboarding;其他代码、安全或依据缺口停在 Integration,不提前登录或收集开通材料。
|
|
89
|
-
- Windows CODE_ONLY
|
|
89
|
+
- Windows CODE_ONLY 时,不论沙箱配置为 `READY` 还是待配置,均在 Integration 最终检查后停止,不进入 Onboarding;有效手工配置可用于满足自身实际依赖的沙箱测试,不因缺少 Git Bash 单独跳过原生 Python 402 联调。恢复可选工具并按 `full_process` 复检得到环境 READY 后,按实际项目状态继续,复用已有有效配置和联调证据,不重放已完成动作。
|
|
90
90
|
- 阶段间只复用有效的产品、Integration 结果、沙箱状态、人工待验证项和剩余待办,不再询问是否进入 Onboarding;Onboarding 只保留非阻塞方案展示。
|
|
91
91
|
- 授权后分别查询签约、应用和适用服务;分支独立,单分支失败不回滚其他成功,认证/授权不匹配或主体变化全局阻断。一次只收集一个类别,提前材料直接校验且不重复索取。
|
|
92
92
|
- 签约材料通过后直接提交;服务创建摘要后直创、修改仍确认;空应用候选材料完整或非空候选明确新建,重查未变即创建,以用户公钥生成官方确认页,校验成功后直接提审。均不增加额外确认点;按量付费沙箱测试仍属 Integration 默认动作。
|
|
@@ -18,7 +18,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" windows-entry --root-in
|
|
|
18
18
|
|
|
19
19
|
退出 0 只表示分流完成。必须取得唯一 `ALIPAY_AIPAY_INTERNAL:WINDOWS_ROUTE=<JSON>`,校验 schemaVersion=1、rootIntent 等于当前根意图、route 为 READY、BLOCKED、LEGACY 或 CODE_ONLY;非零、超时、缺失或冲突均按 BLOCKED 停止。READY 才执行本地快速沙箱和签约;BLOCKED 说明内部 `WINDOWS_ENV_RESULT` 的实际 reason/dependency 及恢复动作,等待环境修复,不能输出站点引导;LEGACY 仅用于不支持的执行映射或用户明确选择站点。后续 Windows runtime 命令附加当前 `--windows-route`;BLOCKED 不进入 bootstrap、业务 flow 或项目写入。CODE_ONLY 只放行独立代码开发,根意图和诊断原因沿用本次入口事实。修复可选工具后重新只读复检,取得唯一 READY 才恢复快速沙箱和开通动作。环境故障不关闭遥测,也不改变 SESSION_ID、run_id、计数或会话采集选择。
|
|
20
20
|
|
|
21
|
-
`integration_only/full_process` 遇到已识别的 Git Bash、jq、CLI 或安装辅助工具缺失/运行失败,以及这些工具的有限安装、下载、哈希/签名校验或预算耗尽失败时,返回 `CODE_ONLY`。失败工具不得继续执行,校验失败的安装包不得运行。以唯一 WINDOWS_ROUTE 的 route 决定是否进入开发;WINDOWS_ENV_RESULT
|
|
21
|
+
`integration_only/full_process` 遇到已识别的 Git Bash、jq、CLI 或安装辅助工具缺失/运行失败,以及这些工具的有限安装、下载、哈希/签名校验或预算耗尽失败时,返回 `CODE_ONLY`。失败工具不得继续执行,校验失败的安装包不得运行。以唯一 WINDOWS_ROUTE 的 route 决定是否进入开发;WINDOWS_ENV_RESULT 的失败诊断保留实际原因,不能将其误读为业务能力可用。该分流沿用 Integration 的原生 Node 路径,沙箱默认 `VERIFY_PENDING`,跳过快速沙箱;用户主动提供完整有效手工资料并写入、校验项目配置后,可记沙箱 `READY`,无需先将环境分流恢复为 READY。各测试按自身实际依赖执行:缺失工具所依赖的动作仍不能运行;原生 Python 402 联调不依赖 Git Bash,但仍须 Python、curl、服务可访问、沙箱配置等前置就绪。最终如实列出未完成项,不自动引导站点开通。完整接入在代码部分检查后停在 Onboarding 前,待工具恢复且复检 READY 才恢复。Node 版本不足、实际存储故障、状态损坏、回滚失败或未知错误仍为 BLOCKED;项目路径和生产配置保护要求不变。下文“失败保持 BLOCKED”对上述可选工具例外按 CODE_ONLY 处理。
|
|
22
22
|
|
|
23
23
|
CODE_ONLY 后用户已自行修好环境时,按原根意图执行上述 `windows-entry` 只读复检;明确授权准备时附加 `--prepare-authorized true`,只有明确修复后重试才再附加 `--repair-confirmed true`,沿用原有分阶段预算。唯一 READY 才恢复快速沙箱和开通能力;仍为 CODE_ONLY 时只继续独立代码开发,不反复安装。根意图变化必须按新根意图重新执行入口,不把 CODE_ONLY 当成 LEGACY 的站点选择,也不沿用旧能力事实。
|
|
24
24
|
|
|
@@ -36,9 +36,9 @@ CLI 刷新策略与非 Windows 保持同一会话预算,不锁定 0.1.7 或其
|
|
|
36
36
|
|
|
37
37
|
初次缺 Git Bash、jq 或本机 CLI 无法启动且当前任务授权准备时,按 Git Bash → jq → 必要的 CLI 修复 → 完整复检执行。CLI 已可用时不重复安装。Git 优先复用已有可运行的 Git for Windows;缺失时优先调用用户级 winget,无法运行或未通过复检时使用 `scripts/windows/policy.json` 固定的 Git for Windows 官方 x64 安装包(当前 2.56.0.2)。官方包下载后先校验固定 SHA-256,再由系统 PowerShell 验证 Authenticode 有效,之后安装到 `%LOCALAPPDATA%/Programs/Git-Aipay-<version>`,并实测 git、bash、cygpath。下载或校验失败不运行安装包。两种来源均不可用时按根意图返回 CODE_ONLY 或 BLOCKED,展示原因及官方手工安装路径,不静默跳站点。
|
|
38
38
|
|
|
39
|
-
jq 使用固定 1.7.1 官方资产和 SHA-256,已有健康版本直接复用;CLI 仍使用正式 PowerShell 安装器选择当前版本。每个依赖和 Git 的两种安装来源分别记录实际开始的安装尝试,确认来源前的只读探测不消耗预算;Git 的 winget
|
|
39
|
+
jq 使用固定 1.7.1 官方资产和 SHA-256,已有健康版本直接复用;CLI 仍使用正式 PowerShell 安装器选择当前版本。每个依赖和 Git 的两种安装来源分别记录实际开始的安装尝试,确认来源前的只读探测不消耗预算;Git 的 winget 失败可在同次准备中尝试官方固定包。初次每个来源最多一次,用户明确修复后每个来源最多再一次;失败阶段可续跑,已健康的阶段不重装。状态记录不含业务材料;复检始终只读且不消耗安装预算。可选工具的网络、签名或完整性失败按[启动与分流](#启动与分流)中的 CODE_ONLY 规则分流;实际存储故障仍为 BLOCKED。不轮换未经验证的镜像、使用 WSL、提权或修改执行策略。
|
|
40
40
|
|
|
41
|
-
环境诊断和次数保存在 `%LOCALAPPDATA%/alipay-aipay-pre/windows/environment.json`;旧版全局次数无法归属具体安装阶段,迁移时保留阻断原因并从新版本的有限分阶段预算重新计数。锁短时占用或状态损坏时,完整工具检查通过仍可 READY;自动安装保持阻断,不删除锁或状态绕过预算。CODE_ONLY
|
|
41
|
+
环境诊断和次数保存在 `%LOCALAPPDATA%/alipay-aipay-pre/windows/environment.json`;旧版全局次数无法归属具体安装阶段,迁移时保留阻断原因并从新版本的有限分阶段预算重新计数。锁短时占用或状态损坏时,完整工具检查通过仍可 READY;自动安装保持阻断,不删除锁或状态绕过预算。CODE_ONLY 的恢复使用[启动与分流](#启动与分流)中的 `windows-entry` 只读复检;以下仅适用于 BLOCKED。用户修好依赖后,只读复检可再次执行,无论此前安装预算是否用尽:
|
|
42
42
|
|
|
43
43
|
```text
|
|
44
44
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env retry --repair-confirmed true --root-intent "<ROOT_INTENT>" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>" --windows-route BLOCKED
|
|
@@ -52,7 +52,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" env prepare --authorize
|
|
|
52
52
|
|
|
53
53
|
如果之前只是缺少授权或没有找到安装来源,尚未实际尝试该阶段,则使用同一命令但省略 `--repair-confirmed true`,继续首次准备;不能把新授权当成已消耗预算后的额外重试许可。
|
|
54
54
|
|
|
55
|
-
仅退出 0、唯一 `CLI_ENV:READY` 和唯一根意图匹配的 `WINDOWS_ROUTE=READY` 可恢复沙箱及开通能力。BLOCKED 恢复命令的其他结果保持 BLOCKED,说明具体失败原因;不重建会话、重复计数或重放业务操作。CODE_ONLY
|
|
55
|
+
仅退出 0、唯一 `CLI_ENV:READY` 和唯一根意图匹配的 `WINDOWS_ROUTE=READY` 可恢复沙箱及开通能力。BLOCKED 恢复命令的其他结果保持 BLOCKED,说明具体失败原因;不重建会话、重复计数或重放业务操作。CODE_ONLY 按[启动与分流](#启动与分流)重新执行 `windows-entry` 取得入口分流。用户明确选择站点或平台执行映射不支持时,可走原 LEGACY 分支;可恢复的依赖失败不能自动转站点。
|
|
56
56
|
|
|
57
57
|
## 路径、权限与进程
|
|
58
58
|
|
|
@@ -70,7 +70,7 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" telemetry resolve-sessi
|
|
|
70
70
|
node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" windows-entry --root-intent "<ROOT_INTENT>" --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"
|
|
71
71
|
```
|
|
72
72
|
|
|
73
|
-
用户明确要求安装并通过 Skill 完成签约/开通或完整接入时(包括正式版保留的原任务与用户随后明确同意安装内测版的选择),当前任务已授权准备所需用户级依赖,附加 `--prepare-authorized true`;仅代码开发且未授权准备依赖时先只读检查。用户明确选择站点时才附加 `--site-selected true`。这不构成登录、签约或应用写入授权。只接受退出 0、唯一 `ALIPAY_AIPAY_INTERNAL:WINDOWS_ROUTE=<JSON>` 且 rootIntent 匹配、route 为 `READY|BLOCKED|LEGACY|CODE_ONLY`。非零、缺失或冲突按 `BLOCKED` 停止,不推定站点分支。`BLOCKED` 须说明内部结果给出的实际缺项/失败原因和有限恢复动作;用户修好依赖后先只读复检,必要且获授权时才按环境文档继续准备。只有不支持的执行映射或用户明确选择站点才进入 `LEGACY`。`integration_only/full_process` 因 Git Bash、jq、CLI 等可选工具缺失、不可运行或有限准备失败时可返回 `CODE_ONLY`,继续原生 Node
|
|
73
|
+
用户明确要求安装并通过 Skill 完成签约/开通或完整接入时(包括正式版保留的原任务与用户随后明确同意安装内测版的选择),当前任务已授权准备所需用户级依赖,附加 `--prepare-authorized true`;仅代码开发且未授权准备依赖时先只读检查。用户明确选择站点时才附加 `--site-selected true`。这不构成登录、签约或应用写入授权。只接受退出 0、唯一 `ALIPAY_AIPAY_INTERNAL:WINDOWS_ROUTE=<JSON>` 且 rootIntent 匹配、route 为 `READY|BLOCKED|LEGACY|CODE_ONLY`。非零、缺失或冲突按 `BLOCKED` 停止,不推定站点分支。`BLOCKED` 须说明内部结果给出的实际缺项/失败原因和有限恢复动作;用户修好依赖后先只读复检,必要且获授权时才按环境文档继续准备。只有不支持的执行映射或用户明确选择站点才进入 `LEGACY`。`integration_only/full_process` 因 Git Bash、jq、CLI 等可选工具缺失、不可运行或有限准备失败时可返回 `CODE_ONLY`,继续原生 Node 代码开发,沙箱默认记 `VERIFY_PENDING`;用户主动提供完整有效手工资料并完成项目配置校验后可记沙箱 `READY`,但环境分流仍为 `CODE_ONLY`,测试按实际依赖执行,不因缺少 Git Bash 单独跳过原生 Python 402 联调;完整接入的代码部分完成后停在开通前,不宣称完整接入完成。Windows 沙箱项目配置不要求精确 ACL 白名单;CLI 登录凭据目录仅在依赖登录的动作前检查实际可写性,失败只阻断该动作。Node 不足、实际存储故障、状态异常及未知错误仍阻断,不由 Agent 自行降级。所有后续 Windows runtime 命令追加 `--windows-route "<READY|BLOCKED|LEGACY|CODE_ONLY>"`;`BLOCKED` 不进入业务 bootstrap/flow。修复后只有唯一、根意图匹配的 `WINDOWS_ROUTE=READY` 才恢复快速沙箱与本地开通;`LEGACY` 保留原独立开发/手工沙箱及站点开通分支。`CODE_ONLY` 绑定本次根意图;根意图变化必须重新执行 `windows-entry`,不得继承旧分流。用户修好依赖或明确授权准备后,按 Windows 环境文档重新检查;未取得 READY 时继续独立开发,不循环安装。实际业务执行前仍复检能力。环境、沙箱准备或业务失败不修改采集选择、SESSION_ID、run_id、用户输入计数或阶段责任方。
|
|
74
74
|
|
|
75
75
|
|
|
76
76
|
`integration_only` 的 `integration-bootstrap` 在产品已唯一确定时必须携带 `--product-type`,并串行执行 `telemetry start-run` 与 `flow integration entry`;产品尚未唯一确定时省略产品且不创建正式 run,后续由 `integration-message start-confirm` 首次开 run并生成 `clarify_intent`。`onboarding_only` 的 `onboarding-bootstrap` 同理:产品已唯一时携带产品并先启动 run,尚未唯一时由 `mcc resolve-plan` 或 `onboarding-message plan-confirm` 首次启动。两者均为既有无业务写入动作,执行后不得重复原子命令。Windows READY 返回本地 entry 契约;Windows LEGACY 引导渲染依次使用现有平台项目 ID、正式 run_id;两者均不存在时使用已绑定 `SESSION_ID` 的稳定匿名哈希,不提前创建 run。非 Windows 返回 entry 契约。`full_process` 不使用 `integration-bootstrap`;衔接 Onboarding 也不使用带 `start-run` 的 bootstrap,仍执行 `node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" onboarding-message platform-entry --agent-platform "<AGENT_PLATFORM>" --session-id "<SESSION_ID>"` 后按需加载 entry,避免重复 `clarify_intent`。
|
|
@@ -103,6 +103,6 @@ node "<SKILL_DIR>/references/normal/scripts/runtime.mjs" windows-entry --root-in
|
|
|
103
103
|
|
|
104
104
|
扫码页非阻塞:授权最多 12 次/间隔 5 秒,公钥最多 20 次/间隔 2 秒,成功即推进;耗尽后经统一回复判定只查一次,不重启轮询。
|
|
105
105
|
|
|
106
|
-
`full_process` 代码开发方案送达前只准备项目、语言、系统分支环境和沙箱;Windows LEGACY
|
|
106
|
+
`full_process` 代码开发方案送达前只准备项目、语言、系统分支环境和沙箱;Windows LEGACY/CODE_ONLY 未明确要求当前配置且未主动提供资料时记 `VERIFY_PENDING`,不收资料;本轮有效手工配置可记 `READY`,`CODE_ONLY` 仍在开通前停止。方案送达后直接进入 Integration 步骤 3,满足条件自动进 Onboarding;仅沙箱待配置,或 READY 且只剩非阻塞人工验证时可部分通过,其他缺口停在 Integration;收口保留全部待办。用户中断后重新确认当前项目和服务端语言,从实际项目扫描恢复,不恢复旧方案状态。
|
|
107
107
|
|
|
108
108
|
仅代码开发结束时提醒仍需产品开通;仅产品开通结束时提醒仍需代码开发。机器规则、消息目录、fixture 和测试不作为默认必读内容。
|