ウェブベース決済ハンドラー API

W3C 作業草案

この文書の詳細
このバージョン:
https://www.w3.org/TR/2026/WD-web-based-payment-handler-20260423/
最新版公開バージョン:
https://www.w3.org/TR/web-based-payment-handler/
最新編集者ドラフト:
https://w3c.github.io/web-based-payment-handler/
履歴:
https://www.w3.org/standards/history/web-based-payment-handler/
コミット履歴
テストスイート:
https://wpt.live/payment-handler/
編集者:
Ian Jacobs (W3C)
Jinho Bang (招待専門家)
Stephen McGruer (Google)
以前の編集者:
Andre Lyver (Shopify)
Tommy Thorsen (Opera)
Adam Roach (Mozilla)
Rouslan Solomakhin (Google)
Adrian Hope-Bailie (Coil)
フィードバック:
GitHub w3c/web-based-payment-handler (プルリクエスト, 新規 issue, オープン issue)

要約

この仕様は、Webアプリケーションが支払いリクエストを処理できるようにする機能を定義します。

この文書の位置付け

このセクションは、本書が公開された時点での文書の位置付けを説明します。現在の W3C の公開文書と、本技術文書の最新版は W3C 標準および草案インデックスに掲載されています。

Web Payments ワーキンググループは、グループが未対応のバグ報告の一覧を管理しています。この草案では、ワーキンググループ内で今後議論予定の保留中の課題の一部を強調しています。これらの課題の妥当性を含め、結論は出ていません。未解決の課題に対して提案の仕様テキストを含むプルリクエストは強く推奨されます。

この文書は Web Payments ワーキンググループ により 勧告トラックを用いて作業草案として公開されました。

作業草案としての公開は、W3C およびそのメンバーによる承認を意味するものではありません。

この文書は草案であり、今後随時更新、改訂、または他の文書により廃止される可能性があります。本書を進行中の作業以外として引用するのは不適切です。

この文書は、W3C パテントポリシーの下で活動するグループによって作成されました。 W3C は、 グループの成果物に関連するパテント開示の公開リスト を管理しています。そのページにはパテントの開示方法も記載されています。自分が 必須クレームを含むと信じるパテントについて実際の知識がある場合は、 W3C パテントポリシー第6節に従ってその情報を開示する必要があります。

この文書は 2025年8月18日 W3C プロセス文書により管理されています。

1. はじめに

このセクションは非規範的です。

この仕様は、Web アプリケーションがユーザーに代わって支払いのリクエストを処理できるようにするためのいくつかの新機能を定義する:

この仕様は、オペレーティングシステム固有の仕組み (すなわち「ネイティブアプリ」)で構築されたソフトウェアが 支払いリクエストをどのように処理するかは扱わない。

2. 概要

本書では次のフローを想定する:

  1. オリジンは、サポートされる支払い手段の集合に対する支払い リクエストを処理する許可をユーザーに求める。たとえば、ユーザーが 小売サイトや銀行サイトを訪問した際、そのオリジンから Web ベース 決済ハンドラーを登録するよう促される場合がある。オリジンはその 許可の範囲を定めるが、オリジンの機能は追加のユーザー同意を 必要とせずに進化し得る。
  2. Web-based payment handlersservice worker コード内で定義される。
  3. 加盟店(またはその他の 受取人)が [payment-request] のメソッド canMakePayment() または show() を呼び出したとき (たとえば、ユーザー――すなわち 支払人――が チェックアウトページ上のボタンを押したとき)、ユーザーエージェントは 候補となる Web ベース決済ハンドラーの一覧を計算する。これは、 加盟店が受け付ける支払い手段と、ユーザーエージェントが種々の 仕組みを通じて知っている支払い手段とを比較することによって 行われる。これには以下が含まれるが、これらに限定されない:
    • この API を通じて事前に登録されたもの。
    • 取引の過程でこの API を通じて登録され得るもの (たとえば payment method manifest を通じて識別されるもの)。
    • オペレーティングシステムなど、他の仕組みを通じて登録 されたもの。
  4. ユーザーエージェントは、候補となる決済ハンドラーという選択肢の 集合をユーザーに表示する。ユーザーエージェントはこれらの選択肢を、 登録時に提供された情報(ラベルやアイコン)、またはその他 Web アプリから利用可能な情報を使って表示する。
  5. 支払人であるユーザーが Web ベース決済ハンドラーを選択すると、 ユーザーエージェントは選択された Web ベース決済ハンドラーの PaymentRequestEvent を (user interaction task source 参照)service worker 内で発火する。 PaymentRequestEvent には、 PaymentRequest からのいくつかの情報 ([payment-request] で定義) に加え、追加情報(たとえば受取人のオリジン)が含まれる。
  6. 起動されると、Web ベース決済ハンドラーは 支払いリクエストを処理するために必要な 任意の手順を実行し、適切な支払い応答を 受取人 に返す。もし ユーザーとの対話が必要であれば、 Web-based payment handler はその目的のためにウィンドウを開くことができる。
  7. ユーザーエージェントは、Web ベース決済ハンドラーがリクエストの 処理を完了すると、非同期に応答を受け取る。その応答は PaymentResponse ([payment-request] のもの) となる。

1 つのオリジンは複数の service worker を持つ決済アプリを実装 できるため、1 オリジンあたり複数の Web-based payment handlers を 登録できる場合がある。呼び出されるハンドラーは、ユーザーによる 選択によって決定される。

2.1 支払いリクエストの処理

このセクションは非規範的です。

Web ベース決済ハンドラーとは、Web アプリケーションベースの payment handler、すなわち、ユーザーに代わって 支払いリクエストを処理できる Web アプリケーションである。

Web ベース決済ハンドラーのロジックは、それがサポートする支払い 手段によって駆動される。支払い手段の中には、Web ベース決済 ハンドラーによる処理をほとんど、あるいは全く必要とせず、単に 応答内で支払いカード詳細を返すだけのものもある。その場合、 返されたデータを入力として支払いを処理するのは受取人の ウェブサイトの役割となる。

これに対し、暗号通貨による支払いや銀行起点の振込などの一部の 支払い手段では、Web ベース決済ハンドラーが支払い処理を開始 することが求められる。そのような場合、Web ベース決済 ハンドラーは支払い参照、エンドポイント URL、またはその他の データを返し、受取人のウェブサイトはそのデータを用いて 支払い結果を判定できる (支払いそのものを処理するのではない)。

支払いリクエストの処理には、多数のやり取りが含まれ得る: 新しいウィンドウや他の API (たとえば Web Cryptography API) を通じたユーザーとのやり取り、あるいはウェブ リクエストやその他の手段による他のサービスやオリジンとの やり取りなどである。

この仕様は、Web ベース決済ハンドラーが PaymentRequestEvent を受け入れてから、 Web ベース決済ハンドラーが応答を返すまでの間に発生する これらの活動を扱わない。Web ベース決済ハンドラーの構成や 支払いリクエストの処理に必要となり得るこれらすべての活動は、 以下を含め、Web ベース決済ハンドラーの実装に委ねられる:

したがって、オリジンはライフサイクル管理、セキュリティ、 ユーザー認証、ユーザーとの対話などについて、他所で定義された 多くの他の Web 技術に依拠することになる。

2.2 他の種類の決済アプリとの関係

このセクションは非規範的です。

この仕様は、サードパーティのモバイル決済アプリが (独自の仕組みを通じて)ユーザーエージェントとどのように 相互作用するか、あるいはユーザーエージェント自体がどのように 単純な決済アプリ機能を提供するかについては扱わない。

Different types of payment apps. Web-based Payment Handler API is for Web apps.
1 Web ベース Payment Handler API は、Web アプリが支払いを 処理できるようにする。他の種類の決済アプリは別の (独自の)仕組みを用いる場合がある。

3. 登録

Web ベース決済ハンドラーは、適時 (just-in-time: JIT)登録メカニズムを通じてユーザーエージェントに登録する。

3.1 適時登録

加盟店が show() メソッドを呼び出した時点で Web ベース決済ハンドラーが未登録で ある場合、ユーザーエージェントは取引中にこの Web ベース決済 ハンドラーを登録すること (「just-in-time」)をユーザーに許可してもよい。

この節の残りの内容は非規範的です。

ユーザーエージェントは、加盟店が要求した URL ベースの payment method identifier を通じて見つかる payment method manifest から Web ベース決済ハンドラー情報を導出することで、適時インストールを 実行してもよい。

4. 管理

この節では、Web ベース決済ハンドラーが自身のプロパティを管理する ために利用可能な機能について説明する。

4.1 ServiceWorkerRegistration インターフェースへの拡張

WebIDLpartial interface ServiceWorkerRegistration {
  [SameObject] readonly attribute PaymentManager paymentManager;
};

paymentManager 属性は、Web ベース決済 ハンドラー管理機能を公開する。

4.2 PaymentManager インターフェース

WebIDL[SecureContext, Exposed=(Window)]
interface PaymentManager {
  attribute DOMString userHint;
  Promise<undefined> enableDelegations(sequence<PaymentDelegation> delegations);
};

PaymentManager は、Web-based payment handler が サポートする委任を管理するために用いられる。

4.2.1 userHint 属性

Web ベース決済ハンドラーの名前とアイコンを表示する際、ユーザー エージェントはこの文字列を利用してユーザー体験を向上させて よい。たとえば、"**** 1234" という user hint は、その 特定のカードがこの Web ベース決済ハンドラーを通じて利用 可能であることをユーザーに思い出させることができる。

4.2.2 enableDelegations() メソッド

このメソッドにより、Web-based payment handler は、 サポートする PaymentDelegation の一覧を非同期に宣言できる。

4.3 PaymentDelegation 列挙型

WebIDLenum PaymentDelegation {
  "shippingAddress",
  "payerName",
  "payerPhone",
  "payerEmail"
};
"shippingAddress"
Web ベース決済ハンドラーは、必要に応じて配送先住所を提供する。
"payerName"
Web ベース決済ハンドラーは、必要に応じて支払人の氏名を提供する。
"payerPhone"
Web ベース決済ハンドラーは、必要に応じて支払人の電話番号を提供する。
"payerEmail"
Web ベース決済ハンドラーは、必要に応じて支払人のメールアドレスを提供する。

5. 支払い可能判定

Web-based payment handlerCanMakePaymentEvent をサポートする場合、user agent は、 利用可能な Web ベース決済ハンドラーのフィルタリングを補助するために それを使用してよい。

実装は、開発者が CanMakePaymentEvent に応答するための タイムアウトを課してもよい。タイムアウトが期限切れになった場合、 実装は respondWith()false を伴って呼び出されたかのように振る舞う。

5.1 ServiceWorkerGlobalScope への拡張

WebIDLpartial interface ServiceWorkerGlobalScope {
  attribute EventHandler oncanmakepayment;
};

5.1.1 oncanmakepayment 属性

oncanmakepayment 属性は event handler であり、その対応する event handler event type は "canmakepayment" である。

5.2 CanMakePaymentEvent

CanMakePaymentEvent は、 Web ベース決済ハンドラーが支払いリクエストに応答可能かどうかを 示すシグナルとして使用される。

WebIDL[Exposed=ServiceWorker]
interface CanMakePaymentEvent : ExtendableEvent {
  constructor(DOMString type);
  undefined respondWith(Promise<boolean> canMakePaymentResponse);
};

5.2.1 respondWith() メソッド

このメソッドは、Web ベース決済ハンドラーが支払いリクエストに 応答できるかどうかを示すシグナルとして使用される。

5.3 CanMakePaymentEvent の処理

PaymentRequest を受信すると、user agentMUST 次の手順を実行する:

  1. user agent の設定が CanMakePaymentEvent の使用を禁止している場合 (たとえばプライベートブラウジングモードでは)、 これらの手順を終了する。
  2. registrationServiceWorkerRegistration とする。
  3. registration が見つからない場合、これらの手順を終了する。
  4. Fire Functional Event により "canmakepayment" を CanMakePaymentEvent を用いて registration 上で発火する。

5.4 CanMakePaymentEvent の処理例

このセクションは非規範的です。

この例は、 CanMakePaymentEvent を待ち受ける service worker の書き方を示す。 CanMakePaymentEvent を受信すると、 service worker は常に true を返す。

1: CanMakePaymentEvent の処理
self.addEventListener("canmakepayment", function(e) {
  e.respondWith(new Promise(function(resolve, reject) {
    resolve(true);
  }));
});

5.5 決済ハンドラーのフィルタリング

PaymentMethodData と、 payment method identifier に一致する Web ベース決済ハンドラーが与えられたとき、このアルゴリズムは、 その Web ベース決済ハンドラーが支払いに使用可能であれば true を返す:

  1. methodName を、 payment method identifier の文字列であり、 PaymentMethodData に指定されたものとする。
  2. methodData を、 PaymentMethodData の支払い手段固有データとする。
  3. paymentHandlerOrigin を、 origin とし、 Web ベース決済ハンドラーの ServiceWorkerRegistration の scope URL の origin とする。
  4. paymentMethodManifest を、 ingested され、 parsed された payment method manifest とし、 methodName に対するものとする。
  5. methodNameURL-based payment method identifier であり、 paymentMethodManifest における "*" 文字列の supported origins を持つ場合、 true を返す。
  6. そうでなく、 URL-based payment method identifier methodNamepaymentHandlerOrigin と同じ origin を持つ場合、 Web ベース決済ハンドラー内で CanMakePaymentEvent を発火し、その結果を返す。
  7. そうでなく、 paymentMethodManifest における supported origins が、 paymentHandlerOrigin を含む origin の順序付き集合である場合、Web ベース決済ハンドラー内で CanMakePaymentEvent を発火し、 その結果を返す。
  8. そうでなければ、false を返す。

6. 呼び出し

ユーザーが Web ベース決済ハンドラーを選択すると、ユーザーエージェントは PaymentRequestEvent を発火し、その後の PaymentHandlerResponse を用いて、 [payment-request] のための PaymentResponse を生成する。

Issue 117: Abort() の Payment Handler への委譲のサポート

Payment Request API は、中止処理の管理責任を決済アプリに委譲することをサポートしている。 Web-based Payment Handler インターフェースに paymentRequestAborted イベントを追加する提案がある。 このイベントは、paymentRequest が正常に中止されたかどうかを示す 真偽値パラメーターを受け取る respondWith メソッドを持つことになる。

6.1 ServiceWorkerGlobalScope への拡張

この仕様は ServiceWorkerGlobalScope インターフェースを拡張する。

WebIDLpartial interface ServiceWorkerGlobalScope {
  attribute EventHandler onpaymentrequest;
};

6.1.1 onpaymentrequest 属性

onpaymentrequest 属性は イベントハンドラー であり、その対応する イベント ハンドラーのイベント型PaymentRequestEvent である。

6.2 PaymentRequestDetailsUpdate

PaymentRequestDetailsUpdate は、Web ベース決済ハンドラー内で ユーザーが支払い方法、配送先住所、または配送オプションを選択した結果として生じる、 更新された合計額(必要に応じて modifiers および shipping options を含む) と、起こり得るエラーを含む。

WebIDLdictionary PaymentRequestDetailsUpdate {
  DOMString error;
  PaymentCurrencyAmount total;
  sequence<PaymentDetailsModifier> modifiers;
  sequence<PaymentShippingOption> shippingOptions;
  object paymentMethodErrors;
  AddressErrors shippingAddressErrors;
};

6.2.1 error メンバー

ユーザーが選択した Web ベース決済方法、配送先住所、または配送オプションを 使用できない理由を説明する、人間が読める文字列。

6.2.2 total メンバー

変更された支払い方法、配送先住所、または配送オプションに基づく更新済み合計額。 たとえば、ユーザーが選択した支払い方法の請求先住所によって 付加価値税(VAT)が変わる場合や、ユーザーが選択または提供した 配送オプション/住所によって配送料が変わる場合、合計額は変化し得る。

6.2.3 modifiers メンバー

変更された支払い方法、配送先住所、または配送オプションに基づく更新済み modifiers。 たとえば、請求先住所または配送先住所に基づいて全体の合計額が €1.00 増加した場合、各 modifier に指定された合計額も €1.00 増加するべきである。

6.2.4 shippingOptions メンバー

変更された配送先住所に基づく更新済み shippingOptions。 たとえば、ユーザーが指定した国によっては、速達配送がより高額になる、 または利用できない場合がある。

6.2.5 paymentMethodErrors メンバー

支払い方法に対する検証エラー。存在する場合。

6.2.6 shippingAddressErrors メンバー

配送先住所に対する検証エラー。存在する場合。

6.3 PaymentRequestEvent

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);
};

6.3.1 topOrigin 属性

最上位レベルの origin を示す文字列を返す。 これは payee Web ページの origin である。 この属性は Handling a PaymentRequestEvent により初期化される。

6.3.2 paymentRequestOrigin 属性

origin を示す文字列を返す。これは PaymentRequest が 初期化された場所の origin である。 PaymentRequesttopOrigin 内で初期化された場合、 これらの属性は同じ値を持つ。そうでない場合、これらの属性は異なる値を持つ。 たとえば、 PaymentRequesttopOrigin とは異なる origin を持つ iframe 内で初期化された場合、この属性の値は その iframe の origin である。 この属性は Handling a PaymentRequestEvent により初期化される。

6.3.3 paymentRequestId 属性

取得時、 paymentRequestId 属性は、 この PaymentRequestEvent に対応する PaymentRequest[[details]].id を返す。

6.3.4 methodData 属性

この属性は、 Web サイトが受け付ける payment method identifiers を含む PaymentMethodData 辞書と、それに関連付けられた payment methodspayment method 固有データを含む。 これは PaymentRequest から、 以下で定義される MethodData Population Algorithm を用いて設定される。

6.3.5 total 属性

この属性は、支払いとして要求されている合計金額を示す。 その型は、 [payment-request] で定義される PaymentCurrencyAmount 辞書であり、対応する PaymentRequest オブジェクトが インスタンス化された際に提供された PaymentDetailsInittotal フィールドの コピーで初期化される。

6.3.6 modifiers 属性

この PaymentDetailsModifier 辞書の列は、特定の payment method identifier に対する modifiers を含む(たとえば、支払い金額または通貨の種類が 支払い方法ごとに変化する場合)。 これは PaymentRequest から、 以下で定義される Modifiers Population Algorithm を用いて設定される。

6.3.7 paymentOptions 属性

PaymentOptions の値であり、 PaymentRequest 内のもの。 shippingAddress および/または 支払人の連絡先情報のいずれかの部分集合が要求された場合にのみ利用可能。

6.3.8 shippingOptions 属性

対応する PaymentRequestPaymentDetailsInit 辞書における ShippingOptions の値。 (PaymentDetailsInitPaymentDetailsBase から ShippingOptions を継承する。) 配送先住所が要求された場合にのみ利用可能。

6.3.9 openWindow() メソッド

このメソッドは、Web ベース決済ハンドラーがユーザーにウィンドウを表示するために使われる。 呼び出されると、 open window algorithm を実行する。

6.3.10 changePaymentMethod() メソッド

このメソッドは、請求先住所などの支払い方法詳細に基づいて更新された 合計額を取得するために、Web ベース決済ハンドラーによって使用される。 呼び出されると、 change payment method algorithm を実行する。

6.3.11 changeShippingAddress() メソッド

このメソッドは、shippingAddress に基づいて更新された支払い詳細を取得するために Web ベース決済ハンドラーによって使用される。 呼び出されると、 change payment details algorithm を実行する。

6.3.12 changeShippingOption() メソッド

このメソッドは、shippingOption 識別子に基づいて更新された支払い詳細を取得するために Web ベース決済ハンドラーによって使用される。 呼び出されると、 change payment details algorithm を実行する。

6.3.13 respondWith() メソッド

このメソッドは、支払いが正常に完了したときに PaymentHandlerResponse を提供するために Web ベース決済ハンドラーによって使用される。 呼び出されると、 Respond to PaymentRequest AlgorithmeventhandlerResponsePromise を引数として実行する。

Issue 123: ユーザーデータを payment app と共有するか?

支払いアプリは、ユーザーの明示的な同意に基づいて、 user agent に保存されたユーザーデータを受け取るべきか。 payment app は、インストール時または最初に呼び出されたときに 許可を要求できる。

6.3.14 PaymentRequestEventInit 辞書

WebIDLdictionary PaymentRequestEventInit : ExtendableEventInit {
  USVString topOrigin;
  USVString paymentRequestOrigin;
  DOMString paymentRequestId;
  sequence<PaymentMethodData> methodData;
  PaymentCurrencyAmount total;
  sequence<PaymentDetailsModifier> modifiers;
  PaymentOptions paymentOptions;
  sequence<PaymentShippingOption> shippingOptions;
};

topOriginpaymentRequestOriginpaymentRequestIdmethodDatatotalmodifierspaymentOptions、 および shippingOptions メンバーは、 PaymentRequestEvent に対して定義されたものと定義を共有する

6.3.15 MethodData Population Algorithm

methodData の値を初期化するために、 user agent は MUST 次の手順、またはそれと等価な手順を実行する:

  1. registeredMethods を、呼び出された Web ベース決済ハンドラーに 登録されている payment method identifier の集合とする。
  2. 新しい空の Sequence を作成する。
  3. dataList を、新たに作成された Sequence に設定する。
  4. 対応する支払いリクエスト内の PaymentRequest@[[methodData]] の各項目について、次の手順を実行する:
    1. inData を、現在考慮中の項目に設定する。
    2. commonMethods を、 inData.supportedMethodsregisteredMethods の 集合の共通部分に設定する。
    3. commonMethods が空なら、残りの サブステップを飛ばして、次の項目(あれば)へ進む。
    4. 新しい PaymentMethodData オブジェクトを作成する。
    5. outData を、新たに作成された PaymentMethodData に設定する。
    6. outData.supportedMethods を、 commonMethods のメンバーを含む一覧に設定する。
    7. outData.data を inData.data のコピーに設定する。
    8. outDatadataList に追加する。
  5. methodDatadataList に設定する。

6.3.16 Modifiers Population Algorithm

modifiers の値を初期化するために、 user agent は MUST 次の手順、またはそれと等価な手順を実行する:

  1. registeredMethods を、呼び出された Web ベース決済ハンドラーに 登録されている payment method identifier の集合とする。
  2. 新しい空の Sequence を作成する。
  3. modifierList を、新たに作成された Sequence に設定する。
  4. 対応する支払いリクエスト内の PaymentRequest@[[paymentDetails]].modifiers の各項目について、次の手順を実行する:
    1. inModifier を、現在考慮中の項目に設定する。
    2. commonMethods を、 inModifier.supportedMethodsregisteredMethods の 集合の共通部分に設定する。
    3. commonMethods が空なら、残りの サブステップを飛ばして、次の項目(あれば)へ進む。
    4. 新しい PaymentDetailsModifier オブジェクトを作成する。
    5. outModifier を、新たに作成された PaymentDetailsModifier に設定する。
    6. outModifier.supportedMethods を、 commonMethods のメンバーを含む 一覧に設定する。
    7. outModifier.total inModifier.total のコピーに設定する。
    8. outModifiermodifierList に追加する。
  5. modifiersmodifierList に設定する。

6.4 内部スロット

PaymentRequestEvent の インスタンスは、次の表にある内部スロットを伴って作成される:

内部スロット 既定値 説明(非規範的
[[windowClient]] null 現在アクティブな WindowClient。 Web ベース決済ハンドラーが現在ユーザーにウィンドウを表示している場合に設定される。 それ以外の場合は null である。
[[respondWithCalled]] false YAHO

6.5 PaymentRequestEvent の処理

PaymentRequestPaymentRequest.show() によって受信し、 その後ユーザーが Web ベース決済ハンドラーを選択したとき、 user agentMUST 次の手順を実行する:

  1. registration を、ユーザーが選択した Web ベース決済ハンドラーに対応する ServiceWorkerRegistration とする。
  2. registration が見つからない場合、 Promise を、 PaymentRequest.show() によって生成されたものについて、 "InvalidStateError" の DOMException で reject し、これらの手順を終了する。
  3. Fire Functional Event により "paymentrequest" を PaymentRequestEvent を用いて registration 上で発火し、 次のプロパティを持たせる:

    topOrigin
    最上位レベルの payee Web ページの origin の 直列化
    paymentRequestOrigin
    PaymentRequest が初期化されたコンテキストの origin の 直列化
    methodData
    MethodData Population Algorithm を実行した結果。
    modifiers
    Modifiers Population Algorithm を実行した結果。
    total
    対応する PaymentRequestPaymentDetailsInit にある total フィールドのコピー。
    paymentRequestId
    PaymentRequest の \[\[details\]\].id
    paymentOptions
    対応する PaymentRequest の コンストラクターに渡された paymentOptions 辞書のコピー。
    shippingOptions
    対応する PaymentRequestPaymentDetailsInit にある shippingOptions フィールドのコピー。

    その後、dispatchedEvent を用いて、次の手順を並列に実行する:

    1. dispatchedEventextend lifetime promises 内のすべての promise が解決されるのを待つ。
    2. Web-based payment handlerPaymentHandlerResponse を提供していない場合、 Promise を、 PaymentRequest.show() によって生成されたものについて、 "OperationError" の DOMException で reject する。

7. ウィンドウ

呼び出された Web ベース決済ハンドラーは、自身に関する情報を表示したり、 ユーザー入力を求めたりする必要がある場合とない場合がある。 Web ベース決済ハンドラーの表示として考えられる例をいくつか挙げる:

視覚的な表示とユーザー操作を必要とする Web-based payment handler は、 ユーザーにページを表示するために openWindow() を呼び出してよい。

user agent は、このメソッドが PaymentRequestEvent に関連付けられていることを知っているので、SHOULD ユーザーに混乱を与えず、フローと一貫した方法でウィンドウを描画するべきである。 結果として得られる window client は、 PaymentRequest を開始したタブ/ウィンドウに結び付けられる。1 つの Web-based payment handler は、 このメソッドを使って 2 つ以上の client window を開けるように SHOULD NOT 許可されるべきではない。

7.1 ウィンドウを開く アルゴリズム

Issue 115: ウィンドウを開く アルゴリズム

このアルゴリズムは、Service Workers 仕様にある Open Window Algorithm に似ている。

Issue 115: ウィンドウを開く アルゴリズム

その手順をコピーする代わりに、Service Workers 仕様を参照すべきか?

  1. event を、この PaymentRequestEvent とする。
  2. eventisTrusted 属性が false の場合、 "InvalidStateError" の DOMException で reject された Promise を返す。
  3. request を、この PaymentRequest とし、 この PaymentRequestEvent を引き起こしたものとする。
  4. url を、url 引数を 解析 した結果とする。
  5. url の解析が例外を投げた場合、その例外で reject された Promise を返す。
  6. urlabout:blank の場合、 TypeError で reject された Promise を返す。
  7. url の origin が、Web ベース決済ハンドラーに関連付けられた service worker の origin と同じでない場合、 null で resolve された Promise を返す。
  8. promise を、新しい Promise とする。
  9. promise を返し、残りの手順を並列に実行する:
  10. event.[[windowClient]] が null でない場合、次を実行する:
    1. event.[[windowClient]].visibilityState が "unloaded" でない場合、 "InvalidStateError" の DOMExceptionpromise を reject し、これらの手順を中止する。
  11. newContext を、新しい top-level browsing context とする。
  12. Navigate により、例外を有効にし、replacement を有効にして、 newContexturl に遷移させる。
  13. その navigation が例外を投げた場合、その例外で promise を reject し、これらの手順を中止する。
  14. newContext の origin が、Web ベース決済ハンドラーに関連付けられた service worker client の origin と同じでない場合、 次を実行する:
    1. promise を null で resolve する。
    2. これらの手順を中止する。
  15. client を、 newContext を引数として create window client アルゴリズムを実行した結果とする。
  16. event.[[windowClient]]client に設定する。
  17. promiseclient で resolve する。

7.2 PaymentRequestEvent の処理例

このセクションは非規範的です。

この例は、 PaymentRequestEvent を待ち受ける service worker の書き方を示す。 PaymentRequestEvent を受信すると、 service worker はユーザーと対話するためにウィンドウを開く。

2: PaymentRequestEvent の処理
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() => {
    // ユーザーに支払い UI を提供するための新しいウィンドウを開く。
    const windowClient = await e.openWindow("payment_ui.html");

    // 開かれたウィンドウにデータを送信する。
    windowClient.postMessage({
      total: e.total,
      modifiers: e.modifiers
    });

    // 開かれたウィンドウからの支払いレスポンスを待つ。
    return await getPaymentResponseFromWindow();
  })());
});

上で説明した単純な方式を用いると、 Web-based payment handler window に読み込まれる簡単な HTML ページは、次のようになる:

3: シンプルな Payment Handler Window
<form id="form">
<table>
  <tr><th>カード名義人:</th><td><input name="cardholderName"></td></tr>
  <tr><th>カード番号:</th><td><input name="cardNumber"></td></tr>
  <tr><th>有効期限(月):</th><td><input name="expiryMonth"></td></tr>
  <tr><th>有効期限(年):</th><td><input name="expiryYear"></td></tr>
  <tr><th>セキュリティコード:</th><td><input name="cardSecurityCode"></td></tr>
  <tr><th></th><td><input type="submit" value="支払う"></td></tr>
</table>
</form>

<script>
navigator.serviceWorker.addEventListener("message", e => {
  /* 注: payment app から送信されたメッセージは 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>

8. 応答

8.1 PaymentHandlerResponse 辞書

user agent は、対応する respondWith 関数に提供された Promise が解決されることで、Web ベース決済ハンドラーからの成功応答を受け取る。 これは PaymentRequestEvent インターフェースに属する。 アプリケーションは、支払い応答を含む PaymentHandlerResponse インスタンスで Promise を解決することが期待される。ユーザー取消しまたは エラーの場合、アプリケーションは Promise を reject することで 失敗を通知してよい。

PaymentHandlerResponse は、次の辞書を用いて伝達される:

WebIDLdictionary PaymentHandlerResponse {
DOMString methodName;
object details;
DOMString? payerName;
DOMString? payerEmail;
DOMString? payerPhone;
AddressInit shippingAddress;
DOMString? shippingOption;
};

8.1.1 methodName 属性

ユーザーが取引を完了するために選択した payment method identifier であり、その payment method に対応するもの。

8.1.2 details 属性

JSON-serializable な object であり、merchant が取引を処理して 資金移転の成功を判定するために使う、 payment method 固有のメッセージを提供する。

8.1.3 payerName 属性

ユーザーが提供した支払人の氏名。

8.1.4 payerEmail 属性

ユーザーが提供した支払人のメールアドレス。

8.1.5 payerPhone 属性

ユーザーが提供した支払人の電話番号。

8.1.6 shippingAddress 属性

ユーザーが提供した配送先住所。

8.1.7 shippingOption 属性

ユーザーが選択した配送オプションの識別子。

8.2 支払い方法変更アルゴリズム

このアルゴリズムが methodNamemethodDetails パラメーターで呼び出されたとき、 user agent は MUST 次の手順を実行する:

  1. 与えられた methodNamemethodDetails パラメーターを用いて構築された PaymentMethodChangeEvent event に対し、 payment method changed algorithm を実行する。
  2. event.updateWith(detailsPromise) が実行されなかった場合、 null を返す。
  3. event.updateWith(detailsPromise) が例外を投げた場合、そのエラーを再送出する。
  4. event.updateWith(detailsPromise) がタイムアウトした場合 (任意)、 "InvalidStateError" の DOMException を投げる。
  5. event.updateWith(detailsPromise) にある detailsPromise から PaymentRequestDetailsUpdate を構築して返す。

8.3 支払い詳細変更アルゴリズム

このアルゴリズムが shippingAddress または shippingOption で呼び出されたとき、 user agent は MUST 次の手順を実行する:

  1. 更新された詳細 (shippingAddress または shippingOption)を用いて構築された PaymentRequestUpdateEvent event に対し、 PaymentRequest updated algorithm を実行する。
  2. event.updateWith(detailsPromise) が実行されなかった場合、 null を返す。
  3. event.updateWith(detailsPromise) が例外を投げた場合、そのエラーを再送出する。
  4. event.updateWith(detailsPromise) がタイムアウトした場合 (任意)、 "InvalidStateError" の DOMException を投げる。
  5. event.updateWith(detailsPromise) にある detailsPromise から PaymentRequestDetailsUpdate を構築して返す。

8.4 PaymentRequest 応答アルゴリズム

このアルゴリズムが eventhandlerResponsePromise パラメーターで呼び出されたとき、 user agent は MUST 次の手順を実行する:

  1. eventisTrusted が false の場合、 "InvalidStateError" の DOMException を投げ、 これらの手順を中止する。
  2. eventdispatch flag が設定されていない場合、 "InvalidStateError" の DOMException を投げ、 これらの手順を中止する。
  3. event.[[respondWithCalled]] が true の場合、 "InvalidStateError" の DOMException を投げ、 これらの手順を中止する。
  4. event.[[respondWithCalled]] を true に設定する。
  5. eventstop propagation flageventstop immediate propagation flag を設定する。
  6. handlerResponsePromiseeventextend lifetime promises に追加する。
  7. eventpending promises count を 1 増やす。
  8. reason を伴う handlerResponsePromisereject 時:
    1. reason を用いて payment app failure algorithm を実行し、 これらの手順を終了する。
  9. handlerResponsePromisefulfill 時:
    1. handlerResponse を、valueIDL 値に変換 した PaymentHandlerResponse とする。これが例外を投げた場合、 "OperationError" の DOMException を用いて payment app failure algorithm を実行し、 これらの手順を終了する。
    2. 必要なすべてのメンバーが handlerResponse に存在し、かつ整形式であることを 検証する。
      1. handlerResponse.methodName が存在しない、または event.methodData の値のいずれかに設定されていない場合、 "OperationError" の DOMException を用いて payment app failure algorithm を実行し、 これらの手順を終了する。
      2. handlerResponse.details が存在しない、または JSON-serializable でない場合、 "OperationError" の DOMException を用いて payment app failure algorithm を実行し、 これらの手順を終了する。
      3. shippingRequired を、関連付けられた PaymentRequest の requestShipping 値とする。これはその paymentOptions のものである。 shippingRequired が true で、かつ handlerResponse.shippingAddress が存在しない場合、 "OperationError" の DOMException を用いて payment app failure algorithm を実行し、これらの手順を終了する。
      4. shippingRequired が true で、かつ handlerResponse.shippingOption が存在しない、または event.shippingOptions から得られる shipping options identifiers のいずれにも 設定されていない場合、 "OperationError" の DOMException を用いて payment app failure algorithm を実行し、 これらの手順を終了する。
      5. payerNameRequired を、関連付けられた PaymentRequest の requestPayerName 値とする。これはその paymentOptions のものである。 payerNameRequired が true で、かつ handlerResponse.payerName が存在しない場合、 "OperationError" の DOMException を用いて payment app failure algorithm を実行し、 これらの手順を終了する。
      6. payerEmailRequired を、関連付けられた PaymentRequest の requestPayerEmail 値とする。これはその paymentOptions のものである。 payerEmailRequired が true で、かつ handlerResponse.payerEmail が存在しない場合、 "OperationError" の DOMException を用いて payment app failure algorithm を実行し、 これらの手順を終了する。
      7. payerPhoneRequired を、関連付けられた PaymentRequest の requestPayerPhone 値とする。これはその paymentOptions のものである。 payerPhoneRequired が true で、かつ handlerResponse.payerPhone が存在しない場合、 "OperationError" の DOMException を用いて payment app failure algorithm を実行し、 これらの手順を終了する。
    3. handlerResponse の必要メンバーを serialize する (methodNamedetails は常に必須。 shippingRequired が true のとき shippingAddressshippingOption が必須。 payerNameRequiredpayerEmailRequiredpayerPhoneRequired が true のとき、それぞれ payerNamepayerEmailpayerPhone が必須。):
      1. handlerResponse 内の各 member について、 serializeMemberStructuredSerialize handlerResponse.member を与えた結果とする。 あらゆる例外を再送出する。
    4. user agent は MUST [payment-request] で定義される user accepts the payment request algorithm を実行し、 その 9-15 ステップを、これらの手順または同等の手順で 置き換える:
      1. serialize されたメンバーを deserialize する:
        1. serializeMember について、 memberStructuredDeserializeserializeMember を与えた結果とする。 あらゆる例外を再送出する。
      2. 上記の手順で何らかの例外が発生した場合、 "OperationError" の DOMException を用いて payment app failure algorithm を実行し、 これらの手順を終了する。
      3. methodName を、関連付けられた PaymentRequest の response.methodName に代入する。
      4. details を、関連付けられた PaymentReqeust の response.details に代入する。
      5. shippingRequired が true の場合、 関連付けられた PaymentReqeust の shippingAddress 属性を shippingAddress に設定する。 そうでなければ null に設定する。
      6. shippingRequired が true の場合、 関連付けられた PaymentReqeust の shippingOption 属性を shippingOption に設定する。 そうでなければ null に設定する。
      7. payerNameRequired が true の場合、 関連付けられた PaymentReqeust の payerName 属性を payerName に設定する。 そうでなければ null に設定する。
      8. payerEmailRequired が true の場合、 関連付けられた PaymentReqeust の payerEmail 属性を payerEmail に設定する。 そうでなければ null に設定する。
      9. payerPhoneRequired が true の場合、 関連付けられた PaymentReqeust の payerPhone 属性を payerPhone に設定する。 そうでなければ null に設定する。
  10. handlerResponsePromisefulfill 時 または reject 時 に、 次の手順を実行する microtask を queue する:
    1. eventpending promises count を 1 減らす。
    2. registration を、 thisrelevant global object に関連付けられた service workercontaining service worker registration とする。
    3. registration が null でない場合、 registration を用いて Try Activate を呼び出す。

次の例は、支払いリクエストに応答する方法を示す:

4: Payment Response の送信
paymentRequestEvent.respondWith(new Promise(function(accept,reject) {
  /* ... ここで処理が行われることがある ... */
  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] は、 エコシステム内の当事者 (payment app 提供者や payee を含む)が、ネットワーク障害や その他の障害の後で照合に利用できる ID を定義している。

8.5 Payment App Failure Algorithm

このアルゴリズムが reason で呼び出されたとき、 user agent は MUST 次の手順を実行する:

  1. reason が "OperationError" の DOMException である場合、 [payment-request] で定義される Payment handler indicates an internal error algorithm を実行する。
  2. そうでなければ、 [payment-request] で定義される user aborts the payment request algorithm を実行する。

    この仕様の以前の版では、 payment app failure algorithm が 呼び出されたときに何が起こるかを定義していなかった。実際には、 実装者は user aborts the payment request algorithm が実行されたかのように 振る舞っていた。 可能な限り後方互換性を維持しつつ、Web ベース決済ハンドラーが 内部エラーを示す方法を導入するために、この仕様では現在、 "OperationError" の DOMException 以外のすべての reason 値を user abort に対応付けている。 将来の版のこの仕様では、追加の処理対象値が導入される可能性がある。

9. セキュリティおよびプライバシーに関する考慮事項

9.1 住所

Web Payments Working Group は、プライバシー上の問題により、 Payment Request API の初期バージョンから配送先住所および 請求先住所のサポートを削除した。issue 842 を参照。 この機能を引き続きサポートする実装のための文書を提供するために、 Working Group は現在、プライバシー問題への対処を前提として この機能を復元している。その過程で、Working Group は 他の API(例: Content Picker API)の発展に基づき、 Payment Request API に変更を加える可能性もある。

9.2 ユーザー環境に関する情報

9.5 クロスオリジンでのデータ共有に関するユーザー認識

9.6 安全な通信

9.7 認可された決済アプリ

9.8 サポートされるオリジン

9.9 データ検証

9.10 プライベートブラウジングモード

10. 決済ハンドラー表示に関する考慮事項

このセクションは非規範的です。

Web ベース決済ハンドラーを並べる際、user agent は他の選好よりも ユーザーの選好を尊重することが期待される。user agent は、 あるオリジンまたはすべてのオリジンに対して、 優先される Web ベース決済ハンドラーの表示順を設定するなどの 手動構成オプションを許可することが期待される。

ユーザー体験の詳細は実装者に委ねられる。

11. 依存関係

この仕様はいくつかの他の基盤仕様に依存する。

Payment Request API
payment methodPaymentRequestPaymentResponsesupportedMethodsPaymentCurrencyAmountpaymentDetailsModifierpaymentDetailsInitpaymentDetailsBasePaymentMethodDataPaymentOptionsPaymentShippingOptionAddressInitAddressErrorsPaymentMethodChangeEventPaymentRequestUpdateEventIDcanMakePayment()show()updateWith(detailsPromise)user accepts the payment request algorithmpayment method changed algorithmPaymentRequest updated algorithm、 および JSON-serializable は、Payment Request API 仕様 [payment-request] により定義される。
ECMAScript
internal slot および JSON.stringify は [ECMASCRIPT] により 定義される。
Payment Method Manifest
payment method manifestingest payment method manifestparsed payment method manifest、 および supported origins は、Payment Method Manifest 仕様 [payment-method-manifest] により 定義される。
Service Workers
service workerservice worker registrationservice worker clientServiceWorkerRegistrationServiceWorkerGlobalScopefire functional eventextend lifetime promisespending promises countcontaining service worker registrationTry Clear RegistrationTry ActivateExtendableEventExtendableEventInit、 および scope URL は [SERVICE-WORKERS] により 定義される。

12. 適合性

非規範的と明示された節に加え、この仕様内のすべての作成ガイドライン、図、例、および注は 非規範的である。この仕様内のそれ以外のすべては規範的である。

この文書におけるキーワード MAYMUSTSHOULD、 および SHOULD NOT は、 BCP 14 [RFC2119] [RFC8174] に記述されるとおりに解釈されるものとする。ただし、 ここに示すようにすべて大文字で現れる場合に限る。

この仕様への適合を主張できる製品クラスは 1 つだけである: すなわち user agent である。

user agent は、この仕様で与えられたアルゴリズムを、 最終結果が仕様のアルゴリズムから得られる結果と区別不可能である限り、 任意の方法で実装してよい。

user agent は、実装固有の制限を、他に制約のない入力に対して課してよい。 たとえば、サービス拒否攻撃の防止、メモリー枯渇の防止、 またはプラットフォーム固有の制限への対処のためである。 入力が実装固有の制限を超えた場合、user agent は MUSTTypeError を 投げるか、または promise の文脈ではそれで reject しなければならない。 その際、特定の入力がどのように実装固有の制限を超えたかを 開発者に通知してもよい。

A. IDL 索引

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;
};

B. 参考文献

B.1 規範的参考文献

[dom]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[payment-method-id]
Payment Method Identifiers. Marcos Caceres. W3C. 8 September 2022. W3C Recommendation. URL: https://www.w3.org/TR/payment-method-id/
[payment-method-manifest]
Payment Method Manifest. Dapeng(Max) Liu; Domenic Denicola; Zach Koch. W3C. 12 December 2017. FPWD. URL: https://www.w3.org/TR/payment-method-manifest/
[payment-request]
Payment Request API. Marcos Caceres; Ian Jacobs; Stephen McGruer. W3C. 27 March 2026. CRD. URL: https://www.w3.org/TR/payment-request/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[SERVICE-WORKERS]
Service Workers Nightly. Monica CHINTALA; Yoshisato Yanagisawa. W3C. 9 April 2026. CRD. URL: https://www.w3.org/TR/service-workers/
[URL]
URL Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/

B.2 参考情報

[WebCryptoAPI]
Web Cryptography API. Mark Watson. W3C. 26 January 2017. W3C Recommendation. URL: https://www.w3.org/TR/WebCryptoAPI/