Copyright © 2026 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
この仕様は、Webアプリケーションが支払いリクエストを処理できるようにする機能を定義します。
このセクションは、本書が公開された時点での文書の位置付けを説明します。現在の W3C の公開文書と、本技術文書の最新版は W3C 標準および草案インデックスに掲載されています。
Web Payments ワーキンググループは、グループが未対応のバグ報告の一覧を管理しています。この草案では、ワーキンググループ内で今後議論予定の保留中の課題の一部を強調しています。これらの課題の妥当性を含め、結論は出ていません。未解決の課題に対して提案の仕様テキストを含むプルリクエストは強く推奨されます。
この文書は Web Payments ワーキンググループ により 勧告トラックを用いて作業草案として公開されました。
作業草案としての公開は、W3C およびそのメンバーによる承認を意味するものではありません。
この文書は草案であり、今後随時更新、改訂、または他の文書により廃止される可能性があります。本書を進行中の作業以外として引用するのは不適切です。
この文書は、W3C パテントポリシーの下で活動するグループによって作成されました。 W3C は、 グループの成果物に関連するパテント開示の公開リスト を管理しています。そのページにはパテントの開示方法も記載されています。自分が 必須クレームを含むと信じるパテントについて実際の知識がある場合は、 W3C パテントポリシー第6節に従ってその情報を開示する必要があります。
この文書は 2025年8月18日 W3C プロセス文書により管理されています。
このセクションは非規範的です。
この仕様は、Web アプリケーションがユーザーに代わって支払いのリクエストを処理できるようにするためのいくつかの新機能を定義する:
PaymentRequestEvent)。Web ベース決済ハンドラーは
PaymentRequestEventの
イベントハンドラーである。
PaymentManager)の拡張。これにより Web ベース
決済ハンドラーのプロパティを管理する。
PaymentRequestEvent
に応答するための仕組み。
この仕様は、オペレーティングシステム固有の仕組み (すなわち「ネイティブアプリ」)で構築されたソフトウェアが 支払いリクエストをどのように処理するかは扱わない。
本書では次のフローを想定する:
PaymentRequestEvent を
(user
interaction
task source 参照)service worker 内で発火する。
PaymentRequestEvent には、
PaymentRequest からのいくつかの情報
([payment-request] で定義)
に加え、追加情報(たとえば受取人のオリジン)が含まれる。
1 つのオリジンは複数の service worker を持つ決済アプリを実装 できるため、1 オリジンあたり複数の Web-based payment handlers を 登録できる場合がある。呼び出されるハンドラーは、ユーザーによる 選択によって決定される。
このセクションは非規範的です。
Web ベース決済ハンドラーとは、Web アプリケーションベースの payment handler、すなわち、ユーザーに代わって 支払いリクエストを処理できる Web アプリケーションである。
Web ベース決済ハンドラーのロジックは、それがサポートする支払い 手段によって駆動される。支払い手段の中には、Web ベース決済 ハンドラーによる処理をほとんど、あるいは全く必要とせず、単に 応答内で支払いカード詳細を返すだけのものもある。その場合、 返されたデータを入力として支払いを処理するのは受取人の ウェブサイトの役割となる。
これに対し、暗号通貨による支払いや銀行起点の振込などの一部の 支払い手段では、Web ベース決済ハンドラーが支払い処理を開始 することが求められる。そのような場合、Web ベース決済 ハンドラーは支払い参照、エンドポイント URL、またはその他の データを返し、受取人のウェブサイトはそのデータを用いて 支払い結果を判定できる (支払いそのものを処理するのではない)。
支払いリクエストの処理には、多数のやり取りが含まれ得る: 新しいウィンドウや他の API (たとえば Web Cryptography API) を通じたユーザーとのやり取り、あるいはウェブ リクエストやその他の手段による他のサービスやオリジンとの やり取りなどである。
この仕様は、Web ベース決済ハンドラーが
PaymentRequestEvent
を受け入れてから、
Web ベース決済ハンドラーが応答を返すまでの間に発生する
これらの活動を扱わない。Web ベース決済ハンドラーの構成や
支払いリクエストの処理に必要となり得るこれらすべての活動は、
以下を含め、Web ベース決済ハンドラーの実装に委ねられる:
したがって、オリジンはライフサイクル管理、セキュリティ、 ユーザー認証、ユーザーとの対話などについて、他所で定義された 多くの他の Web 技術に依拠することになる。
このセクションは非規範的です。
この仕様は、サードパーティのモバイル決済アプリが (独自の仕組みを通じて)ユーザーエージェントとどのように 相互作用するか、あるいはユーザーエージェント自体がどのように 単純な決済アプリ機能を提供するかについては扱わない。
Web ベース決済ハンドラーは、適時 (just-in-time: JIT)登録メカニズムを通じてユーザーエージェントに登録する。
加盟店が show()
メソッドを呼び出した時点で Web ベース決済ハンドラーが未登録で
ある場合、ユーザーエージェントは取引中にこの Web ベース決済
ハンドラーを登録すること
(「just-in-time」)をユーザーに許可してもよい。
この節の残りの内容は非規範的です。
ユーザーエージェントは、加盟店が要求した URL ベースの payment method identifier を通じて見つかる payment method manifest から Web ベース決済ハンドラー情報を導出することで、適時インストールを 実行してもよい。
この節では、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-based payment handler が
サポートする委任を管理するために用いられる。
Web ベース決済ハンドラーの名前とアイコンを表示する際、ユーザー エージェントはこの文字列を利用してユーザー体験を向上させて よい。たとえば、"**** 1234" という user hint は、その 特定のカードがこの Web ベース決済ハンドラーを通じて利用 可能であることをユーザーに思い出させることができる。
このメソッドにより、Web-based payment handler
は、
サポートする PaymentDelegation
の一覧を非同期に宣言できる。
WebIDLenum PaymentDelegation {
"shippingAddress",
"payerName",
"payerPhone",
"payerEmail"
};
shippingAddress"
payerName"
payerPhone"
payerEmail"
Web-based payment handler が
CanMakePaymentEvent をサポートする場合、user
agent は、
利用可能な Web ベース決済ハンドラーのフィルタリングを補助するために
それを使用してよい。
実装は、開発者が
CanMakePaymentEvent に応答するための
タイムアウトを課してもよい。タイムアウトが期限切れになった場合、
実装は
respondWith()
が false を伴って呼び出されたかのように振る舞う。
WebIDLpartial interface ServiceWorkerGlobalScope {
attribute EventHandler oncanmakepayment;
};
oncanmakepayment
属性は
event handler
であり、その対応する event
handler event
type は "canmakepayment" である。
CanMakePaymentEvent は、
Web ベース決済ハンドラーが支払いリクエストに応答可能かどうかを
示すシグナルとして使用される。
WebIDL[Exposed=ServiceWorker]
interface CanMakePaymentEvent : ExtendableEvent {
constructor(DOMString type);
undefined respondWith(Promise<boolean> canMakePaymentResponse);
};
このメソッドは、Web ベース決済ハンドラーが支払いリクエストに 応答できるかどうかを示すシグナルとして使用される。
PaymentRequest を受信すると、user agent は MUST 次の手順を実行する:
CanMakePaymentEvent の使用を禁止している場合
(たとえばプライベートブラウジングモードでは)、
これらの手順を終了する。
ServiceWorkerRegistration
とする。
Fire
Functional Event により "canmakepayment" を
CanMakePaymentEvent を用いて
registration 上で発火する。
CanMakePaymentEvent の処理例
このセクションは非規範的です。
この例は、
CanMakePaymentEvent を待ち受ける
service worker の書き方を示す。
CanMakePaymentEvent を受信すると、
service worker は常に true を返す。
self.addEventListener("canmakepayment", function(e) {
e.respondWith(new Promise(function(resolve, reject) {
resolve(true);
}));
});
PaymentMethodData と、
payment
method identifier に一致する
Web ベース決済ハンドラーが与えられたとき、このアルゴリズムは、
その Web ベース決済ハンドラーが支払いに使用可能であれば
true を返す:
ServiceWorkerRegistration
の scope URL の origin とする。
"*" 文字列の
supported
origins を持つ場合、
true を返す。
CanMakePaymentEvent
を発火し、その結果を返す。
CanMakePaymentEvent を発火し、
その結果を返す。
false を返す。
ユーザーが Web ベース決済ハンドラーを選択すると、ユーザーエージェントは
PaymentRequestEvent を発火し、その後の
PaymentHandlerResponse を用いて、
[payment-request] のための PaymentResponse を生成する。
Payment Request API は、中止処理の管理責任を決済アプリに委譲することをサポートしている。 Web-based Payment Handler インターフェースに paymentRequestAborted イベントを追加する提案がある。 このイベントは、paymentRequest が正常に中止されたかどうかを示す 真偽値パラメーターを受け取る respondWith メソッドを持つことになる。
ServiceWorkerGlobalScope
への拡張
この仕様は
ServiceWorkerGlobalScope
インターフェースを拡張する。
WebIDLpartial interface ServiceWorkerGlobalScope {
attribute EventHandler onpaymentrequest;
};
onpaymentrequest
属性は イベントハンドラー
であり、その対応する イベント
ハンドラーのイベント型 は
PaymentRequestEvent
である。
PaymentRequestDetailsUpdate は、Web ベース決済ハンドラー内で
ユーザーが支払い方法、配送先住所、または配送オプションを選択した結果として生じる、
更新された合計額(必要に応じて modifiers および shipping options を含む)
と、起こり得るエラーを含む。
WebIDLdictionary PaymentRequestDetailsUpdate {
DOMString error;
PaymentCurrencyAmount total;
sequence<PaymentDetailsModifier> modifiers;
sequence<PaymentShippingOption> shippingOptions;
object paymentMethodErrors;
AddressErrors shippingAddressErrors;
};
ユーザーが選択した Web ベース決済方法、配送先住所、または配送オプションを 使用できない理由を説明する、人間が読める文字列。
変更された支払い方法、配送先住所、または配送オプションに基づく更新済み合計額。 たとえば、ユーザーが選択した支払い方法の請求先住所によって 付加価値税(VAT)が変わる場合や、ユーザーが選択または提供した 配送オプション/住所によって配送料が変わる場合、合計額は変化し得る。
変更された支払い方法、配送先住所、または配送オプションに基づく更新済み modifiers。 たとえば、請求先住所または配送先住所に基づいて全体の合計額が €1.00 増加した場合、各 modifier に指定された合計額も €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 Web ページの origin である。 この属性は Handling a PaymentRequestEvent により初期化される。
origin
を示す文字列を返す。これは
PaymentRequest が
初期化された場所の origin である。
PaymentRequest
が
topOrigin 内で初期化された場合、
これらの属性は同じ値を持つ。そうでない場合、これらの属性は異なる値を持つ。
たとえば、
PaymentRequest が
topOrigin とは異なる
origin を持つ iframe 内で初期化された場合、この属性の値は
その iframe の origin である。
この属性は
Handling a
PaymentRequestEvent により初期化される。
取得時、
paymentRequestId
属性は、
この
PaymentRequestEvent
に対応する
PaymentRequest の
[[details]].id
を返す。
この属性は、 Web サイトが受け付ける payment method identifiers を含む PaymentMethodData 辞書と、それに関連付けられた payment methods の payment method 固有データを含む。 これは PaymentRequest から、 以下で定義される MethodData Population Algorithm を用いて設定される。
この属性は、支払いとして要求されている合計金額を示す。
その型は、
[payment-request] で定義される
PaymentCurrencyAmount
辞書であり、対応する
PaymentRequest オブジェクトが
インスタンス化された際に提供された
PaymentDetailsInit
の
total フィールドの
コピーで初期化される。
この PaymentDetailsModifier 辞書の列は、特定の payment method identifier に対する modifiers を含む(たとえば、支払い金額または通貨の種類が 支払い方法ごとに変化する場合)。 これは PaymentRequest から、 以下で定義される Modifiers Population Algorithm を用いて設定される。
PaymentOptions の値であり、 PaymentRequest 内のもの。 shippingAddress および/または 支払人の連絡先情報のいずれかの部分集合が要求された場合にのみ利用可能。
対応する PaymentRequest の PaymentDetailsInit 辞書における ShippingOptions の値。 (PaymentDetailsInit は PaymentDetailsBase から ShippingOptions を継承する。) 配送先住所が要求された場合にのみ利用可能。
このメソッドは、Web ベース決済ハンドラーがユーザーにウィンドウを表示するために使われる。 呼び出されると、 open window algorithm を実行する。
このメソッドは、請求先住所などの支払い方法詳細に基づいて更新された 合計額を取得するために、Web ベース決済ハンドラーによって使用される。 呼び出されると、 change payment method algorithm を実行する。
このメソッドは、shippingAddress に基づいて更新された支払い詳細を取得するために Web ベース決済ハンドラーによって使用される。 呼び出されると、 change payment details algorithm を実行する。
このメソッドは、shippingOption 識別子に基づいて更新された支払い詳細を取得するために Web ベース決済ハンドラーによって使用される。 呼び出されると、 change payment details algorithm を実行する。
このメソッドは、支払いが正常に完了したときに
PaymentHandlerResponse を提供するために
Web ベース決済ハンドラーによって使用される。
呼び出されると、
Respond to PaymentRequest
Algorithm を
event と handlerResponsePromise を引数として実行する。
支払いアプリは、ユーザーの明示的な同意に基づいて、 user agent に保存されたユーザーデータを受け取るべきか。 payment app は、インストール時または最初に呼び出されたときに 許可を要求できる。
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 の値を初期化するために、
user agent は
MUST 次の手順、またはそれと等価な手順を実行する:
methodData を
dataList に設定する。
modifiers の値を初期化するために、
user agent は
MUST 次の手順、またはそれと等価な手順を実行する:
modifiers
の各項目について、次の手順を実行する:
total を
inModifier.total のコピーに設定する。
modifiers を
modifierList に設定する。
PaymentRequestEvent の
インスタンスは、次の表にある内部スロットを伴って作成される:
| 内部スロット | 既定値 | 説明(非規範的) |
|---|---|---|
| [[windowClient]] | null | 現在アクティブな WindowClient。 Web ベース決済ハンドラーが現在ユーザーにウィンドウを表示している場合に設定される。 それ以外の場合は null である。 |
| [[respondWithCalled]] | false | YAHO |
PaymentRequest を PaymentRequest.show() によって受信し、 その後ユーザーが Web ベース決済ハンドラーを選択したとき、 user agent は MUST 次の手順を実行する:
ServiceWorkerRegistration
とする。
Promise
を、
PaymentRequest.show()
によって生成されたものについて、
"InvalidStateError"
の
DOMException
で reject し、これらの手順を終了する。
Fire
Functional Event により "paymentrequest" を
PaymentRequestEvent を用いて
registration 上で発火し、
次のプロパティを持たせる:
topOrigin
paymentRequestOrigin
methodData
modifiers
total
paymentRequestId
paymentOptions
shippingOptions
その後、dispatchedEvent を用いて、次の手順を並列に実行する:
PaymentHandlerResponse
を提供していない場合、
Promise を、
PaymentRequest.show()
によって生成されたものについて、
"OperationError"
の
DOMException
で reject する。
呼び出された Web ベース決済ハンドラーは、自身に関する情報を表示したり、 ユーザー入力を求めたりする必要がある場合とない場合がある。 Web ベース決済ハンドラーの表示として考えられる例をいくつか挙げる:
視覚的な表示とユーザー操作を必要とする Web-based payment handler は、 ユーザーにページを表示するために openWindow() を呼び出してよい。
user agent は、このメソッドが
PaymentRequestEvent
に関連付けられていることを知っているので、SHOULD
ユーザーに混乱を与えず、フローと一貫した方法でウィンドウを描画するべきである。
結果として得られる window client は、
PaymentRequest
を開始したタブ/ウィンドウに結び付けられる。1 つの
Web-based payment handler は、
このメソッドを使って 2 つ以上の client window を開けるように
SHOULD NOT 許可されるべきではない。
このアルゴリズムは、Service Workers 仕様にある Open Window Algorithm に似ている。
その手順をコピーする代わりに、Service Workers 仕様を参照すべきか?
PaymentRequestEvent
とする。
isTrusted 属性が
false の場合、
"InvalidStateError" の
DOMException
で reject された
Promise
を返す。
PaymentRequestEvent
を引き起こしたものとする。
Promise
を返す。
about:blank の場合、
TypeError で
reject された
Promise
を返す。
Promise
を返す。
Promise
とする。
[[windowClient]] が
null でない場合、次を実行する:
[[windowClient]].visibilityState
が "unloaded" でない場合、
"InvalidStateError"
の
DOMException
で promise を reject し、これらの手順を中止する。
[[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() => {
// ユーザーに支払い 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 ページは、次のようになる:
<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>
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;
};
ユーザーが取引を完了するために選択した payment method identifier であり、その payment method に対応するもの。
JSON-serializable な object であり、merchant が取引を処理して 資金移転の成功を判定するために使う、 payment method 固有のメッセージを提供する。
ユーザーが提供した支払人の氏名。
ユーザーが提供した支払人のメールアドレス。
ユーザーが提供した支払人の電話番号。
ユーザーが提供した配送先住所。
ユーザーが選択した配送オプションの識別子。
このアルゴリズムが methodName と methodDetails パラメーターで呼び出されたとき、 user agent は MUST 次の手順を実行する:
null を返す。
InvalidStateError" の
DOMException
を投げる。
PaymentRequestDetailsUpdate
を構築して返す。
このアルゴリズムが shippingAddress または shippingOption で呼び出されたとき、 user agent は MUST 次の手順を実行する:
null を返す。
InvalidStateError" の
DOMException
を投げる。
PaymentRequestDetailsUpdate
を構築して返す。
このアルゴリズムが event と handlerResponsePromise パラメーターで呼び出されたとき、 user agent は MUST 次の手順を実行する:
isTrusted が false の場合、
"InvalidStateError"
の DOMException を投げ、
これらの手順を中止する。
InvalidStateError" の
DOMException を投げ、
これらの手順を中止する。
[[respondWithCalled]] が true の場合、
"InvalidStateError" の
DOMException を投げ、
これらの手順を中止する。
[[respondWithCalled]] を true に設定する。
PaymentHandlerResponse
とする。これが例外を投げた場合、
"OperationError"
の
DOMException
を用いて
payment app
failure algorithm を実行し、
これらの手順を終了する。
methodName
が存在しない、または
event.methodData
の値のいずれかに設定されていない場合、
"OperationError"
の
DOMException
を用いて
payment app failure algorithm を実行し、
これらの手順を終了する。
details
が存在しない、または
JSON-serializable
でない場合、
"OperationError"
の
DOMException
を用いて
payment
app
failure algorithm を実行し、
これらの手順を終了する。
shippingAddress
が存在しない場合、
"OperationError"
の
DOMException
を用いて
payment
app failure
algorithm
を実行し、これらの手順を終了する。
shippingOption
が存在しない、または
event.shippingOptions
から得られる shipping options identifiers のいずれにも
設定されていない場合、
"OperationError"
の
DOMException
を用いて
payment
app failure algorithm を実行し、
これらの手順を終了する。
payerName
が存在しない場合、
"OperationError"
の
DOMException
を用いて
payment
app failure algorithm を実行し、
これらの手順を終了する。
payerEmail
が存在しない場合、
"OperationError"
の
DOMException
を用いて
payment
app failure algorithm を実行し、
これらの手順を終了する。
payerPhone
が存在しない場合、
"OperationError"
の
DOMException
を用いて
payment
app failure algorithm を実行し、
これらの手順を終了する。
OperationError"
の
DOMException
を用いて
payment
app failure algorithm を実行し、
これらの手順を終了する。
次の例は、支払いリクエストに応答する方法を示す:
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 を定義している。
このアルゴリズムが reason で呼び出されたとき、 user agent は MUST 次の手順を実行する:
OperationError" の
DOMException
である場合、
[payment-request] で定義される
Payment
handler indicates an internal error algorithm を実行する。
この仕様の以前の版では、
payment app
failure algorithm が
呼び出されたときに何が起こるかを定義していなかった。実際には、
実装者は
user
aborts the payment request algorithm が実行されたかのように
振る舞っていた。
可能な限り後方互換性を維持しつつ、Web ベース決済ハンドラーが
内部エラーを示す方法を導入するために、この仕様では現在、
"OperationError"
の
DOMException
以外のすべての reason 値を user abort に対応付けている。
将来の版のこの仕様では、追加の処理対象値が導入される可能性がある。
Web Payments Working Group は、プライバシー上の問題により、 Payment Request API の初期バージョンから配送先住所および 請求先住所のサポートを削除した。issue 842 を参照。 この機能を引き続きサポートする実装のための文書を提供するために、 Working Group は現在、プライバシー問題への対処を前提として この機能を復元している。その過程で、Working Group は 他の API(例: Content Picker API)の発展に基づき、 Payment Request API に変更を加える可能性もある。
CanMakePaymentEvent が、
有限個のオリジン集合に属する登録済み Web ベース決済ハンドラーで
発火する。すなわち、その支払い方法マニフェストのオリジンと、
その supported
origins
である。
このイベントは、ユーザーがその決済ハンドラーを選択する前に
発火するが、発火元オリジン(すなわち merchant website)に
関する情報は含まないため、これを用いてユーザーを直接追跡する
ことはできない。
CanMakePaymentEvent
を介したタイミング攻撃のリスクを認識している:
CanMakePaymentEvent の発火を
引き起こす。
CanMakePaymentEvent
のサポートを無効化できるようにすべきである。
CanMakePaymentEvent は、
配送先住所や支払人の連絡先情報を含む、merchant が要求する
すべての情報を必要に応じて提供できる登録済み
Web ベース決済ハンドラーで発火する。
CanMakePaymentEvent イベントは、
プライベートブラウジングモードでは発火すべきでない。
user agent は、
respondWith()
が false で呼び出されたかのように振る舞うべきである。
これに伴うリスクを我々は認識している: もしある主体が
Payment Request API 呼び出し元のオリジンと
Web ベース決済ハンドラーのオリジンの両方を支配している場合、
その主体はユーザーがプライベートブラウジングモードにいる
可能性を推測できるかもしれない。
このセクションは非規範的です。
Web ベース決済ハンドラーを並べる際、user agent は他の選好よりも ユーザーの選好を尊重することが期待される。user agent は、 あるオリジンまたはすべてのオリジンに対して、 優先される 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] に記述されるとおりに解釈されるものとする。ただし、 ここに示すようにすべて大文字で現れる場合に限る。
この仕様への適合を主張できる製品クラスは 1 つだけである: すなわち user agent である。
user agent は、この仕様で与えられたアルゴリズムを、 最終結果が仕様のアルゴリズムから得られる結果と区別不可能である限り、 任意の方法で実装してよい。
user agent は、実装固有の制限を、他に制約のない入力に対して課してよい。
たとえば、サービス拒否攻撃の防止、メモリー枯渇の防止、
またはプラットフォーム固有の制限への対処のためである。
入力が実装固有の制限を超えた場合、user agent は
MUST、
TypeError を
投げるか、または promise の文脈ではそれで reject しなければならない。
その際、特定の入力がどのように実装固有の制限を超えたかを
開発者に通知してもよい。
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: