Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、Webアプリケーションが支払い要求を処理できる機能を定義します。
このセクションは、本書の公開時点での状態を説明します。現在の W3C の刊行物の一覧および本技術報告書の最新改訂版は、W3C の標準と草案の索引で確認できます。
Web Payments Working Group は、グループがまだ対応していないすべてのバグ報告の一覧を 管理しています。この草案では、作業部会でまだ議論される保留中のいくつかの問題点を示しています。これらの問題(有効かどうかを含む)の結論についてはまだ決定されていません。未解決の問題に対する仕様案を含むプルリクエストは歓迎されます。
この文書は、Web Payments Working Group によって、勧告トラックを使用した作業草案として公開されました。
作業草案としての公開は、W3C およびそのメンバーによる支持を意味するものではありません。
本書は草案であり、いつでも更新、置換、または他の文書により廃止される可能性があります。本書を作業中の文書以外として引用することは適切ではありません。
本書は、W3C 特許方針の下で運営されるグループによって作成されました。 W3C は、グループの成果物に関連して行われたあらゆる特許開示の 公開リスト を維持しています;そのページには特許を開示するための手順も含まれます。個人が、当該個人が本質的な請求(Essential Claim(s))を含むと信じる特許を実際に知っている場合は、W3C 特許方針の第6節に従ってその情報を開示する必要があります。
この文書は、2025年8月18日 の W3C プロセス文書に従って管理されています。
このセクションは規範ではありません。
この仕様は、Webアプリケーションがユーザーに代わって支払い要求を処理できるようにするためのいくつかの新機能を定義します:
PaymentRequestEvent)。支払いハンドラはPaymentRequestEventのイベントハンドラです。PaymentManager)により、支払いハンドラのプロパティを管理します。PaymentRequestEventに応答する仕組み。この仕様は、オペレーティングシステム固有の仕組み(いわゆる「ネイティブアプリ」)で作られたソフトウェアがどのように支払い要求を処理するかについては扱いません。
本文書では次のフローを想定します:
PaymentRequestEvent を(user
interaction task sourceを参照)選択された支払いハンドラの service worker 内で発火します。PaymentRequestEvent には
PaymentRequest([payment-request]で定義) からの情報や、支払い先のオリジンなどの追加情報が含まれます。
あるオリジンは複数の service worker を用いて支払いアプリを実装することができ、そのためオリジンごとに複数の支払いハンドラが登録される場合があります。どのハンドラが呼び出されるかはユーザーの選択によって決まります。
このセクションは規範ではありません。
支払いハンドラは、ユーザーに代わって支払い要求を処理できるWebアプリケーションです。
支払いハンドラのロジックは、サポートする支払い方法によって駆動されます。いくつかの支払い方法は支払いハンドラによるほとんど処理を必要とせず、単に支払いカードの詳細を応答として返すだけです。その場合は、返されたデータを入力として支払いを処理するのはpayeeのウェブサイトの役割です。
対照的に、暗号通貨の支払いや銀行発のクレジット振替のように、支払いハンドラが支払いの処理を開始することを要求する支払い方法もあります。そのような場合、支払いハンドラは支払い参照、エンドポイントURL、あるいはpayeeのウェブサイトが支払いの結果を判定するのに使用できるその他のデータを返します(支払い自体を処理するのではなく)。
支払い要求の処理には、多数の相互作用が含まれることがあります:新しいウィンドウや他のAPI(例えばWeb Cryptography API)を通じたユーザーとのやり取り、またはウェブリクエストなどを通じた他のサービスやオリジンとのやり取りなどです。
この仕様は、PaymentRequestEvent
を支払いハンドラが受け入れてから支払いハンドラが応答を返すまでに発生するこれらの活動については扱いません。支払いハンドラを構成し支払い要求を処理するために必要となる可能性のあるこれらすべての活動は、支払いハンドラの実装に委ねられます。例えば:
したがって、オリジンはライフサイクル管理、セキュリティ、ユーザー認証、ユーザーとの対話などのために他の多くのWeb技術に依存します。
このセクションは規範ではありません。
この仕様は、サードパーティのモバイル支払いアプリがユーザーエージェントとどのように(独自の仕組みを通じて)相互作用するか、あるいはユーザーエージェント自体がどのように簡易的な支払いアプリ機能を提供するかを扱うものではありません。
支払いハンドラは、ユーザーエージェントに対してジャストインタイム(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 は支払いハンドラが自身のサポートする委任(delegations)を管理するために使用されます。
支払いハンドラ名とアイコンを表示する際、ユーザーエージェントはこの文字列を用いてユーザー体験を向上させる場合があります。例えば "**** 1234" のような user hint は特定のカードがこの支払いハンドラ経由で利用可能であることをユーザーに思い出させることができます。
このメソッドは支払いハンドラが非同期にサポートする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 とする。
"*" 文字列のサポートされるオリジンを持つURL
ベースの支払い方法識別子であるなら、true を返す。
CanMakePaymentEvent を発火し、その結果を返す。
CanMakePaymentEvent を発火し、その結果を返す。
false を返す。
ユーザーが支払いハンドラを選択すると、ユーザーエージェントは
PaymentRequestEvent を発火し、その後の PaymentHandlerResponse を用いて [payment-request] の PaymentResponse を作成する。
Payment Request API は、中止(abort)の管理責任を支払いアプリに委任することをサポートしている。Payment Handler インターフェイスに paymentRequestAborted イベントを追加する提案がある。このイベントは、paymentRequest が正常に中止されたかどうかを示す boolean パラメータを取る respondWith メソッドを持つ。
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 は、ユーザーによる選択後に 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);
};
最上位のorigin(payee のウェブページ)の文字列を返す。この属性は、PaymentRequestEvent の処理により初期化される。
PaymentRequest が初期化されたorigin
を示す文字列を返す。PaymentRequest が topOrigin
内で初期化された場合、両属性は同じ値を持ち、そうでない場合は異なる値を持つ。例えば、PaymentRequest が topOrigin とは異なるオリジンの iframe
内で初期化された場合、この属性の値はその iframe のオリジンとなる。この属性は PaymentRequestEvent の処理 により初期化される。
取得時、paymentRequestId
属性は、この PaymentRequestEvent
に対応する PaymentRequest の [[details]].id を返す。
この属性には、ウェブサイトが受け入れる支払い方法識別子および関連する各支払い方法固有データを含む PaymentMethodData 辞書が含まれる。これは、下記で定義する MethodData の生成アルゴリズム を用いて PaymentRequest から設定される。
この属性は、支払いに要求されている合計額を示す。これは [payment-request] で定義される
PaymentCurrencyAmount
辞書型であり、対応する PaymentRequest
オブジェクトが生成された際に提供された total
フィールドのコピーで初期化される。
この PaymentDetailsModifier 辞書の列は、特定の支払い方法識別子に対する修飾子を含む(例:支払い金額や通貨種別が支払い方法ごとに異なる場合)。これは、下記で定義する Modifiers の生成アルゴリズム を用いて 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() によって受け取り、その後ユーザーが支払いハンドラを選択した場合、ユーザーエージェントは次の手順を MUST 実行する:
ServiceWorkerRegistration
とする。
Promise を、PaymentRequest.show()
によって作成されたものに対して "InvalidStateError" の
DOMException
で拒否し、これらの手順を終了する。
機能イベントを発火
"paymentrequest" を、registration 上で PaymentRequestEvent
を用いて、次のプロパティとともに行う:
topOrigin
paymentRequestOrigin
methodData
modifiers
total
paymentRequestId
paymentOptions
shippingOptions
その後、dispatchedEvent について並行して次の手順を実行する:
PaymentHandlerResponse
を提供していない場合、Promise(PaymentRequest.show()
によって作成されたもの)を "OperationError" の
DOMException
で拒否する。
呼び出された支払いハンドラは、自身に関する情報を表示したり、ユーザー入力を求めたりする必要がある場合とない場合がある。支払いハンドラの表示の例としては次のようなものがある:
表示やユーザーとの対話を必要とする 支払いハンドラは、openWindow() を呼び出してユーザーにページを表示できる。
ユーザーエージェントは、このメソッドが
PaymentRequestEvent
と関連していることを知っているため、ユーザーのフローと整合し、混乱を招かない方法でウィンドウを描画するべきである(SHOULD)。生成されるウィンドウクライアントは、
PaymentRequest
を開始したタブ/ウィンドウに結び付けられる。単一の 支払いハンドラが、このメソッドを用いて複数のクライアントウィンドウを開くことは許されるべきではない(SHOULD NOT)。
このアルゴリズムは、Service Workers 仕様の ウィンドウを開くアルゴリズム に類似している。
手順を転載する代わりに、Service Workers 仕様を参照すべきだろうか?
PaymentRequestEvent とする。
isTrusted 属性が
false の場合、"InvalidStateError" の
DOMException で拒否された
Promise を返す。
PaymentRequestEvent をトリガーした PaymentRequest とする。
Promise を返す。
about:blank の場合、TypeError で拒否された
Promise を返す。
Promise を返す。
Promise とする。
[[windowClient]] が null
でない場合:
[[windowClient]].visibilityState
が "unloaded" でないなら、promise を
"InvalidStateError"
の DOMException
で拒否し、これらの手順を中止する。
[[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 で直列化可能なオブジェクト。
ユーザーエージェントは、対応する
respondWith 関数に渡された Promise
が解決されることで、支払いハンドラから成功応答を受け取る。
アプリケーションは、支払い応答を含む PaymentHandlerResponse インスタンスで
Promise を解決することが期待される。ユーザーによるキャンセルやエラーの場合、アプリケーションは Promise を拒否して失敗を通知してもよい。
Promise が拒否された場合、ユーザーエージェントは MUST payment app failure algorithm を実行する。このアルゴリズムの正確な詳細は実装者に委ねられる。許容される動作には、次のようなものが含まれる(これらに限定されない):
ユーザーが提供した支払人の氏名。
ユーザーが提供した支払人のメールアドレス。
ユーザーが提供した支払人の電話番号。
ユーザーが提供した配送先住所。
ユーザーが選択した配送オプションの識別子。
このアルゴリズムが 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 に 変換
したものとする。これが例外を投げた場合、payment app
failure algorithm を実行し、これらの手順を終了する。
methodName
が存在しない、または
event.methodData
の値のいずれにも設定されていない場合、
payment app failure algorithm を実行し、これらの手順を終了する。
details
が存在しない、または JSON で直列化可能
でない場合、payment
app failure algorithm を実行し、これらの手順を終了する。
shippingAddress
が存在しない場合、payment
app failure
algorithm を実行し、これらの手順を終了する。
shippingOption
が存在しない、または
event.shippingOptions
の識別子のいずれにも設定されていない場合、payment
app failure algorithm を実行し、これらの手順を終了する。
payerName
が存在しない場合、payment
app failure algorithm を実行し、これらの手順を終了する。
payerEmail
が存在しない場合、payment
app failure algorithm を実行し、これらの手順を終了する。
payerPhone
が存在しない場合、payment
app failure algorithm を実行し、これらの手順を終了する。
次の例は、支払い要求に応答する方法を示す:
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 Working Group は、プライバシー上の問題により 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] で定義されています。
非規範(non-normative)と明記されたセクションに加え、本仕様に含まれるすべてのオーサリングガイドライン、図、例、および注記は非規範です。それ以外のすべては規範です。
本文書におけるキーワード MAY、MUST、SHOULD、 および SHOULD NOT は、 BCP 14 [RFC2119] および [RFC8174] に従って、ここに示すようにすべて大文字で記載されている場合に限り解釈されます。
本仕様に準拠を主張できる製品クラスは 1 種類のみです:ユーザーエージェント。
ユーザーエージェントは、本仕様で示されるアルゴリズムとは異なる方法でそれらを実装してもよい(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: