嵌入式结账协议
概述
嵌入式结账协议 (ECP) 使主机能够嵌入商家的结账界面,在买家交互时接收事件,并委托关键用户操作(如地址和支付选择)。
W3C Payment Request 对齐
ECP 汲取了 W3C Payment Request API 的灵感,为嵌入式结账场景调整其思维模型:
| 概念 | W3C Payment Request | 嵌入式结账 |
|---|---|---|
| 初始化 | new PaymentRequest() | 使用 continue_url 加载 |
| UI 就绪 | show() 返回 Promise | ec.start 通知 |
| 支付方式更改 | paymentmethodchange 事件 | ec.payment.change 通知 |
| 提交支付 | 用户接受 → PaymentResponse | 委托 ec.payment.credential_request |
| 完成 | response.complete() | ec.complete 通知 |
发现
ECP 可用性通过服务发现发出信号。当商家宣告 embedded 传输时,所有 continue_url 值都支持 ECP:
{
"services": {
"dev.ucp.shopping": {
"embedded": {
"schema": "https://ucp.dev/services/shopping/embedded.openrpc.json"
}
}
}
}加载嵌入式结账
要启动 ECP 会话,使用查询参数增强 continue_url:
ec_version(字符串,必需):UCP 版本(格式:YYYY-MM-DD)ec_auth(字符串,可选):身份验证令牌ec_delegate(字符串,可选):逗号分隔的委托列表
示例:
https://example.com/checkout/abc123?ec_version=2026-01-11&ec_delegate=payment.credential,fulfillment.address_change委托
委托允许主机本机处理特定操作:
ec_delegate 值 | 对应消息 |
|---|---|
payment.instruments_change | ec.payment.instruments_change_request |
payment.credential | ec.payment.credential_request |
fulfillment.address_change | ec.fulfillment.address_change_request |
消息格式
所有 ECP 消息必须使用 JSON-RPC 2.0 格式:
{
"jsonrpc": "2.0",
"method": "ec.start",
"params": {...},
"id": "optional_request_id"
}核心消息
ec.ready(握手)
在主机和嵌入式结账之间建立连接:
{
"jsonrpc": "2.0",
"id": "ready_1",
"method": "ec.ready",
"params": {
"delegate": ["payment.credential", "fulfillment.address_change"]
}
}主机响应:
{
"jsonrpc": "2.0",
"id": "ready_1",
"result": {
"checkout": {
"payment": {
"instruments": [...]
}
}
}
}ec.start(生命周期)
发出结账可见且准备交互的信号:
{
"jsonrpc": "2.0",
"method": "ec.start",
"params": {
"checkout": {
"id": "checkout_123",
"status": "incomplete",
"totals": [...],
"line_items": [...]
}
}
}ec.complete(生命周期)
指示结账成功完成:
{
"jsonrpc": "2.0",
"method": "ec.complete",
"params": {
"checkout": {
"id": "checkout_123",
"order": {
"id": "ord_99887766",
"permalink_url": "https://merchant.com/orders/ord_99887766"
}
}
}
}ec.payment.credential_request(委托)
从主机请求支付凭证:
{
"jsonrpc": "2.0",
"id": "payment_credential_request_1",
"method": "ec.payment.credential_request",
"params": {
"checkout": {
"id": "checkout_123",
"payment": {
"selected_instrument_id": "payment_instrument_123"
}
}
}
}主机响应:
{
"jsonrpc": "2.0",
"id": "payment_credential_request_1",
"result": {
"checkout": {
"payment": {
"instruments": [
{
"id": "payment_instrument_123",
"credential": {
"type": "token",
"token": "tok_123"
}
}
]
}
}
}
}安全
CSP 要求
- 商家:设置
frame-ancestors <host_origin>; - 主机:使用适当的
frame-src或中间 iframe
Iframe 沙箱
<iframe sandbox="allow-scripts allow-forms allow-same-origin"></iframe>另请参阅
- 结账能力 - 核心结账规范
- 结账 REST 绑定 - REST API 绑定