Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本规范定义了使 Web 应用能够 处理支付请求的相关能力。
本节描述了本 文档在发布时的状态。当前 W3C 发布物及本技术报告最新修订版可在 W3C 标准与草案索引 中找到。
Web 支付工作组维护着 尚未处理的所有 问题报告清单。本草案指出了一些待讨论的问题项。 这些问题的结果尚未做出决定,包括它们是否有效。对于未解决的 问题,欢迎提交包含规范建议文本的拉取请求。
本文档由Web 支付工作组 作为工作草案,并按照 推荐轨道 发布。
作为 工作草案发布并不意味着 W3C及其成员的认可。
本文为草案文件,可能会被随时更新、替换或废止。 除作为进行中的工作外,不应引用本文件。
本文档由 W3C 专利政策 下运行的小组制作。 W3C 维护着 任何与小组 交付成果相关的公开专利披露列表 ;该页面还包含 披露专利的说明。如个人确实 知晓某专利且认为该专利包含 必要权利要求, 必须根据 《W3C专利政策》第6节 披露相关信息。
本文档适用 2025年8月18日 W3C 流程文档管理。
本节为非规范性内容。
本规范定义了若干新特性,以允许 Web 应用代表用户处理支付请求:
PaymentRequestEvent)。一种
基于 Web 的支付处理器是
PaymentRequestEvent 的
事件处理器。
PaymentManager),用于管理基于 Web 的支付
处理器的属性。
PaymentRequestEvent 的机制。
本规范未涉及使用操作系统特定机制构建的软件 (即“原生应用”)如何处理 支付请求。
在本文档中,我们设想如下流程:
PaymentRequestEvent(参见
用户
交互
任务源)。该
PaymentRequestEvent
包含一些来自
PaymentRequest(定义于 [payment-request])的信息,以及
附加信息(例如,收款方的源)。
一个源可能会使用多个 service worker 实现一个支付应用, 因此每个源可能注册多个基于 Web 的支付处理器。被调用的处理器 由用户所作的选择决定。
本节为非规范性内容。
基于 Web 的支付处理器是一种基于 Web 应用的 支付 处理器;也就是说,这是一种能够代表用户处理 支付请求的 Web 应用。
基于 Web 的支付处理器的逻辑由其所支持的支付 方式驱动。某些支付方式几乎不需要 基于 Web 的支付处理器进行处理,它只需在响应中简单返回 支付卡详细信息。随后由收款方 网站使用返回的数据作为输入来处理支付。
相比之下,某些支付方式,例如加密货币支付 或由银行发起的贷记转账,要求基于 Web 的 支付处理器发起支付处理。在这种情况下,该 基于 Web 的支付处理器将返回一个支付参考、端点 URL 或其他某种数据,收款方网站可用其来确定 支付结果(而不是自行处理支付)。
处理支付请求可能包括大量交互:与 用户通过新窗口或其他 API(例如 Web Cryptography API)进行交互,或通过 Web 请求或其他方式与其他服务和源进行交互。
本规范不涉及发生在
基于 Web 的支付处理器接受
PaymentRequestEvent 与
基于 Web 的支付处理器返回
响应之间的这些活动。所有这些为配置
基于 Web 的支付处理器并处理支付请求而可能需要的活动,
都留给基于 Web 的支付处理器的实现来决定,
其中包括:
因此,一个源将依赖许多其他地方定义的 Web 技术 来完成生命周期管理、安全性、用户身份验证、 用户交互等工作。
本节为非规范性内容。
本规范不涉及第三方移动支付 应用如何(通过专有机制)与用户代理交互,或 用户代理自身如何提供简单的支付应用功能。
可通过即时(JIT)注册机制,将基于 Web 的支付处理器 向用户代理注册。
如果在商家调用 show()
方法时,某个基于 Web 的支付处理器尚未注册,
用户代理可以允许
用户在交易过程中注册这个基于 Web 的支付处理器
(“即时”)。
本节其余内容为非规范性内容。
用户代理可以通过推导 基于 Web 的支付处理器信息来执行即时安装,这些信息来自通过 支付方式 清单找到的内容,而该清单是通过商家请求的 基于 URL 的 支付方式 标识符发现的。
本节描述了基于 Web 的 支付处理器可用于管理其自身属性的功能。
WebIDLpartial interface ServiceWorkerRegistration {
[SameObject] readonly attribute PaymentManager paymentManager;
};
paymentManager 属性公开了基于 Web 的支付
处理器管理功能。
WebIDL[SecureContext, Exposed=(Window)]
interface PaymentManager {
attribute DOMString userHint;
Promise<undefined> enableDelegations(sequence<PaymentDelegation> delegations);
};
PaymentManager 由基于 Web 的支付处理器用来
管理其支持的委托项。
在显示基于 Web 的支付处理器名称和图标时,用户 代理可以使用该字符串来改善用户体验。例如, 类似“**** 1234”这样的用户提示可以提醒用户, 某张特定卡可通过该基于 Web 的支付处理器使用。
该方法允许基于 Web 的支付处理器
以异步方式声明其支持的 PaymentDelegation
列表。
WebIDLenum PaymentDelegation {
"shippingAddress",
"payerName",
"payerPhone",
"payerEmail"
};
shippingAddress"
payerName"
payerPhone"
payerEmail"
如果基于 Web 的支付处理器支持
CanMakePaymentEvent,则用户
代理可以用它来帮助
过滤可用的基于 Web 的支付处理器。
实现可以对开发者响应
CanMakePaymentEvent 施加超时限制。如果超时到期,
则该
实现的行为将如同调用了 respondWith()
且参数为 false。
WebIDLpartial interface ServiceWorkerGlobalScope {
attribute EventHandler oncanmakepayment;
};
oncanmakepayment
属性是一个
事件处理器,
其对应的事件
处理器事件
类型为 "canmakepayment"。
CanMakePaymentEvent 用作一个信号,
用于表明
基于 Web 的支付处理器是否能够响应支付请求。
WebIDL[Exposed=ServiceWorker]
interface CanMakePaymentEvent : ExtendableEvent {
constructor(DOMString type);
undefined respondWith(Promise<boolean> canMakePaymentResponse);
};
该方法被基于 Web 的支付处理器用作一个信号, 以表明其是否能够响应支付请求。
在收到一个 PaymentRequest 后,用户 代理 必须 运行以下步骤:
CanMakePaymentEvent(例如,在私密
浏览模式下),
则终止这些步骤。
ServiceWorkerRegistration。
使用
CanMakePaymentEvent 在
registration 上触发
触发功能事件
"canmakepayment"。
CanMakePaymentEvent 的示例
本节为非规范性内容。
本示例展示了如何编写一个监听
CanMakePaymentEvent 的 service
worker。当收到一个 CanMakePaymentEvent 时,
该 service worker 始终返回 true。
self.addEventListener("canmakepayment", function(e) {
e.respondWith(new Promise(function(resolve, reject) {
resolve(true);
}));
});
给定一个 PaymentMethodData 以及
一个在支付
方式标识符上匹配的基于 Web 的支付处理器,如果该基于 Web 的支付处理器可用于
支付,则此算法返回
true:
ServiceWorkerRegistration
作用域 URL 的源。
"*",则返回
true。
CanMakePaymentEvent,
并返回结果。
CanMakePaymentEvent 并返回
结果。
false。
一旦用户选择了某个基于 Web 的支付处理器,用户代理
就会触发一个 PaymentRequestEvent,并使用
随后的
PaymentHandlerResponse 来创建一个供
[payment-request] 使用的 PaymentResponse。
Payment Request API 支持将管理 中止操作的责任委托给支付应用。当前有一项提案,计划向 Web-based Payment Handler 接口添加一个 paymentRequestAborted 事件。 该事件将带有一个 respondWith 方法,其接受一个布尔参数, 用于指示 paymentRequest 是否已被成功中止。
ServiceWorkerGlobalScope
的扩展
本规范扩展了 ServiceWorkerGlobalScope
接口。
WebIDLpartial interface ServiceWorkerGlobalScope {
attribute EventHandler onpaymentrequest;
};
onpaymentrequest
属性是一个 事件处理器,
其对应的 事件
处理器事件类型 是
PaymentRequestEvent。
PaymentRequestDetailsUpdate 包含更新后的
总额(可选地包含修饰项和配送选项)以及由于用户在
基于 Web 的支付处理器中选择某种支付方式、配送
地址或配送选项而产生的可能错误。
WebIDLdictionary PaymentRequestDetailsUpdate {
DOMString error;
PaymentCurrencyAmount total;
sequence<PaymentDetailsModifier> modifiers;
sequence<PaymentShippingOption> shippingOptions;
object paymentMethodErrors;
AddressErrors shippingAddressErrors;
};
一段人类可读的字符串,用于解释为什么用户所选的 基于 Web 的支付方式、配送地址或配送选项不能 被使用。
根据变化后的支付方式、配送 地址或配送选项更新后的总额。例如,总额可能会变化, 因为用户所选支付方式的账单地址 改变了增值税(VAT);或者因为用户选择/提供的配送 选项/地址改变了配送 成本。
根据变化后的支付方式、配送 地址或配送选项更新后的修饰项。例如,如果总体总额 因账单地址或配送地址而增加了 €1.00,那么 每个修饰项中指定的总额也应相应增加 €1.00。
根据变化后的配送地址更新后的 shippingOptions。例 如,对于用户提供的国家/地区,加急配送可能更贵, 或者不可用。
支付方式的校验错误(如果有)。
配送地址的校验错误(如果有)。
PaymentRequestEvent 表示在用户选择之后, Payment Handler 可用的数据和方法。用户代理 会将 PaymentRequest 中可用数据的一个子集传递给 Payment Handler。
WebIDL[Exposed=ServiceWorker]
interface PaymentRequestEvent : ExtendableEvent {
constructor(DOMString type, optional PaymentRequestEventInit eventInitDict = {});
readonly attribute USVString topOrigin;
readonly attribute USVString paymentRequestOrigin;
readonly attribute DOMString paymentRequestId;
readonly attribute FrozenArray<PaymentMethodData> methodData;
readonly attribute object total;
readonly attribute FrozenArray<PaymentDetailsModifier> modifiers;
readonly attribute object? paymentOptions;
readonly attribute FrozenArray<PaymentShippingOption>? shippingOptions;
Promise<WindowClient?> openWindow(USVString url);
Promise<PaymentRequestDetailsUpdate?> changePaymentMethod(DOMString methodName, optional object? methodDetails = null);
Promise<PaymentRequestDetailsUpdate?> changeShippingAddress(optional AddressInit shippingAddress = {});
Promise<PaymentRequestDetailsUpdate?> changeShippingOption(DOMString shippingOption);
undefined respondWith(Promise<PaymentHandlerResponse> handlerResponsePromise);
};
返回一个字符串,用来指示顶级 收款方网页的 源。该属性由 处理 PaymentRequestEvent 进行初始化。
返回一个字符串,用来指示
PaymentRequest 被初始化时所在的
源。当一个
PaymentRequest
在 topOrigin 中被初始化时,这些属性具有
相同的
值;否则,这些属性具有不同的值。例如,
当一个 PaymentRequest 在一个
来自不同于 topOrigin 的源的 iframe 中
被初始化时,此属性的值
就是该 iframe 的源。该属性由
处理
PaymentRequestEvent 初始化。
获取时,paymentRequestId
属性返回与此
PaymentRequestEvent
对应的
PaymentRequest 的
[[details]].id。
该属性包含 PaymentMethodData 字典, 其中包含网站接受的支付方式标识符 以及任何相关的支付 方式特定数据。它使用下文定义的 MethodData 填充 算法 从 PaymentRequest 中填充。
该属性表示请求支付的总金额。
它的类型是 [payment-request] 中定义的
PaymentCurrencyAmount
字典,并使用
相应 PaymentRequest 对象在实例化时
提供的 PaymentDetailsInit
的
total 字段的一个副本进行初始化。
这一组 PaymentDetailsModifier 字典 包含针对特定支付方式标识符的修饰项(例如, 如果支付金额或货币类型根据 每种支付方式而有所不同)。它使用下文定义的 Modifiers 填充 算法 从 PaymentRequest 中填充。
PaymentOptions 在 PaymentRequest 中的值。仅当请求配送地址和/或 付款人联系信息中的任意子集时可用。
相应 PaymentRequest 的 PaymentDetailsInit 字典中 ShippingOptions 的值。(PaymentDetailsInit 从 PaymentDetailsBase 继承 ShippingOptions)。仅在请求配送地址时 可用。
该方法由基于 Web 的支付处理器用来向 用户显示一个窗口。调用时,它会运行 打开窗口 算法。
该方法由基于 Web 的支付处理器用来根据 账单地址等支付方式详细信息获取更新后的总额。调用时, 它会运行 更改支付方式 算法。
该方法由基于 Web 的支付处理器用来根据 shippingAddress 获取更新后的支付详情。调用时, 它会运行 更改支付详情算法。
该方法由基于 Web 的支付处理器用来根据 shippingOption 标识符获取更新后的支付详情。调用时, 它会运行 更改支付详情算法。
该方法由基于 Web 的支付处理器在支付成功
完成时用来提供一个
PaymentHandlerResponse。调用时,
它会以 event 和 handlerResponsePromise 作为
参数运行 响应 PaymentRequest
算法。
支付应用是否应在用户明确同意的前提下接收 存储于用户代理中的用户数据?支付应用可以在 安装时或首次被调用时请求 权限。
WebIDLdictionary PaymentRequestEventInit : ExtendableEventInit {
USVString topOrigin;
USVString paymentRequestOrigin;
DOMString paymentRequestId;
sequence<PaymentMethodData> methodData;
PaymentCurrencyAmount total;
sequence<PaymentDetailsModifier> modifiers;
PaymentOptions paymentOptions;
sequence<PaymentShippingOption> shippingOptions;
};
topOrigin、paymentRequestOrigin、
paymentRequestId、
methodData、
total、
modifiers、paymentOptions
以及 shippingOptions
成员与
为 PaymentRequestEvent
定义的对应成员共享其定义
为初始化 methodData 的值,用户代理
必须 执行以下步骤或其等效步骤:
methodData 设为
dataList。
为初始化 modifiers 的值,用户代理
必须 执行以下步骤或其等效步骤:
modifiers
内的每一项,执行以下步骤:
total 设为
inModifier.total 的一个副本。
modifiers 设为
modifierList。
PaymentRequestEvent 的实例
会使用下表中的内部
槽创建:
| 内部槽 | 默认值 | 描述(非规范性) |
|---|---|---|
| [[windowClient]] | null | 当前活动的 WindowClient。如果某个 基于 Web 的支付处理器当前正在向 用户显示一个窗口,则设置此值。否则,它为 null。 |
| [[respondWithCalled]] | false | YAHO |
当通过 PaymentRequest.show() 接收到一个 PaymentRequest,并且用户随后选择了某个基于 Web 的支付处理器时,用户 代理 必须 运行以下步骤:
ServiceWorkerRegistration。
InvalidStateError"
DOMException
拒绝由 PaymentRequest.show() 创建的 Promise,并
终止这些步骤。
在 registration 上,使用
PaymentRequestEvent 触发
触发功能事件
"paymentrequest",并带有以下属性:
topOrigin
paymentRequestOrigin
methodData
modifiers
total
paymentRequestId
paymentOptions
shippingOptions
然后,以 dispatchedEvent 并行运行以下步骤:
PaymentHandlerResponse,
则使用一个
"OperationError"
DOMException
拒绝由 PaymentRequest.show()
创建的 Promise。
被调用的基于 Web 的支付处理器可能需要,也可能不需要显示 关于其自身的信息或请求用户输入。基于 Web 的 支付处理器显示的一些潜在示例包括:
需要可视化显示和用户 交互的基于 Web 的支付处理器,可以调用 openWindow() 向用户 显示一个页面。
由于用户代理知道此方法与
PaymentRequestEvent
相关联,
它们应当以与流程一致且不会让用户困惑的方式
渲染该窗口。生成的
窗口客户端会绑定到发起
PaymentRequest 的标签页/窗口。单个基于 Web 的支付处理器 不应被允许使用此方法打开多个客户端窗口。
我们是否应该改为引用 Service Workers 规范, 而不是复制它们的步骤?
PaymentRequestEvent。
isTrusted 属性为
false,则返回一个
被拒绝并带有 "InvalidStateError" DOMException 的
Promise。
PaymentRequestEvent
的
PaymentRequest。
Promise。
about:blank,则返回一个
被 TypeError
拒绝的
Promise。
Promise。
Promise。
[[windowClient]] 不为 null,则:
[[windowClient]].visibilityState
不为 "unloaded",则用一个
"InvalidStateError"
DOMException
拒绝 promise,
并中止这些步骤。
[[windowClient]] 设为
client。
PaymentRequestEvent
的示例
本节为非规范性内容。
本示例展示了如何编写一个监听
PaymentRequestEvent
的 service worker。
当接收到一个
PaymentRequestEvent 时,
service worker 会打开一个窗口与用户交互。
async function getPaymentResponseFromWindow() {
return new Promise((resolve, reject) => {
self.addEventListener("message", listener = e => {
self.removeEventListener("message", listener);
if (!e.data || !e.data.methodName) {
reject();
return;
}
resolve(e.data);
});
});
}
self.addEventListener("paymentrequest", e => {
e.respondWith((async() => {
// Open a new window for providing payment UI to user.
const windowClient = await e.openWindow("payment_ui.html");
// Send data to the opened window.
windowClient.postMessage({
total: e.total,
modifiers: e.modifiers
});
// Wait for a payment response from the opened window.
return await getPaymentResponseFromWindow();
})());
});
使用上文描述的简单方案,一个加载到 基于 Web 的支付处理器窗口中的简单 HTML 页面可能如下所示:
<form id="form">
<table>
<tr><th>Cardholder Name:</th><td><input name="cardholderName"></td></tr>
<tr><th>Card Number:</th><td><input name="cardNumber"></td></tr>
<tr><th>Expiration Month:</th><td><input name="expiryMonth"></td></tr>
<tr><th>Expiration Year:</th><td><input name="expiryYear"></td></tr>
<tr><th>Security Code:</th><td><input name="cardSecurityCode"></td></tr>
<tr><th></th><td><input type="submit" value="Pay"></td></tr>
</table>
</form>
<script>
navigator.serviceWorker.addEventListener("message", e => {
/* Note: message sent from payment app is available in e.data */
});
document.getElementById("form").addEventListener("submit", e => {
const details = {};
["cardholderName", "cardNumber", "expiryMonth", "expiryYear", "cardSecurityCode"]
.forEach(field => {
details[field] = form.elements[field].value;
});
const paymentAppResponse = {
methodName: "https://example.com/pay",
details
};
navigator.serviceWorker.controller.postMessage(paymentAppResponse);
window.close();
});
</script>
用户代理通过对提供给相应
PaymentRequestEvent
接口的
respondWith 函数的 Promise
进行解析,来接收来自基于 Web 的
支付处理器的成功响应。应用程序应当使用一个包含支付响应的
PaymentHandlerResponse 实例来解析该
Promise。若用户取消或发生错误,
应用程序可以通过拒绝该 Promise 来表示失败。
PaymentHandlerResponse 通过以下字典进行传递:
WebIDLdictionary PaymentHandlerResponse {
DOMString methodName;
object details;
DOMString? payerName;
DOMString? payerEmail;
DOMString? payerPhone;
AddressInit shippingAddress;
DOMString? shippingOption;
};
一个可 JSON 序列化 的对象, 它提供一条特定于 支付 方式 的消息,供商家用来处理该 交易并确定资金是否成功转移。
用户提供的付款人姓名。
用户提供的付款人电子邮件。
用户提供的付款人电话号码。
用户提供的配送地址。
用户所选配送选项的标识符。
当以 methodName 和 methodDetails 参数调用此算法时,用户代理 必须 运行 以下步骤:
null。
InvalidStateError" DOMException。
PaymentRequestDetailsUpdate。
当以 shippingAddress 或 shippingOption 调用此算法时,用户代理 必须 运行以下 步骤:
null。
InvalidStateError" DOMException。
PaymentRequestDetailsUpdate。
当以 event 和 handlerResponsePromise 参数调用此算法时,用户代理 必须 运行 以下步骤:
isTrusted 为 false,
则抛出一个
"InvalidStateError" DOMException 并中止
这些步骤。
InvalidStateError" DOMException 并中止
这些步骤。
[[respondWithCalled]] 为 true,则抛出一个
"InvalidStateError" DOMException 并中止
这些步骤。
[[respondWithCalled]] 设为 true。
PaymentHandlerResponse。
如果此过程抛出异常,则用一个
"OperationError"
DOMException
运行 支付应用
失败算法,
并终止这些步骤。
methodName
不存在,
或未设置为来自
event.methodData
的值之一,
则用一个
"OperationError"
DOMException
运行
支付应用失败算法,
并终止这些
步骤。
details 不存在
或不可 JSON 序列化,
则用一个
"OperationError"
DOMException
运行 支付应用
失败算法,
并终止这些步骤。
shippingAddress
不存在,则用一个
"OperationError"
DOMException
运行 支付应用失败
算法,
并终止
这些步骤。
shippingOption
不存在,
或未设置为来自 event.shippingOptions
的配送选项标识符之一,
则用一个
"OperationError"
DOMException
运行 支付应用
失败算法,
并终止这些
步骤。
payerName
不存在,
则用一个
"OperationError"
DOMException
运行 支付应用
失败算法,
并终止这些
步骤。
payerEmail
不存在,
则用一个
"OperationError"
DOMException
运行 支付应用
失败算法,
并终止这些
步骤。
payerPhone
不存在,
则用一个
"OperationError"
DOMException
运行 支付应用
失败算法,
并终止这些
步骤。
OperationError"
DOMException
运行
支付应用
失败算法,
并终止这些
步骤。
以下示例展示了如何响应支付请求:
paymentRequestEvent.respondWith(new Promise(function(accept,reject) {
/* ... processing may occur here ... */
accept({
methodName: "https://example.com/pay",
details: {
cardHolderName: "John Smith",
cardNumber: "1232343451234",
expiryMonth: "12",
expiryYear : "2020",
cardSecurityCode: "123"
},
shippingAddress: {
addressLine: [
"1875 Explorer St #1000",
],
city: "Reston",
country: "US",
dependentLocality: "",
organization: "",
phone: "+15555555555",
postalCode: "20190",
recipient: "John Smith",
region: "VA",
sortingCode: ""
},
shippingOption: "express",
payerEmail: "john.smith@gmail.com",
});
}));
[payment-request] 定义了一个 ID,生态系统中的各方 (包括支付应用提供商和收款方)可以在网络 或其他故障发生后使用它进行 对账。
当以 reason 调用此算法时,用户代理 必须 运行 以下步骤:
OperationError" DOMException,则运行
[payment-request] 中定义的
支付
处理器指示内部错误算法。
本规范的先前版本并未定义当
支付应用
失败算法 被
调用时会发生什么。实际上,实现者的行为如同
运行了
用户
中止支付请求算法。
为了尽可能保持向后兼容,同时
仍然引入一种让基于 Web 的支付处理器指示
内部错误的方式,本规范现将除
"OperationError"
DOMException
之外的所有
reason 值映射为用户中止。未来
版本的本规范可能会增加其他受处理的值。
由于隐私问题,Web Payments Working Group 在 Payment Request API 的原始版本中移除了对配送地址和 账单地址的支持;参见 issue 842。为了给那些仍继续支持此能力的实现提供文档,工作组现正 恢复该特性,并期望解决相关隐私 问题。在这样做的同时,工作组也可能基于其他 API 的演进(例如 Content Picker API)对 Payment Request API 作出修改。
CanMakePaymentEvent 将会在已注册的
基于 Web 的支付处理器中触发,这些处理器来自一个有限的源集合:支付方式清单的源
以及它们的 支持的
源。
该事件会在用户选择该支付处理器之前触发,
但它不包含关于触发源(即
商家网站)的任何信息,因此不能被直接用于跟踪用户。
CanMakePaymentEvent 进行时序攻击的风险:
CanMakePaymentEvent 向已安装的
基于 Web 的支付处理器触发。CanMakePaymentEvent 的支持。
CanMakePaymentEvent 将在已注册的基于 Web 的支付
处理器中触发,这些处理器能够在需要时提供商家请求的所有信息,
包括配送地址和付款人的联系信息。
CanMakePaymentEvent 事件不应在
隐私浏览模式下触发。用户代理应当表现得如同
respondWith()
被以 false 调用一样。我们承认由此带来的风险:如果某个
实体同时控制 Payment Request API 调用的源以及
基于 Web 的支付处理器的源,那么该实体可能能够
推断出用户可能正处于隐私浏览模式。
本节为非规范性内容。
在对基于 Web 的支付处理器进行排序时,期望用户代理 优先遵从用户偏好而非其他偏好。期望用户代理 允许手动配置选项,例如为某个源设置首选的 基于 Web 的支付处理器显示顺序,或者为所有 源设置统一顺序。
用户体验细节留给实现者决定。
本规范依赖于若干其他基础规范。
JSON.stringify
由
[ECMASCRIPT] 定义。
ServiceWorkerRegistration、
ServiceWorkerGlobalScope、
fire
functional event、extend
lifetime
promises、pending
promises
count、containing
service worker registration、
Try
Clear Registration、Try
Activate、
ExtendableEvent、
ExtendableEventInit、
以及 scope URL
定义于 [SERVICE-WORKERS]。
除了标记为非规范性的章节外,本规范中的所有编写指南、图表、示例和注释 也都是非规范性的。本规范中的其他所有内容均为规范性内容。
本文档中的关键词 MAY、MUST、SHOULD、 以及 SHOULD NOT 应按 BCP 14 [RFC2119] [RFC8174] 中所描述的方式进行解释, 但前提是,并且仅当,它们像这里这样以全大写形式 出现时。
只有一种产品类别可以声称符合本 规范:即 用户代理。
用户代理可以以本规范中给出的任意方式实现算法, 只要最终结果与按本规范算法所得到的 结果不可区分。
用户代理可以对原本不受约束的输入施加实现特定限制,
例如为了防止拒绝服务攻击、避免
内存耗尽,或为了规避
平台特定限制。当输入超过
实现特定限制时,用户代理必须抛出,或者在
Promise 的上下文中,以一个 TypeError 拒绝,并可选地
告知
开发者某个特定输入是如何超过
实现特定限制的。
WebIDLpartial interface ServiceWorkerRegistration {
[SameObject] readonly attribute PaymentManager paymentManager;
};
[SecureContext, Exposed=(Window)]
interface PaymentManager {
attribute DOMString userHint;
Promise<undefined> enableDelegations(sequence<PaymentDelegation> delegations);
};
enum PaymentDelegation {
"shippingAddress",
"payerName",
"payerPhone",
"payerEmail"
};
partial interface ServiceWorkerGlobalScope {
attribute EventHandler oncanmakepayment;
};
[Exposed=ServiceWorker]
interface CanMakePaymentEvent : ExtendableEvent {
constructor(DOMString type);
undefined respondWith(Promise<boolean> canMakePaymentResponse);
};
partial interface ServiceWorkerGlobalScope {
attribute EventHandler onpaymentrequest;
};
dictionary PaymentRequestDetailsUpdate {
DOMString error;
PaymentCurrencyAmount total;
sequence<PaymentDetailsModifier> modifiers;
sequence<PaymentShippingOption> shippingOptions;
object paymentMethodErrors;
AddressErrors shippingAddressErrors;
};
[Exposed=ServiceWorker]
interface PaymentRequestEvent : ExtendableEvent {
constructor(DOMString type, optional PaymentRequestEventInit eventInitDict = {});
readonly attribute USVString topOrigin;
readonly attribute USVString paymentRequestOrigin;
readonly attribute DOMString paymentRequestId;
readonly attribute FrozenArray<PaymentMethodData> methodData;
readonly attribute object total;
readonly attribute FrozenArray<PaymentDetailsModifier> modifiers;
readonly attribute object? paymentOptions;
readonly attribute FrozenArray<PaymentShippingOption>? shippingOptions;
Promise<WindowClient?> openWindow(USVString url);
Promise<PaymentRequestDetailsUpdate?> changePaymentMethod(DOMString methodName, optional object? methodDetails = null);
Promise<PaymentRequestDetailsUpdate?> changeShippingAddress(optional AddressInit shippingAddress = {});
Promise<PaymentRequestDetailsUpdate?> changeShippingOption(DOMString shippingOption);
undefined respondWith(Promise<PaymentHandlerResponse> handlerResponsePromise);
};
dictionary PaymentRequestEventInit : ExtendableEventInit {
USVString topOrigin;
USVString paymentRequestOrigin;
DOMString paymentRequestId;
sequence<PaymentMethodData> methodData;
PaymentCurrencyAmount total;
sequence<PaymentDetailsModifier> modifiers;
PaymentOptions paymentOptions;
sequence<PaymentShippingOption> shippingOptions;
};
dictionary PaymentHandlerResponse {
DOMString methodName;
object details;
DOMString? payerName;
DOMString? payerEmail;
DOMString? payerPhone;
AddressInit shippingAddress;
DOMString? shippingOption;
};
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: