Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
本规范定义了使 Web 应用能够处理支付请求的能力。
本节描述了本文件在发布时的状态。可在 W3C 标准和草案索引 中找到当前的 W3C 出版物列表以及本技术报告的最新修订版。
Web Payments 工作组维护着一份该工作组尚未处理的所有错误报告列表。本草案强调了一些仍待在工作组内讨论的未决问题。尚未就这些问题的结论作出决定,也未决定它们是否有效。强烈鼓励提交包含针对未决问题的规范文本建议的拉取请求。
本文档由Web Payments 工作组作为工作草案发布,使用了 Recommendation track。
作为工作草案发布并不意味着得到 W3C 及其成员的认可。
这是一个草案文档,可能随时被更新、替换或被其他文档废弃。不宜将此文档引用为除正在进行的工作之外的资料。
本文档由在以下政策下运作的小组产生: W3C 专利政策。 W3C 维护一份与该小组交付物相关的任何专利披露的公开列表;该页面还包含披露专利的说明。任何实际知道并认为包含必要权利要求(Essential Claim(s))的专利的个人,必须按照 W3C 专利政策第6节的规定披露该信息。
本文档受2025年8月18日的 W3C 流程文档的约束。
本节为非规范性内容。
本规范定义了若干新功能,使 Web 应用能够代表用户处理支付请求:
PaymentRequestEvent)。一个
支付处理程序 是该 PaymentRequestEvent 的事件处理程序。
PaymentManager),用于管理支付处理程序的属性。
PaymentRequestEvent
作出响应的机制。
本规范不涉及使用操作系统特定机制(即“原生应用”)构建的软件如何处理支付请求。
在本文档中,我们设想以下流程:
PaymentRequestEvent(参见
用户交互任务源)。该
PaymentRequestEvent 包含来自
PaymentRequest(定义于 [payment-request])的一些信息以及额外的信息(例如收款方的来源)。
一个来源可能使用不止一个 service worker 实现支付应用,因此每个来源可能注册多个 支付处理程序。实际调用哪个处理程序由用户的选择决定。
本节为非规范性内容。
一个 支付处理程序 是可以代表用户处理支付请求的 Web 应用。
支付处理程序的逻辑由其支持的支付方法驱动。有些支付方法对支付处理程序的处理要求很少或几乎没有,支付处理程序只需在响应中返回支付卡详情。随后由收款方网站使用返回的数据作为输入来处理支付。
相比之下,一些支付方法,例如加密货币支付或银行发起的信用转账,要求支付处理程序发起支付处理。在此类情况下,支付处理程序将返回一个支付参考、端点 URL 或其他数据,收款方网站可以使用这些数据来确定支付结果(而不是自己处理支付)。
处理支付请求可能包括大量交互:通过新窗口或其他 API(例如 Web Cryptography API)与用户交互,或通过网络请求或其它方式与其他服务和来源交互。
本规范不涉及在支付处理程序接受 PaymentRequestEvent
与支付处理程序返回响应之间发生的这些活动。所有可能需要配置支付处理程序和处理支付请求的活动均由支付处理程序的实现来完成,包括:
因此,一个来源将依赖许多由其他地方定义的 Web 技术来进行生命周期管理、安全、用户认证、用户交互等。
本节为非规范性内容。
本规范不涉及第三方移动支付应用如何通过专有机制与用户代理交互,也不涉及用户代理自身如何提供简单的支付应用功能。
可以通过即时注册(just-in-time, JIT)机制在用户代理中注册支付处理程序。
如果在商家调用 show()
方法时未注册相应的支付处理程序,用户代理可以允许用户在交易过程中注册该支付处理程序(“及时注册”)。
本节其余内容为非规范性。
用户代理可以通过从商家请求的 基于 URL 的支付方法标识符 找到的 payment method manifest 推导出支付处理程序信息,从而执行即时安装。
本节描述了支付处理程序用于管理自身属性的功能。
WebIDLpartial interface ServiceWorkerRegistration {
[SameObject] readonly attribute PaymentManager paymentManager;
};
paymentManager 属性公开了支付处理程序的管理功能。
WebIDL[SecureContext, Exposed=(Window)]
interface PaymentManager {
attribute DOMString userHint;
Promise<undefined> enableDelegations(sequence<PaymentDelegation> delegations);
};
PaymentManager 被 支付处理程序 用于管理其支持的委托类型。
在显示支付处理程序名称和图标时,用户代理可使用此字符串来提升用户体验。例如,用户提示 "**** 1234" 可以提醒用户该支付处理程序可用于特定的卡。
此方法允许 支付处理程序 异步声明其支持的 PaymentDelegation 列表。
WebIDLenum PaymentDelegation {
"shippingAddress",
"payerName",
"payerPhone",
"payerEmail"
};
shippingAddress"
payerName"
payerPhone"
payerEmail"
如果 支付处理程序支持 CanMakePaymentEvent,则
用户代理可以使用它来帮助筛选可用的支付处理程序。
实现可以对开发者响应
CanMakePaymentEvent施加超时时间。如果超时到期,
则实现的行为等同于调用了 respondWith() 且参数为
false。
WebIDLpartial interface ServiceWorkerGlobalScope {
attribute EventHandler oncanmakepayment;
};
oncanmakepayment
属性是一个
事件处理程序,
其对应的事件处理程序事件类型为
"canmakepayment"。
CanMakePaymentEvent
用作信号,用于表明支付处理程序是否能够响应支付请求。
WebIDL[Exposed=ServiceWorker]
interface CanMakePaymentEvent : ExtendableEvent {
constructor(DOMString type);
undefined respondWith(Promise<boolean> canMakePaymentResponse);
};
支付处理程序使用此方法来表明其是否可以响应支付请求。
通过 PaymentRequest 收到请求后,用户代理必须(MUST) 运行以下步骤:
CanMakePaymentEvent(例如在私密浏览模式下),
则终止这些步骤。
ServiceWorkerRegistration。
使用 触发功能事件
"canmakepayment",并在 registration 上使用
CanMakePaymentEvent。
CanMakePaymentEvent 的示例
本节为非规范性内容。
此示例展示如何编写一个监听
CanMakePaymentEvent 的 service worker。当收到
CanMakePaymentEvent 时,service worker 始终返回
true。
self.addEventListener("canmakepayment", function(e) {
e.respondWith(new Promise(function(resolve, reject) {
resolve(true);
}));
});
给定一个 PaymentMethodData
和一个依据
支付方法标识符匹配的支付处理程序,如果该支付处理程序可用于支付,则此算法返回
true:
ServiceWorkerRegistration
作用域 URL 的来源(origin)。
"*" 字符串,则返回 true。
CanMakePaymentEvent 并返回其结果。
CanMakePaymentEvent 并返回其结果。
false。
一旦用户选择了支付处理程序,用户代理就会触发
PaymentRequestEvent,并使用随后得到的
PaymentHandlerResponse 来为
[payment-request] 创建一个 PaymentResponse。
Payment Request API 支持将管理中止的职责委托给支付应用。现有提议是在 Payment Handler 接口中添加 paymentRequestAborted 事件。该事件将包含一个 respondWith 方法,接受一个布尔参数,用以指示 paymentRequest 是否已成功中止。
ServiceWorkerGlobalScope
的扩展
本规范扩展了 ServiceWorkerGlobalScope
接口。
WebIDLpartial interface ServiceWorkerGlobalScope {
attribute EventHandler onpaymentrequest;
};
onpaymentrequest
属性是一个 事件处理程序,
其对应的事件处理程序事件类型为
PaymentRequestEvent。
PaymentRequestDetailsUpdate
包含更新后的总额(可选地包含修饰符和配送选项)以及因用户选择支付方法、收货地址或配送选项而产生的可能错误,这些选择发生在支付处理程序中。
WebIDLdictionary PaymentRequestDetailsUpdate {
DOMString error;
PaymentCurrencyAmount total;
sequence<PaymentDetailsModifier> modifiers;
sequence<PaymentShippingOption> shippingOptions;
object paymentMethodErrors;
AddressErrors shippingAddressErrors;
};
人类可读的字符串,用于解释为何用户选择的支付方法、收货地址或配送选项无法使用。
基于变更后的支付方法、收货地址或配送选项而更新的总额。例如,总额可能因用户所选支付方法的账单地址改变了增值税(VAT)而变化;或者因用户所选/提供的配送选项/地址改变了配送费用而变化。
基于变更后的支付方法、收货地址或配送选项而更新的修饰符。例如,如果根据账单或收货地址总体总额增加了 €1.00,则每个修饰符中指定的总额也应增加 €1.00。
基于变更后的收货地址而更新的 shippingOptions。例如,对于用户提供的国家/地区,加急配送可能更昂贵或不可用。
支付方法的校验错误(如有)。
收货地址的校验错误(如有)。
PaymentRequestEvent 表示在用户选择之后,支付处理程序可用的数据和方法。用户代理会将 PaymentRequest 中可用数据的一个子集传递给支付处理程序。
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);
};
返回一个字符串,指示顶层 收款方网页的来源(origin)。 此属性由处理 PaymentRequestEvent进行初始化。
返回一个字符串,指示
PaymentRequest
被初始化的来源。
当 PaymentRequest
在 topOrigin
中初始化时,这两个属性具有相同的值;否则二者不同。
例如,当 PaymentRequest
在一个来源不同于 topOrigin 的 iframe
中初始化时,此属性值为该 iframe 的来源。此属性由
处理 PaymentRequestEvent进行初始化。
获取时,paymentRequestId
属性返回与此 PaymentRequestEvent
对应的
PaymentRequest 的
[[details]].id。
此属性包含若干 PaymentMethodData 字典,包含网站可接受的支付方法标识符以及任何相关的特定 支付方法数据。它由 PaymentRequest 使用下文定义的 方法数据填充算法进行填充。
此属性表示请求支付的总金额。其类型为
PaymentCurrencyAmount
字典(定义见 [payment-request]),并使用在实例化相应
PaymentRequest 对象时所提供的
total 字段的副本进行初始化。
此 PaymentDetailsModifier 字典序列包含针对特定支付方法标识符的修饰符(例如,如果基于每种支付方法,支付金额或货币类型有所不同)。它由 PaymentRequest 使用下文定义的 修饰符填充算法进行填充。
相应 PaymentRequest 中 PaymentOptions 的取值。 仅当请求收货地址和/或付款人联系信息的任意子集时可用。
相应 PaymentDetailsInit 字典中的 ShippingOptions 的取值。(PaymentDetailsInit 继承了 PaymentDetailsBase 的 ShippingOptions)。仅当请求收货地址时可用。
支付处理程序使用此方法向用户显示一个窗口。调用时,将运行 打开窗口算法。
支付处理程序使用此方法,根据诸如账单地址等支付方法详情获取更新后的总额。调用时,将运行 变更支付方法算法。
支付处理程序使用此方法,基于 shippingAddress 获取更新后的支付详情。调用时,将运行 变更支付详情算法。
支付处理程序使用此方法,依据 shippingOption 标识符获取更新后的支付详情。调用时,将运行 变更支付详情算法。
当支付成功完成时,支付处理程序使用此方法提供
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 的值,用户代理
必须(MUST)执行以下步骤或等效步骤:
methodData 设为
dataList。
为初始化 modifiers 的值,用户代理
必须(MUST)执行以下步骤或等效步骤:
modifiers
中的每个条目,执行以下步骤:
total 设为
inModifier.total 的副本。
modifiers 设为
modifierList。
PaymentRequestEvent
的实例会使用下表中的内部槽进行创建:
| 内部槽 | 默认值 | 说明(非规范性) |
|---|---|---|
| [[windowClient]] | null | 当前活动的 WindowClient。若支付处理程序当前正向用户显示一个窗口,则会设置该值;否则为 null。 |
| [[respondWithCalled]] | false | YAHO |
通过 PaymentRequest.PaymentRequest.show() 接收到 PaymentRequest,并且用户随后选择了支付处理程序后,用户代理 必须(MUST)运行以下步骤:
ServiceWorkerRegistration。
InvalidStateError"
DOMException
拒绝由
PaymentRequest.show()
创建的 Promise,并终止这些步骤。
使用 触发功能事件
"paymentrequest",并在 registration 上使用
PaymentRequestEvent,且具有以下属性:
topOrigin
paymentRequestOrigin
methodData
modifiers
total
paymentRequestId
paymentOptions
shippingOptions
然后与 dispatchedEvent 并行运行以下步骤:
PaymentHandlerResponse,
则以一个
"OperationError"
DOMException
拒绝由
PaymentRequest.show()
创建的 Promise。
被调用的支付处理程序可能需要也可能不需要显示自身信息或请求用户输入。潜在的支付处理程序显示示例如下:
需要可视化显示和用户交互的支付处理程序可以调用 openWindow() 向用户显示页面。
由于用户代理知道该方法与
PaymentRequestEvent
相连接,它们SHOULD以与流程一致且不让用户困惑的方式呈现窗口。所得到的窗口客户端会绑定到发起
PaymentRequest 的选项卡/窗口。单个支付处理程序SHOULD
NOT被允许通过此方法打开超过一个的客户端窗口。
我们是否应该引用 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();
})());
});
使用上述的简单方案,被加载到支付处理程序窗口中的一个简单 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>
WebIDLdictionary PaymentHandlerResponse {
DOMString methodName;
object details;
DOMString? payerName;
DOMString? payerEmail;
DOMString? payerPhone;
AddressInit shippingAddress;
DOMString? shippingOption;
};
一个可 JSON 序列化的对象,提供由商户用于处理交易并确定资金成功转移的特定于 支付方法的消息。
用户代理通过对应
PaymentRequestEvent
接口的 respondWith 函数所提供
Promise 的解决来接收来自支付处理程序的成功响应。应用应以包含支付响应的
PaymentHandlerResponse 实例来解决该
Promise。若发生用户取消或错误,应用可以通过拒绝该 Promise 来表示失败。
如果 Promise 被拒绝,用户代理MUST运行 支付应用失败算法。该算法的具体细节由实现者决定。可接受的行为包括但不限于:
用户提供的付款人姓名。
用户提供的付款人电子邮件。
用户提供的付款人电话号码。
用户提供的收货地址。
用户所选配送选项的标识符。
当以 methodName 和 methodDetails 参数调用此算法时,用户代理MUST运行以下步骤:
null。
InvalidStateError"
DOMException。
PaymentRequestDetailsUpdate。
当以 shippingAddress 或 shippingOption 调用此算法时,用户代理MUST运行以下步骤:
null。
InvalidStateError"
DOMException。
PaymentRequestDetailsUpdate。
当以 event 和 handlerResponsePromise 参数调用此算法时,用户代理MUST运行以下步骤:
isTrusted 为 false,
则抛出 "InvalidStateError"
DOMException 并中止这些步骤。
InvalidStateError"
DOMException 并中止这些步骤。
[[respondWithCalled]] 为 true,则抛出
"InvalidStateError"
DOMException 并中止这些步骤。
[[respondWithCalled]] 设为 true。
PaymentHandlerResponse。若此操作抛出异常,
则运行 支付应用失败算法 并中止这些步骤。
methodName
不存在,或未设置为 event 的
methodData
中的某个值,则运行
支付应用失败算法
并中止这些步骤。
details
不存在或不是可 JSON
序列化的,
则运行 支付应用失败算法
并中止这些步骤。
shippingAddress
不存在,则运行 支付应用失败算法 并中止这些步骤。
shippingOption
不存在,或未设置为来自 event 的
shippingOptions
中的某个配送选项标识符,则运行
支付应用失败算法
并中止这些步骤。
payerName
不存在,则运行
支付应用失败算法
并中止这些步骤。
payerEmail
不存在,则运行
支付应用失败算法
并中止这些步骤。
payerPhone
不存在,则运行
支付应用失败算法
并中止这些步骤。
以下示例展示如何响应支付请求:
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,生态系统中的各方(包括支付应用提供方和收款方)可在网络或其他故障后使用其进行对账。
由于隐私问题,Web Payments 工作组从最初版本的 Payment Request API 中移除了对收货地址和账单地址的支持;参见 issue 842。为给仍继续支持此能力的实现提供文档,工作组现正恢复该功能,并期望同时解决隐私问题。在此过程中,工作组也可能基于其他 API 的演进(例如 Content Picker API)对 Payment Request API 进行更改。
CanMakePaymentEvent,这些处理程序来自有限集合的来源:支付方法清单的来源及其
受支持来源。该事件在用户选择该支付处理程序之前就会触发,但其中不包含关于触发来源(即商家网站)的信息,因此不能直接用于跟踪用户。
CanMakePaymentEvent
进行计时攻击的风险:
CanMakePaymentEvent。
CanMakePaymentEvent
的支持。
CanMakePaymentEvent
将会在那些能够在需要时提供商家所请求全部信息(包括收货地址与付款人联系信息)的已注册支付处理程序中触发。
CanMakePaymentEvent
事件在私密浏览模式下不应被触发。用户代理应表现得如同
respondWith()
被以 false 作为参数调用。我们承认由此带来的风险:如果某个实体同时控制发起 Payment Request API
调用的来源与支付处理程序的来源,该实体可能推断出用户处于私密浏览模式。
本节为非规范性内容。
在排序支付处理程序时,预期用户代理应优先遵从用户偏好而非其他偏好。预期用户代理应允许手动配置选项,例如为某个来源或所有来源设置首选的支付处理程序显示顺序。
用户体验细节留给实现者决定。
本规范依赖于若干其他底层规范。
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] 所述,仅当且仅当这些词以此处所示的全大写形式出现时适用。
只有一种产品类别可以宣称符合本规范:用户代理。
只要最终结果与按照本规范算法所得结果不可区分,用户代理MAY以任何期望的方式实现本规范中给出的算法。
用户代理MAY对原本无限制的输入施加与实现相关的限制,例如为了防止拒绝服务攻击、避免内存耗尽或绕开平台特定限制。当某个输入超出与实现相关的限制时,用户代理MUST抛出,或在 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: