支払いリクエスト API

W3C 勧告候補ドラフト

この文書に関する詳細情報
このバージョン:
https://www.w3.org/TR/2025/CRD-payment-request-20250808/
最新発行バージョン:
https://www.w3.org/TR/payment-request/
最新エディタードラフト:
https://w3c.github.io/payment-request/
履歴:
https://www.w3.org/standards/history/payment-request/
コミット履歴
テストスイート:
https://wpt.live/payment-request/
実装レポート:
https://w3c.github.io/test-results/payment-request/all.html
最新の勧告:
https://www.w3.org/TR/2022/REC-payment-request-20220908/
編集者:
Marcos Cáceres (Apple Inc.)
Rouslan Solomakhin (Google)
Ian Jacobs (W3C)
以前の編集者:
Domenic Denicola (Google)
Adrian Bateman (Microsoft Corporation)
Zach Koch (Google)
Roy McElmurry (Facebook)
Danyao Wang (Google)
フィードバック:
GitHub w3c/payment-request (プルリクエスト, 新しい課題, オープン課題)
ブラウザサポート:
caniuse.com

概要

この仕様は、マーチャント(つまり、物理的またはデジタル商品を販売するウェブサイト)が最小限の統合で1つまたは複数の支払い方法を利用できるようにするAPIを標準化します。ユーザーエージェント(例: ブラウザ)は、マーチャントとユーザー間の支払いフローを促進します。

この文書の状態

このセクションでは、この文書が発行された時点での状態を説明します。現在のW3Cの出版物と、この技術報告書の最新の改訂版の一覧は、W3C標準およびドラフトのインデックスで確認できます。

2022年9月に、Web Payments Working Groupは支払いリクエスト勧告を発表しました。プライバシーおよび国際化レビューに続いて、この勧告から請求先および配送先住所に関連する機能は除外されました。ただし、これらの機能は相互運用可能な形で引き続きサポートされており、作業部会は仕様を実装と再調整し、関連する問題についてコミュニティと再連携することを決定しました。

この文書は、元の勧告のテキストに基づいた勧告候補スナップショットです。その後の勧告候補ドラフトでは、住所機能を追加し、勧告発表以降に行われた少数の変更を反映させます。

住所機能のサポートを追加する一環として、この仕様は、連絡先ピッカーAPIで定義された住所コンポーネントを参照し、それらを独自に定義しないようにしました。実際、連絡先ピッカーAPIは、元々支払いリクエストAPIにあった定義から派生したものであり、Web上で支払い以外にも住所が有用であるため、この仕様から分離されました。

作業部会は議論を行い、通常のレビュー手順に従ってこの仕様を勧告提案のステータスに進める予定です。

作業部会は、実装レポートを作成することで実装経験を示します。このレポートでは、テストスイートの各必須テスト(つまり、各テストが仕様のMUST要件に対応)を2つ以上の独立した実装が通過したことを示します。

この文書は、Web Payments Working Groupによって、勧告トラックを使用して勧告候補ドラフトとして発行されました。

勧告候補としての発行は、W3Cおよびそのメンバーによる承認を意味するものではありません。勧告候補ドラフトは、作業部会が次の勧告候補スナップショットに含めることを意図した前回の勧告候補からの変更を統合したものです。

この文書はドラフト文書であり、いつでも更新、置き換え、または廃止される可能性があります。この文書を進行中の作業以外として引用することは適切ではありません。 この仕様の将来の更新では、新機能が組み込まれる可能性があります。

この文書は、W3C特許ポリシーの下で活動しているグループによって作成されました。 W3Cは、このグループの成果物に関連して行われた特許開示の公開リストを維持しています。このページには、特許を開示するための手順も記載されています。特許のW3Cポリシーの第6節に従って、必須請求を含むと考えられる特許を知っている個人は、その情報を開示しなければなりません。

この文書は、2023年11月3日W3Cプロセス文書に基づいています。

1. はじめに

このセクションは規範的ではありません。

この仕様では、ユーザーエージェント (例: ブラウザ)が取引における三者間の仲介役として機能するAPIについて説明します:

支払い方法は以下を定義します:

任意の追加データ型
任意で、支払い方法が期待するIDL型を、PaymentMethodDatadataメンバーとして受け取ります。特定の支払い方法について指定されていない場合、IDLへの変換は行われず、支払い方法はdataをJSONとして受け取ります。
支払い方法データの検証手順
支払い方法dataメンバーを、支払い方法の追加データ型に変換した後に検証するアルゴリズム手順を指定します。特定の支払い方法について指定されていない場合、検証は行われません。

特定の支払い方法に対する支払いリクエストを満たす方法の詳細は、支払いハンドラー(支払いリクエストを処理するアプリケーションまたはサービス)の実装詳細です。具体的には、支払いハンドラーは以下を定義します:

支払いが可能かどうかを確認する手順
支払いハンドラーが、支払いが可能かどうかを確認する方法は、支払いハンドラーの実装詳細です。
支払いリクエストに応答する手順
マーチャントが取引を処理または検証するために使用するオブジェクトまたは辞書を返す手順。オブジェクトの構造は各支払い方法に固有です。
ユーザーが支払い方法を変更した際の手順(任意)

ユーザーが支払い方法や通貨手段(例: デビットカードからクレジットカードに変更)を変更した場合の処理を記述する手順で、辞書object、またはnullを返します。

このAPIは、標準のJavaScriptライブラリでは利用できない、より安全な支払い方式(例: トークン化やシステムレベルの認証)をウェブサイトで活用することも可能にします。これにより、マーチャントの責任が軽減され、ユーザーの機密情報を保護するのに役立ちます。

1.1 目標と範囲

この仕様の対象外は以下の通りです:

2. 使用例

このセクションは規範的ではありません。

APIを使用するには、開発者はいくつかの重要な情報を提供し、それらを管理する必要があります。これらの情報は PaymentRequest コンストラクタに 引数として渡され、その後ユーザーに表示される支払いリクエストを更新するために使用されます。具体的には、次の情報です:

PaymentRequest が構築されると、 show() メソッドを通じてエンドユーザーに提示されます。 show() は、ユーザーが支払いリクエストを確定すると、 PaymentResponse を結果として返す Promise を返します。

2.1 複数の支払い方法の宣言

新しい PaymentRequest を構築する際、 マーチャントは第1引数(methodData)を使用して、ユーザーが支払うことができるさまざまな方法 (例:クレジットカード、Apple Pay、Google Pay など)を列挙します。より具体的には、methodData のシーケンスには、マーチャントが受け入れる 支払い方法識別子 と、 関連する各 支払い方法 固有のデータ(例:対応するクレジットカードネットワーク) を含む PaymentMethodData 辞書が含まれます。

Example 1: 「methodData」引数
const methodData = [
  {
    supportedMethods: "https://example.com/payitforward",
    data: {
      payItForwardField: "ABC",
    },
  },
  {
    supportedMethods: "https://example.com/bobpay",
    data: {
      merchantIdentifier: "XXXX",
      bobPaySpecificField: true,
    },
  },
];

2.2 支払い対象の説明

新しい PaymentRequest を構築する際、 マーチャントはコンストラクタの第2引数(details)でユーザーに完了を求める取引の詳細を提供します。 これには注文の合計や、任意で支払い対象の内訳を提供するいくつかの明細項目が含まれます。

Example 2: 「details」引数
const details = {
  id: "super-store-order-123-12312",
  displayItems: [
    {
      label: "Sub-total",
      amount: { currency: "GBP", value: "55.00" },
    },
    {
      label: "Value-Added Tax (VAT)",
      amount: { currency: "GBP", value: "5.00" },
    },
  ],
  total: {
    label: "Total due",
    // The total is GBP£65.00 here because we need to
    // add shipping (below). The selected shipping
    // costs GBP£5.00.
    amount: { currency: "GBP", value: "65.00" },
  },
};

2.3 配送オプションの追加

ここでは、details に2つの配送オプションを追加する方法の例を示します。

Example 3: 配送オプションの追加
const shippingOptions = [
  {
    id: "standard",
    // Shipping by truck, 2 days
    label: "🚛  Envío por camión (2 dias)",
    amount: { currency: "EUR", value: "5.00" },
    selected: true,
  },
  {
    id: "drone",
    // Drone shipping, 2 hours
    label: "🚀 Drone Express (2 horas)",
    amount: { currency: "EUR", value: "25.00" }
  },
];
Object.assign(details, { shippingOptions });

2.4 支払いリクエストの条件付き変更

ここでは、特定のネットワークのカード使用時に処理手数料を追加する方法を示します。合計の再計算が必要である点に注意してください。

Example 4: カード種別に基づく支払いリクエストの変更
// Certain cards incur a $3.00 processing fee.
const cardFee = {
  label: "Card processing fee",
  amount: { currency: "AUD", value: "3.00" },
};

// Modifiers apply when the user chooses to pay with
// a card.
const modifiers = [
  {
    additionalDisplayItems: [cardFee],
    supportedMethods: "https://example.com/cardpay",
    total: {
      label: "Total due",
      amount: { currency: "AUD", value: "68.00" },
    },
    data: {
      supportedNetworks: networks,
    },
  },
];
Object.assign(details, { modifiers });

2.5 エンドユーザーからの特定情報のリクエスト

一部の金融取引では、マーチャントが購入を履行するためにユーザーが特定の情報を提供する必要があります(例:物理的な商品を発送する場合のユーザーの配送先住所)。 この情報を要求するために、マーチャントは PaymentRequest コンストラクタに第3の任意引数 (options)を渡し、必要とする情報を示すことができます。支払いリクエストが表示されると、 ユーザーエージェントはエンドユーザーにこの情報を求め、ユーザーが支払いリクエストを受け入れた際にマーチャントへ返します。

Example 5: 「options」引数
const options = {
  requestPayerEmail: false,
  requestPayerName: true,
  requestPayerPhone: false,
  requestShipping: true,
}

2.6 PaymentRequest の構築

必要な情報をすべて集めたら、PaymentRequest を構築し、 ブラウザにユーザーへ提示するよう要求できます:

Example 6: 「PaymentRequest」の構築
async function doPaymentRequest() {
  try {
    const request = new PaymentRequest(methodData, details, options);
    // See below for a detailed example of handling these events
    request.onshippingaddresschange = ev => ev.updateWith(details);
    request.onshippingoptionchange = ev => ev.updateWith(details);
    const response = await request.show();
    await validateResponse(response);
  } catch (err) {
    // AbortError, SecurityError
    console.error(err);
  }
}
async function validateResponse(response) {
  try {
    const errors = await checkAllValuesAreGood(response);
    if (errors.length) {
      await response.retry(errors);
      return validateResponse(response);
    }
    await response.complete("success");
  } catch (err) {
    // Something went wrong...
    await response.complete("fail");
  }
}
// Must be called as a result of a click
// or some explicit user action.
doPaymentRequest();

2.7 イベントの処理と支払いリクエストの更新

ユーザーが支払いを受け入れる前に、サイトはユーザー入力に応じて支払いリクエストを更新する機会が与えられます。 これには、追加の配送オプションの提供(またはその費用の変更)、特定の住所へ配送できない項目の削除などが含まれます。

Example 7: イベントハンドラーの登録
const request = new PaymentRequest(methodData, details, options);
// Async update to details
request.onshippingaddresschange = ev => {
  ev.updateWith(checkShipping(request));
};
// Sync update to the total
request.onshippingoptionchange = ev => {
  // selected shipping option
  const { shippingOption } = request;
  const newTotal = {
    currency: "USD",
    label: "Total due",
    value: calculateNewTotal(shippingOption),
  };
  ev.updateWith({ total: newTotal });
};
async function checkShipping(request) {
  try {
    const { shippingAddress } = request;

    await ensureCanShipTo(shippingAddress);
    const { shippingOptions, total } = await calculateShipping(shippingAddress);

    return { shippingOptions, total };
  } catch (err) {
    // Shows error to user in the payment sheet.
    return { error: `Sorry! we can't ship to your address.` };
  }
}

2.8 きめ細かなエラー報告

開発者は、shippingAddressErrorsPaymentDetailsUpdate 辞書のメンバーとして使用し、ContactAddress の特定の属性に 検証エラーがあることを示すことができます。 shippingAddressErrorsAddressErrors 辞書であり、そのメンバーは エラーのある 物理アドレス のフィールドを明確に示すとともに、 エンドユーザーに表示する有用なエラーメッセージを提供します。

request.onshippingaddresschange = ev => {
  ev.updateWith(validateAddress(request.shippingAddress));
};
function validateAddress(shippingAddress) {
  const error = "Can't ship to this address.";
  const shippingAddressErrors = {
    city: "FarmVille is not a real place.",
    postalCode: "Unknown postal code for your country.",
  };
  // Empty shippingOptions implies that we can't ship
  // to this address.
  const shippingOptions = [];
  return { error, shippingAddressErrors, shippingOptions };
}

2.9 サーバーへの支払い応答のPOST

PaymentResponse のデータは処理のためにサーバーへ POST されることが想定されています。これを可能な限り簡単にするために、 PaymentResponse既定の toJSON 手順 (すなわち .toJSON())を使用して、オブジェクトを直接 JSON にシリアライズできます。これにより、 生成されたJSONを Fetch Standard を用いてサーバーへ POST するのが容易になります:

Example 9: fetch() による POST
async function doPaymentRequest() {
  const payRequest = new PaymentRequest(methodData, details);
  const payResponse = await payRequest.show();
  let result = "";
  try {
    const httpResponse = await fetch("/process-payment", {
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: payResponse.toJSON(),
    });
    result = httpResponse.ok ? "success" : "fail";
  } catch (err) {
    console.error(err);
    result = "fail";
  }
  await payResponse.complete(result);
}
doPaymentRequest();

2.10 クロスオリジン iframe での使用

クロスオリジンの iframe が Payment Request API を呼び出すことを許可するには、 allow 属性に "payment" キーワードを指定して iframe 要素に付与します。

Example 10: クロスオリジン iframe での Payment Request API の使用
<iframe
  src="https://cross-origin.example"
  allow="payment">
</iframe>

複数のオリジンにまたがって Payment Request API をサポートするページへ iframe が遷移する場合は、 allow"payment *" に設定できます。 さらなる詳細と例は Permissions Policy 仕様で提供されています。

3. PaymentRequest インターフェース

WebIDL[SecureContext, Exposed=Window]
interface PaymentRequest : EventTarget {
  constructor(
    sequence<PaymentMethodData> methodData,
    PaymentDetailsInit details,
    optional PaymentOptions options = {}
  );
  [NewObject]
  Promise<PaymentResponse> show(optional Promise<PaymentDetailsUpdate> detailsPromise);
  [NewObject]
  Promise<undefined> abort();
  [NewObject]
  Promise<boolean> canMakePayment();

  readonly attribute DOMString id;
  readonly attribute ContactAddress? shippingAddress;
  readonly attribute DOMString? shippingOption;
  readonly attribute PaymentShippingType? shippingType;

  attribute EventHandler onshippingaddresschange;
  attribute EventHandler onshippingoptionchange;
  attribute EventHandler onpaymentmethodchange;
};
注記

開発者は支払いリクエストを行うために、PaymentRequest を作成します。 これは通常、ユーザーが支払いプロセスを開始する操作(例: ウェブサイト上の「Buy」「Purchase」「Checkout」ボタンの操作、インタラクティブゲームでの「Power Up」の選択、駐車場のキオスクでの支払いなど)に関連付けられます。PaymentRequest は、ユーザーが入力を行っている間(ユーザーが支払いリクエストを承認または拒否する時点まで)、開発者が ユーザーエージェント と情報をやり取りできるようにします。

shippingAddressshippingOption、および shippingType 属性は、 requestShipping メンバーが設定されている場合に、 処理の過程で値が設定されます。

request支払い関連の閲覧コンテキスト は、その PaymentRequest関連グローバルオブジェクト の閲覧コンテキストの トップレベル閲覧コンテキスト を指します。すべての 支払い関連の閲覧コンテキスト は、同時に複数の支払いUIが表示されることを防ぐための真偽値 payment request is showing を持ちます。

payment request is showing の真偽値は、単に1つのブラウザタブ内で複数の支払いUIが表示されるのを防ぎます。しかし、支払いハンドラー は、ユーザーエージェント に対して、すべてのブラウザウィンドウおよびタブにわたり一度に1つの支払いUIのみを表示するよう制限できる場合があります。別の支払いハンドラーは、異なるブラウザタブ間で支払いUIの表示を許可することもあります。

3.1 コンストラクタ

PaymentRequest は、提供された PaymentMethodData のシーケンス methodData(各 支払い方法 固有の data を含む場合がある)、 PaymentDetailsInitdetails、および PaymentOptionsoptions を用いて構築されます。

PaymentRequest(methodData, details, options) コンストラクタは以下のように動作しなければなりません(MUST):

  1. this関連グローバルオブジェクト関連付けられた Document が、使用を許可された "payment" パーミッションを持たない場合、"SecurityError" DOMExceptionスローする。
  2. リクエストの id を設定する:
    1. details.id が ない場合、detailsid メンバーを追加し、その値を UUID [RFC4122] に設定する。
  3. serializedMethodData を空のリストとする。
  4. 支払い方法を処理する:
    1. methodData シーケンスの長さが 0 の場合、 少なくとも 1 つの 支払い方法 が必要である旨を(任意で)開発者に通知しつつ、 スローTypeError を投げる。
    2. seenPMIs を空の 集合 とする。
    3. methodData の各 paymentMethod について:
      1. paymentMethod.supportedMethods に対して 支払い方法識別子の検証 の手順を実行する。false が返された場合は RangeError 例外を投げる。任意で、支払い方法識別子が不正であることを開発者に通知してよい。
      2. pmi を、基本 URL パーサpaymentMethod.supportedMethods を解析した結果とする:
        1. 失敗した場合、pmipaymentMethod.supportedMethods に設定する。
      3. もし seenPMIs含む pmi を持つなら、 RangeErrorDOMException を投げ、 任意で、この 支払い方法識別子 が重複していることを開発者に通知する。
      4. 追加 により pmiseenPMIs に加える。
      5. もし paymentMethoddata メンバーが存在しないなら、 serializedData を null とする。そうでなければ、 paymentMethod.data を JSON 文字列へ 直列化 した結果を serializedData とする。いかなる例外も再スローする。
      6. serializedData が null でなく、かつ paymentMethod.supportedMethods を定義する仕様が 追加データ型 を規定している場合:
        1. object を、JSON 解析 により serializedData をパースした結果とする。
        2. idl を、変換 によって object追加データ型 の IDL 値へ変換した結果とする。 いかなる例外も再スローする。

        3. 仕様に定義される paymentMethod.supportedMethods に対して、 可能であれば 支払い方法データの検証手順object に対して実行する。いかなる例外も再スローする。

          注記

          これらの手順により、IDL 型への変換および検証時のエラーができるだけ早い段階で検出されます。

      7. 組を (paymentMethod.supportedMethodsserializedData) として serializedMethodData に追加する。
  5. 合計の処理:
    1. 合計金額の確認および正規化details.total.amount に対して行う。 発生した例外は再スローする。
  6. detailsdisplayItems メンバーが存在する場合は、 details.displayItems 内の各 item について:
    1. 金額の確認および正規化item.amount に対して行う。例外は再スローする。
  7. selectedShippingOption を null とする。
  8. optionsrequestShipping メンバーが存在し、true に設定されている場合、配送オプションを処理する:
    1. options を空の sequence<PaymentShippingOption> とする。
    2. detailsshippingOptions メンバーが存在する場合は、次を行う:
      1. seenIDs を空の集合とする。
      2. details.shippingOptions 内の 各 option について:
        1. 金額の確認および正規化item.amount に対して行う。例外は再スローする。
        2. もし seenIDsoption.id を含むなら、 TypeError を投げる。 任意で、配送オプションの ID は一意でなければならないことを開発者に通知する。
        3. そうでなければ、 option.idseenIDs に追加する。
        4. もし option.selected が true の場合、selectedShippingOptionoption.id に設定する。
    3. details.shippingOptionsoptions に設定する。
  9. serializedModifierData を空のリストとする。
  10. 支払い詳細のモディファイアを処理する:
    1. modifiers を空の sequence<PaymentDetailsModifier> とする。
    2. detailsmodifiers メンバーが 存在する場合は:
      1. modifiersdetails.modifiers に設定する。
      2. modifiers の各 modifier について:
        1. もし modifiertotal メンバーが存在する場合:
          1. 合計金額の確認および正規化modifier.total.amount に対して行う。 例外は再スローする。
        2. もし additionalDisplayItems メンバーが modifier に存在する場合、modifier.additionalDisplayItems の各 item について:
          1. 金額の確認および正規化item.amount に対して行う。 例外は再スローする。
        3. もし modifierdata メンバーが存在しない場合、serializedData を null とする。そうでなければ、 直列化 により modifier.data を JSON 文字列にし、 その結果を serializedData とする。例外は再スローする。
        4. 組を (modifier.supportedMethodsserializedData) として serializedModifierData に追加する。
        5. 存在する場合は、modifierdata メンバーを削除する。
    3. details.modifiersmodifiers に設定する。
  11. request を新しい PaymentRequest として作成する。
  12. request[[handler]]null に設定する。
  13. request[[options]]options に設定する。
  14. request[[state]] を "created" に設定する。
  15. request[[updating]] を false に設定する。
  16. request[[details]]details に設定する。
  17. request[[serializedModifierData]]serializedModifierData に設定する。
  18. request[[serializedMethodData]]serializedMethodData に設定する。
  19. request[[response]] を null に設定する。
  20. requestshippingOption 属性の値を、selectedShippingOption に設定する。
  21. requestshippingAddress 属性の値を null に設定する。
  22. もし options.requestShipping が true に設定されているなら、 requestshippingType 属性の値を、options.shippingType に設定する。そうでなければ、 null に設定する。
  23. request を返す。

3.2 id 属性

取得時、id 属性はこの PaymentRequest[[details]].id を返します。

注記

監査および照合の目的で、マーチャントは各取引の一意識別子を id 属性に関連付けることができます。

3.3 show() メソッド

注記

開発者が支払いリクエストに対するユーザーとの対話を開始したいときに、show() メソッドが呼び出されます。 show() メソッドは、Promise を返し、ユーザーが支払いリクエストを受諾したときに解決されます。 show() メソッドが戻った後、支払いリクエストを支援するために、何らかのユーザーインターフェイスがユーザーに提示されます。

複数の閲覧コンテキストが同時に show() メソッドを呼び出した場合に何が起こるかは、各支払いハンドラーが制御します。 例えば、ある支払いハンドラーは、異なるブラウザのタブ/ウィンドウで複数の支払いUIを表示することを許可します。別の支払いハンドラーは、ユーザーエージェント全体で一度に1つの支払いUIのみを許可する場合があります。

show(optional detailsPromise) メソッドは以下のように動作しなければなりません(MUST):

  1. requestthis とする。
  2. request関連グローバルオブジェクト一時的アクティベーションを持たない場合、ユーザーエージェントは次を行ってもよい(MAY):
    1. SecurityError」の DOMException を用いて 拒否された Promise を返す。
    注記

    これは、ユーザーアクティベーションが不要となることをユーザーエージェントに許可します。例えば、リダイレクト先でユーザーアクティベーションが存在しない可能性のあるリダイレクトフローをサポートするためです。セキュリティ上の考慮事項については、 19.9 ユーザーアクティベーションの要件を参照してください。

    また、 issue #1022 も参照してください。ここでは、show() にユーザーアクティベーションを必要とすべきか否かについて、仕様でさらなる指針を提供することに関する議論が行われています。

  3. それ以外の場合は、ユーザーアクティベーションを消費する(関連グローバルオブジェクトのアクティベーション)。
  4. document を、request関連グローバルオブジェクト関連付けられた Document とする。
  5. document完全にアクティブでない場合、 「AbortError」の DOMException拒否された Promise を返す。
  6. document可視状態"visible" でない場合、 「AbortError」の DOMException拒否された Promise を返す。
  7. 任意で、ユーザーエージェントがユーザー保護のために show() の呼び出しを不許可にしたい場合、 「SecurityError」の DOMException で拒否された Promise を返す。例えば、ユーザーエージェントは、 セクション 19. プライバシーとセキュリティに関する考慮事項 に記載のとおり、ページが show() を呼び出せる頻度を制限する場合がある。

  8. request[[state]] が "created" でない場合、 「InvalidStateError」の DOMException拒否された Promise を返す。
  9. ユーザーエージェントpayment request is showing 真偽値が true の場合:
    1. request[[state]] を "closed" に設定する。
    2. AbortError」の DOMException拒否された Promise を返す。
  10. request[[state]] を "interactive" に設定する。
  11. acceptPromise新しい Promise とする。
  12. request[[acceptPromise]]acceptPromise に設定する。
  13. 任意で:

    1. acceptPromise を 「AbortError」の DOMException で拒否する。
    2. request[[state]] を "closed" に設定する。
    3. acceptPromise を返す。
    注記

    これにより、ユーザーエージェントは、裁量により、ユーザーが即座に 支払いリクエストを中止したかのように振る舞うことができます。例えば「プライベートブラウジング」モードなどでは、この手順が利用されることがあります。

  14. request支払い関連の閲覧コンテキストpayment request is showing 真偽値を true に設定する。
  15. acceptPromise を返し、残りの手順は並行して実行する。
  16. handlers を空の リストとする。
  17. request[[serializedMethodData]] 内の各 paymentMethod の組について:
    1. paymentMethod の最初の要素を identifier とする。
    2. 2番目の要素を JSON 解析 した結果を data とする。
    3. identifier を定義する仕様が 追加データ型 を規定している場合は、 変換 により data をその型の IDL 値にする。そうでなければ、 変換 により dataobject にする。
    4. 変換により 例外 error が発生した場合:
      1. request[[state]] を "closed" に設定する。
      2. acceptPromiseerror で拒否する。
      3. request支払い関連の閲覧コンテキストpayment request is showing 真偽値を false に設定する。
      4. このアルゴリズムを終了する。
    5. registeredHandlers を、支払い方法 identifier の登録済み支払いハンドラーの リスト とする。
      注記: Payment Handler registration
    6. registeredHandlers 内の各 handler について:
      1. handler支払いが可能かどうかを確認する手順data とともに実行した結果を canMakePayment とする。
      2. canMakePayment が true の場合、handlerhandlers に追加する。
  18. handlers が空である場合:
    1. request[[state]] を "closed" に設定する。
    2. acceptPromise を 「NotSupportedError」の DOMException で拒否する。
    3. request支払い関連の閲覧コンテキストpayment request is showing 真偽値を false に設定する。
    4. このアルゴリズムを終了する。
  19. ユーザーが handlers と対話できるユーザーインターフェイスを提示する。提示にあたって、ユーザーエージェントはユーザーの選好を優先すべきです(SHOULD)。 また、ユーザーインターフェイスは、可能であれば document文書要素言語およびロケールに基づく書式に従って提示すべきです(SHOULD)。 利用できない場合は適切なフォールバックを用います。

    注記: 支払いユーザーインターフェイスのローカライズ
  20. detailsPromise が渡された場合:
    1. detailsPromiserequest、null を引数として、 PaymentRequest の詳細を更新するアルゴリズムを実行する。
    2. detailsPromise が settle するまで待つ。
      注記

      detailsPromise の settle 方法に基づいて、 PaymentRequest の詳細を更新するアルゴリズム が支払いUIの挙動を決定します。 すなわち、detailsPromise拒否された場合、支払いリクエストは中止されます。 それ以外の場合、detailsPromise履行 されると、 ユーザーエージェントは支払いUIを再度有効化し、支払いフローを継続できます。

  21. request[[handler]] を、エンドユーザーが選択した 支払いハンドラー に設定する。
  22. modifiers を空のリストとする。
  23. [[serializedModifierData]] 内の各 tuple について:
    1. tuple の最初の要素(PMI)が、 request[[handler]]支払い方法識別子 と一致する場合、 2番目の要素(直列化されたメソッドデータ)を modifiers に追加する。
  24. paymentMethod の組の2番目の要素を 変換 したものと modifiers を渡す。任意で、ユーザーエージェントは、ユーザーが支払いプロセスを進められるよう、 request から適切なデータをユーザー選択の 支払いハンドラー に送るべきです(SHOULD)。これには、 request のさまざまな属性やその他の 内部スロット が含まれます(プライバシー上の理由から、適宜一部が除外されることがあります)。

    [[serializedModifierData]]内部スロット にある 複数の適用可能なモディファイアの扱いは、支払いハンドラー に依存し、この仕様の範囲外です。 それでもなお、支払いハンドラー は「最後のものが優先」するアプローチを用いることが推奨されます(RECOMMENDED)。 つまり、リストの末尾の項目は常に先頭の項目より優先されます(以下の例を参照)。

    acceptPromise は、後に ユーザーが支払いリクエストを受諾するアルゴリズム または ユーザーが支払いリクエストを中止するアルゴリズム のいずれかによって、解決または拒否されます。これらはユーザーインターフェイスとの対話を通じてトリガーされます。

    ユーザーインターフェイスが表示されている間に document完全にアクティブでなくなった場合、またはこの手順に到達する時点で既にそうでない場合は、次を行う:

    1. ユーザーインターフェイスを閉じる。
    2. request支払い関連の閲覧コンテキストpayment request is showing 真偽値を false に設定する。

3.4 abort() メソッド

注記

開発者が abort() メソッドを呼び出すと、 ユーザーエージェント に対して支払い request を中止し、 表示中のユーザーインターフェイスがあればそれを終了するよう指示します。 abort() は、 show() メソッドが呼び出された後( 状態を参照)で、このインスタンスの [[acceptPromise]] が解決される前にのみ呼び出すことができます。 例えば、販売している商品が期間限定でのみ利用可能な場合、開発者はこれを選択することができます。 ユーザーが許可された時間内に支払いリクエストを受け入れなかった場合、リクエストは中止されます。

ユーザーエージェント は、常にリクエストを中止できるとは限りません。 例えば、ユーザーエージェント がリクエストの責任を別のアプリに委譲している場合があります。 この場合、abort() は返される Promise を拒否します。

ユーザーが支払いリクエストを中止する場合のアルゴリズムも参照してください。

abort() メソッドは以下のように動作しなければなりません(MUST):

  1. requestthis とする。
  2. request.[[response]] が null でなく、 request.[[response]].[[retryPromise]] が null でない場合、「InvalidStateError」の DOMException拒否された Promise を返す。
  3. request.[[state]] の値が "interactive" でない場合、「InvalidStateError」の DOMException拒否された Promise を返す。
  4. promise新しい Promise とする。
  5. promise を返し、残りの手順は並行して実行する。
  6. 支払いハンドラーを用いて現在のユーザー対話を中止し、 残っているユーザーインターフェイスを閉じるよう試みる。
  7. タスクをキューに追加し、 ユーザーインタラクションタスクソース上で 次の手順を実行する:
    1. 現在のユーザー対話を中止することができない場合、promise を 「InvalidStateError」の DOMException で拒否し、 これらの手順を中止する。
    2. request.[[state]] を "closed" に設定する。
    3. request.[[acceptPromise]] を 「AbortError」の DOMException で拒否する。
    4. promise を undefined で解決する。

3.5 canMakePayment() メソッド

注記: canMakePayment()

canMakePayment() メソッドは、 開発者がユーザーエージェントが希望する 支払い方法のいずれかをサポートしているかどうかを確認するために使用できます。 19.8 canMakePayment() 保護を参照してください。

canMakePayment() の結果が true であっても、 ユーザーが支払いに備えた手段を用意していることを意味するわけではありません。

canMakePayment() メソッドはcan make payment アルゴリズムを実行しなければなりません(MUST)。

3.6 shippingAddress 属性

PaymentRequestshippingAddress 属性は、 ユーザーが配送先住所を提供したときに設定されます。デフォルトでは null です。 ユーザーが配送先住所を提供すると、配送先住所変更アルゴリズムが実行されます。

3.7 shippingType 属性

PaymentRequestshippingType 属性は、 取引を履行するために使用される配送の種類を表します。その値は PaymentShippingType 列挙型の値か、 開発者が PaymentOptionsshippingType メンバーを使用して 構築する際に提供されていない場合は null です。

3.8 onshippingaddresschange 属性

PaymentRequestonshippingaddresschange 属性は、EventHandler であり、 PaymentRequestUpdateEvent のうち shippingaddresschange と名付けられたもの用です。

3.9 shippingOption 属性

PaymentRequestshippingOption 属性は、 ユーザーが配送オプションを選択したときに設定されます。デフォルトでは null です。 ユーザーが配送オプションを選択すると、配送オプション変更アルゴリズムが実行されます。

3.10 onshippingoptionchange 属性

PaymentRequestonshippingoptionchange 属性は、EventHandler であり、 PaymentRequestUpdateEvent のうち shippingoptionchange と名付けられたもの用です。

3.11 onpaymentmethodchange 属性

PaymentRequestonpaymentmethodchange 属性は、EventHandler であり、 PaymentMethodChangeEvent のうち "paymentmethodchange" と名付けられたもの用です。

3.12 内部スロット

PaymentRequest のインスタンスは、 以下の表に示す内部スロットとともに作成されます:

内部スロット 説明 (規範ではない)
[[serializedMethodData]] コンストラクタに提供された methodData ですが、元のオブジェクト形式の代わりに、サポートされる方法とデータの文字列または null を含むタプルとして表されます。
[[serializedModifierData]] シーケンス [[details]]modifier 内の各項目に対応する data メンバーの文字列形式で直列化されたリスト、またはそのようなメンバーが存在しなかった場合は null。
[[details]] コンストラクタに最初に提供され、その後 updateWith() の呼び出しによって更新される、支払いリクエスト用の現在の PaymentDetailsBasedata メンバーはすべて削除され、 代わりに直列化された形式で [[serializedModifierData]] 内部スロットに格納されます。
[[options]] コンストラクタに提供された PaymentOptions
[[state]]

支払いリクエストの現在の 状態。 以下のように遷移します:

"created"
支払いリクエストが作成され、ユーザーに提示されていない。
"interactive"
支払いリクエストがユーザーに提示されている。
"closed"
支払いリクエストが完了した。

状態遷移は以下の図に示されています:

1 コンストラクタが初期 状態を "created" に設定します。 show() メソッドは 状態を "interactive" に変更します。 そこから、 abort() メソッドまたはその他のエラーによって 状態を "closed" にすることができます。 同様に、 ユーザーが支払いリクエストを受け入れるアルゴリズムユーザーが支払いリクエストを中止するアルゴリズム状態を "closed" に変更します。
[[updating]] 保留中の updateWith() 呼び出しが支払いリクエストを更新するために存在する場合は true、それ以外の場合は false。
[[acceptPromise]] show() 中に作成される保留中の Promise。 ユーザーが支払いリクエストを受け入れた場合に解決されます。
[[response]] Null、またはこの PaymentRequest によって インスタンス化された PaymentResponse
[[handler]] この PaymentRequest に関連付けられた 支払いハンドラー。 初期値は null

4. PaymentMethodData 辞書

WebIDLdictionary PaymentMethodData {
  required DOMString supportedMethods;
  object data;
};

PaymentMethodData 辞書は、 サポートされる支払い方法のセットおよびそれらの方法に関連する 支払い方法固有のデータを示すために使用されます。

supportedMethods メンバー
マーチャントのウェブサイトが受け入れる支払い方法識別子
data メンバー
サポートされる支払い方法に必要な場合があるオプションの情報を提供するオブジェクト。 提供された場合、それは直列化されます。
注記

supportedMethods の値は配列から文字列に変更されましたが、ウェブ上の既存のコンテンツとの互換性を維持するために名前は複数形のままです。

5. PaymentCurrencyAmount 辞書

WebIDLdictionary PaymentCurrencyAmount {
  required DOMString currency;
  required DOMString value;
};

PaymentCurrencyAmount 辞書は、金額を提供するために使用されます。

currency メンバー

[ISO4217] の整形式の3文字のアルファベットコード (すなわち、数値コードはサポートされていません)。それらの標準形式は大文字です。 ただし、ローカライズされた通貨記号が利用可能な通貨コードの組み合わせは、実装に依存します。

金額を表示する際、ユーザーエージェントは通貨コードを表示することを推奨 しますが、通貨記号を表示することは任意です。 これは、通貨記号が複数の異なる通貨で使用されるために曖昧になる可能性があるためです (例:"$" は USD、AUD、NZD、CAD などを意味する可能性があります)。

ユーザーエージェントは、許可されますMAY)、 currency メンバーの表示形式を OS の慣習に従わせるようにフォーマットすることができます(例:ローカライズ目的で)。

注記: デジタル通貨と ISO 4217 通貨コード

この仕様を実装するユーザーエージェントは、[ISO4217] の 3文字コード形式を ECMAScript のisWellFormedCurrencyCode 抽象操作を通じて適用します。これは金額の確認および正規化アルゴリズムの一部として呼び出されます。 コードが [ISO4217] で定義された形式に従わない場合、 RangeError がスローされます。

現在の実装では、公式の [ISO4217] リストの一部ではないが 整形式の通貨コード(例:XBT、XRP など)の使用が可能です。 提供されたコードがブラウザで表示方法を知っている通貨である場合、 実装は一般的に適切な通貨記号をユーザーインターフェイスに表示します (例:"USD" は U+0024 ドル記号($)として表示され、 "GBP" は U+00A3 ポンド記号(£)として表示され、 "PLN" は U+007A U+0142 ズウォティ(zł)として表示され、 非標準の "XBT" は U+0243 ストローク付きラテン大文字 B(Ƀ)として表示される可能性があります)。

ISO ではデジタル通貨を考慮するための取り組みが進行中であり、 これにより [ISO4217] レジストリの更新 または完全に新しいレジストリが作成される可能性があります。 コミュニティは、非標準の3文字コードの使用によって生じた曖昧さが解消されることを期待しています。 例えば、"BTC" はビットコインを指すのか、将来のブータン通貨を指すのか? 公表時点では、この進化がどのような形をとるのか、または作業が完了するまでの時間枠は不明です。 W3C ウェブ決済作業部会は ISO と連携しており、 将来的にこの仕様の改訂が関連する ISO レジストリと互換性を維持するよう努めています。

value メンバー
有効な10進数形式の金額を含む金額。
12: 1.234 オマーン・リアルの表現方法
{
   "currency": "OMR",
   "value": "1.234"
}

5.1 妥当性チェック

JavaScript の文字列 は、以下の順序で構成される場合に 有効な10進数形式の金額 です:

  1. オプションで、U+002D (-) を一つだけ含む。これは金額が負であることを示します。
  2. U+0030 (0) から U+0039 (9) の範囲内の コードポイントを1つ以上含む。
  3. オプションで、U+002E (.) を一つ含み、その後に U+0030 (0) から U+0039 (9) の範囲内の コードポイントを1つ以上含む。
注記
以下の正規表現は上記定義を実装したものです。
^-?[0-9]+(\.[0-9]+)?$

PaymentCurrencyAmount amount を与えて 金額の確認および正規化を行うには、次の手順を実行します:

  1. IsWellFormedCurrencyCode(amount.currency) の結果が false である場合、RangeError 例外をスローし、オプションで開発者に通貨が無効であることを通知します。
  2. amount.value有効な10進数形式の金額でない場合、 TypeErrorをスローし、 オプションで開発者に通貨が無効であることを通知します。
  3. amount.currencyASCII 大文字に変換した結果に設定します。

PaymentCurrencyAmount amount を与えて 合計金額の確認および正規化を行うには、次の手順を実行します:

  1. 金額の確認および正規化amount に対して行います。 例外を再スローします。
  2. amount.value の最初の コードポイント が U+002D (-) の場合、 TypeError をスローし、 オプションで開発者に合計の値が負の数にできないことを通知します。
注記: 値の変更は行いません

6. 支払い詳細辞書

6.1 PaymentDetailsBase 辞書

WebIDLdictionary PaymentDetailsBase {
  sequence<PaymentItem> displayItems;
  sequence<PaymentShippingOption> shippingOptions;
  sequence<PaymentDetailsModifier> modifiers;
};
displayItems メンバー
PaymentItem辞書のシーケンス。 ユーザーエージェントが表示できる支払いリクエストの行項目を含みます。
注意
shippingOptions メンバー

ユーザーが選択できるさまざまな配送オプションを含むシーケンスです。

シーケンス内のアイテムに selected メンバーが設定されている場合、それがデフォルトで使用される配送オプションとなり、 shippingOption は設定されます。 idに設定されます。

shippingOptions メンバーは、 PaymentRequestPaymentOptionsrequestShipping を設定した場合にのみ使用されます。

注意
modifiers メンバー
特定の支払い方法識別子の修飾子を含む PaymentDetailsModifier辞書のシーケンス。 例えば、支払い方法に基づいて合計金額を調整することができます。

6.2 PaymentDetailsInit 辞書

WebIDLdictionary PaymentDetailsInit : PaymentDetailsBase {
  DOMString id;
  required PaymentItem total;
};
注意

PaymentDetailsBase 辞書から継承されたメンバーに加えて、以下のメンバーが PaymentDetailsInit 辞書の一部です:

id メンバー
この支払いリクエストの自由形式の識別子。
注意
total メンバー
支払いリクエストの非負の合計金額を含む PaymentItem
注意

6.3 PaymentDetailsUpdate 辞書

WebIDLdictionary PaymentDetailsUpdate : PaymentDetailsBase {
  DOMString error;
  PaymentItem total;
  AddressErrors shippingAddressErrors;
  PayerErrors payerErrors;
  object paymentMethodErrors;
};

PaymentDetailsUpdate 辞書は、updateWith() を使用して支払いリクエストを更新するために使用されます。

PaymentDetailsBase 辞書から継承されたメンバーに加えて、以下のメンバーが PaymentDetailsUpdate 辞書の一部です:

error メンバー
選択された配送先住所に商品を配送できない理由や、配送オプションが利用できないその他の理由を説明する、人間が読める文字列。 updateWith() を使用して支払いリクエストが更新される場合、 PaymentDetailsUpdate は、error メンバーにメッセージを含めることができ、 shippingOptions が有効でない場合、ユーザーに表示されます。
total メンバー
非負のPaymentItemを含みます。
注意

この仕様のアルゴリズムは、 PaymentDetailsUpdate 辞書を受け入れる際、 total.amount.value が負の数値である場合に例外をスローします。

shippingAddressErrors メンバー
潜在的なイベントターゲットに関連付けられた配送先住所の検証エラーを表します。
payerErrors メンバー
支払者の詳細に関連する検証エラー。
paymentMethodErrors メンバー

支払い方法に特有のエラー。

7. PaymentDetailsModifier 辞書

WebIDLdictionary PaymentDetailsModifier {
  required DOMString supportedMethods;
  PaymentItem total;
  sequence<PaymentItem> additionalDisplayItems;
  object data;
};

PaymentDetailsModifier 辞書は、PaymentDetailsBase支払い方法識別子に基づいて修正する詳細を提供します。 以下のメンバーを含みます:

supportedMethods メンバー
支払い方法識別子PaymentDetailsModifier のメンバーは、ユーザーがこの 支払い方法を選択した場合にのみ適用されます。
total メンバー
PaymentItem 値で、 total メンバーを上書きします。 これは、 PaymentDetailsInit 辞書の supportedMethods メンバーの 支払い方法識別子に対して適用されます。
additionalDisplayItems メンバー
PaymentItem 辞書のシーケンスで、 displayItems メンバーに追加される 追加の表示項目を提供します。 これは、PaymentDetailsBase 辞書の supportedMethods メンバーの 支払い方法識別子 に対して適用されます。このメンバーは通常、割引や追加料金の行項目を追加するために使用され、選択された 支払い方法の異なる total 金額の理由を示します。
注意

開発者は、 total 金額が displayItemsadditionalDisplayItems の合計であることを確認する責任があります。

data メンバー
サポートされている支払い方法が必要とするかもしれないオプション情報を提供するオブジェクト。 提供された場合、それはシリアライズ されます。

8. PaymentShippingType 列挙型

WebIDLenum PaymentShippingType {
  "shipping",
  "delivery",
  "pickup"
};
"shipping"
これはデフォルトであり、住所配送 の目的地として収集することを指します。
"delivery"
これは、住所を 配達の目的地として収集することを指します。これは通常、 配送よりも速いです。 例えば、食品の配達に使用される場合があります。
"pickup"
これは、サービスの受け取りの一環として収集される 住所 を指します。例えば、洗濯物の受け取りの住所として使用される場合があります。

9. PaymentOptions 辞書

WebIDLdictionary PaymentOptions {
  boolean requestPayerName = false;
  boolean requestBillingAddress = false;
  boolean requestPayerEmail = false;
  boolean requestPayerPhone = false;
  boolean requestShipping = false;
  PaymentShippingType shippingType = "shipping";
};
注意

PaymentOptions 辞書は PaymentRequest コンストラクタに渡され、支払いリクエストに必要なオプションに関する情報を提供します。

requestBillingAddress メンバー
ユーザーエージェント請求先住所を収集して返すべきかどうかを示すブール値。 例えば、特定の地域で税金を計算し、表示されている合計を更新するために使用することができます。
requestPayerName メンバー
ユーザーエージェント が 支払者の名前を収集して返すべきかどうかを示すブール値。 例えば、支払者の名前で予約を行うために true に設定します。
requestPayerEmail メンバー
ユーザーエージェント が 支払者のメールアドレスを収集して返すべきかどうかを示すブール値。 例えば、領収書をメールで送るために true に設定します。
requestPayerPhone メンバー
ユーザーエージェント が 支払者の電話番号を収集して返すべきかどうかを示すブール値。 例えば、請求に関する問い合わせのために顧客に電話をするために true に設定します。
requestShipping メンバー
ユーザーエージェント配送先住所を収集して返すべきかどうかを示すブール値。 例えば、物理的な商品をユーザーに発送する必要がある場合に true に設定します。 デジタル商品を購入する場合は false に設定します。
shippingType メンバー
PaymentShippingType 列挙型の値。 一部の取引では、配送のための 住所 が必要ですが、「配送」という用語が適切ではない場合があります。 例えば、「ピザの配達」や「洗濯物の受け取り」などの場合です。 requestShipping が true に設定されている場合、この shippingType メンバーは ユーザーエージェントが配送先住所を収集するためのユーザーインターフェイスの方法に影響を与える可能性があります。

shippingType メンバーは 支払いリクエストのユーザーインターフェイスのみに影響を与えます。

10. PaymentItem 辞書

WebIDLdictionary PaymentItem {
  required DOMString label;
  required PaymentCurrencyAmount amount;
  boolean pending = false;
};

一つ以上の PaymentItem 辞書のシーケンスは、 支払いリクエストの内容と要求される金額を示すために PaymentDetailsBase 辞書に含まれます。

label メンバー
アイテムの人間が読める説明。ユーザーエージェント はこれをユーザーに表示する場合があります。
注意: ラベルの国際化
amount メンバー
アイテムの金額を含む PaymentCurrencyAmount
pending メンバー
ブール値。true に設定されている場合、 amount メンバーが最終的ではないことを意味します。 これは通常、配送先住所や配送オプションの選択に依存する配送費や税額などの項目を表示するために使用されます。 ユーザーエージェント は支払いリクエストのユーザーインターフェースで保留中のフィールドを示す場合があります。

11. PaymentCompleteDetails 辞書

WebIDLdictionary PaymentCompleteDetails {
  object? data = null;
};

PaymentCompleteDetails 辞書は、支払いリクエストが完了したときに、商人のウェブサイトから支払いハンドラーに追加情報を提供します。

PaymentCompleteDetails 辞書には次のメンバーが含まれます:

data メンバー
関連する PaymentResponse支払い方法 が必要とする可能性がある任意の情報を提供するオブジェクト。 提供された場合、それは シリアライズ されます。

12. PaymentComplete 列挙型

WebIDLenum PaymentComplete {
  "fail",
  "success",
  "unknown"
};
"fail"
支払いの処理が失敗したことを示します。ユーザーエージェント は 失敗を示すUIを表示する場合があります。
"success"
支払いが正常に処理されたことを示します。ユーザーエージェント は 成功を示すUIを表示する場合があります。
"unknown"
開発者が成功または失敗を示しておらず、ユーザーエージェント は 成功または失敗を示すUIを表示すべきではありません。

13. PaymentShippingOption 辞書

WebIDLdictionary PaymentShippingOption {
  required DOMString id;
  required DOMString label;
  required PaymentCurrencyAmount amount;
  boolean selected = false;
};

PaymentShippingOption 辞書には配送オプションを記述するメンバーが含まれています。 開発者は、変更イベントに応答して updateWith() メソッドを呼び出すことで、ユーザーに1つ以上の配送オプションを提供できます。

id メンバー
このPaymentShippingOption を参照するために使用される文字列識別子。 これは、特定のPaymentRequestに対して一意でなければなりません。
label メンバー
アイテムの人間が読める文字列説明。ユーザーエージェント はこの文字列を使用して ユーザーに配送オプションを表示するべきです。
amount メンバー
アイテムの金額を含む PaymentCurrencyAmount
selected メンバー
ブール値。trueの場合、このシーケンス内でデフォルトで選択されている PaymentShippingOption であることを示します。 ユーザーエージェント は ユーザーインターフェースでこのオプションをデフォルトで表示するべきです。

14. PaymentResponse インターフェース

WebIDL[SecureContext, Exposed=Window]
interface PaymentResponse : EventTarget  {
  [Default] object toJSON();

  readonly attribute DOMString requestId;
  readonly attribute DOMString methodName;
  readonly attribute object details;
  readonly attribute ContactAddress? shippingAddress;
  readonly attribute DOMString? shippingOption;
  readonly attribute DOMString? payerName;
  readonly attribute DOMString? payerEmail;
  readonly attribute DOMString? payerPhone;

  [NewObject]
  Promise<undefined> complete(
    optional PaymentComplete result = "unknown",
    optional PaymentCompleteDetails details = {}
  );
  [NewObject]
  Promise<undefined> retry(optional PaymentValidationErrors errorFields = {});

  attribute EventHandler onpayerdetailchange;
};
注意

PaymentResponse は、 ユーザーが支払い方法を選択し、支払いリクエストを承認したときに返されます。

14.1 retry() メソッド

注意

retry(errorFields) メソッドは、次のように動作しなければなりません(MUST):

  1. responsethis とする。
  2. requestresponse.[[request]] とする。
  3. document を、requestrelevant global object関連付けられた Document とする。
  4. documentfully active でない場合は、"AbortError" の DOMException拒否された promise を返す。
  5. response.[[complete]] が true の場合、"InvalidStateError" の DOMException拒否された promise を返す。
  6. response.[[retryPromise]] が null でない場合、"InvalidStateError" の DOMException拒否された promise を返す。
  7. request.[[state]] を "interactive" に設定する。
  8. retryPromise新しい promise とする。
  9. response.[[retryPromise]]retryPromise に設定する。
  10. errorFields が渡された場合:
    1. 任意で、次のいずれかが真である場合は開発者コンソールに警告を表示してもよい:
      1. request.[[options]].requestPayerName が false であり、かつ errorFields.payer.name が存在する場合。
      2. request.[[options]].requestPayerEmail が false であり、かつ errorFields.payer.email が存在する場合。
      3. request.[[options]].requestPayerPhone が false であり、かつ errorFields.payer.phone が存在する場合。
      4. request.[[options]].requestShipping が false であり、かつ errorFields.shippingAddress が存在する場合。
    2. errorFields.paymentMethod メンバーが渡され、かつ response.methodName を定義する仕様でそれが要求されている場合は、errorFieldspaymentMethod メンバーをそこで指定された型の IDL 値に変換する。そうでない場合は、object変換する。
    3. request支払い関連の閲覧コンテキストpayment request is showing 真偽値を false に設定する。
    4. 変換が 例外 error を生じた場合:
      1. retryPromiseerror で拒否する。
      2. ユーザーエージェントpayment request is showing 真偽値を false に設定する。
      3. 戻る。
    5. errorFields の各メンバーをユーザーエージェントの UI 内の対応する入力フィールドに対応付けることで、支払い応答データに問題があることをエンドユーザーに示す。例えば、ユーザーエージェントはブラウザーの UI で誤っている errorFields にユーザーの注意を向け、各フィールドの値を、ユーザーが各エラーを修正しやすいような方法で表示してもよい。同様に、error メンバーが渡された場合は、そのエラーをユーザーエージェントの UI に提示する。メンバーの値が空文字列である場合、ユーザーエージェントは適切なエラーメッセージで値を代用してもよい(MAY)。
  11. それ以外の場合、errorFields が渡されなかったときは、エンドユーザーに支払いの再試行を促す。支払いリクエストの受諾を再試行できるようにする UI 要素を再度有効化する。
  12. document がユーザーインターフェイスの表示中に fully active でなくなる、またはこの段階に到達するまでに fully active でなくなった場合は、次を行う:
    1. ユーザーインターフェイスを閉じる。
    2. request支払い関連の閲覧コンテキストpayment request is showing 真偽値を false に設定する。
  13. 最後に、retryPromise が決着したとき、response.[[retryPromise]] を null に設定する。
  14. retryPromise を返す。
    注意

    retryPromise は後に、ユーザーが支払いリクエストを受諾するアルゴリズム によって解決されるか、ユーザーが支払いリクエストを中止するアルゴリズム または 更新を中止 によって拒否されます。

14.1.1 PaymentValidationErrors 辞書

WebIDLdictionary PaymentValidationErrors {
  PayerErrors payer;
  AddressErrors shippingAddress;
  DOMString error;
  object paymentMethod;
};
payer メンバー
支払者の詳細 に関連する検証エラー。
shippingAddress メンバー
PaymentResponseshippingAddress に関する検証エラーを表します。
error メンバー
ユーザーが復旧を試みることができる、支払いに関する一般的なエラーの説明。例えば、ユーザーは支払いを再試行することで復旧できる場合があります。開発者は任意で、error メンバーだけを渡して検証問題の概要を示すことも、PaymentValidationErrors 辞書の他のメンバーと組み合わせて渡すこともできます。
注意: エラーの国際化
paymentMethod メンバー
支払い方法に特有のエラー。

14.1.2 PayerErrors 辞書

WebIDLdictionary PayerErrors {
  DOMString email;
  DOMString name;
  DOMString phone;
};

PayerErrors は、1 つ以上の 支払者の詳細 に関する検証エラーを表すために使用されます。

支払者の詳細 とは、支払者の氏名、電話番号、メールアドレスのいずれかを指します。

email メンバー
支払者のメールアドレスに検証エラーがあることを示します。ユーザーエージェントの UI では、このメンバーは PaymentResponsepayerEmail 属性の値を提供した入力フィールドに対応します。
name メンバー
支払者の氏名に検証エラーがあることを示します。ユーザーエージェントの UI では、このメンバーは PaymentResponsepayerName 属性の値を提供した入力フィールドに対応します。
phone メンバー
支払者の電話番号に検証エラーがあることを示します。ユーザーエージェントの UI では、このメンバーは PaymentResponsepayerPhone 属性の値を提供した入力フィールドに対応します。

14.2 methodName 属性

取引を完了するためにユーザーが選択した 支払い方法識別子支払い方法)です。

14.3 details 属性

マーチャントが取引を処理または検証するために使用できる、支払い方法 によって生成された object または dictionary(どの 支払い方法 かに依存します)。

注意

14.4 shippingAddress 属性

requestShipping メンバーが、 PaymentRequest コンストラクタに渡された PaymentOptions 内で true に設定されていた場合、 shippingAddress はユーザーが選択した 完全かつ最終的な 配送先住所となります。

14.5 shippingOption 属性

requestShipping メンバーが、 PaymentRequest コンストラクタに渡された PaymentOptions 内で true に設定されていた場合、 shippingOption は選択された配送オプションの id 属性となります。

14.6 payerName 属性

requestPayerName メンバーが、 PaymentRequest コンストラクタに渡された PaymentOptions 内で true に設定されていた場合、 payerName はユーザーが提供した氏名となります。

14.7 payerEmail 属性

requestPayerEmail メンバーが、 PaymentRequest コンストラクタに渡された PaymentOptions 内で true に設定されていた場合、 payerEmail はユーザーが選択したメールアドレスとなります。

14.8 payerPhone 属性

requestPayerPhone メンバーが、 PaymentRequest コンストラクタに渡された PaymentOptions 内で true に設定されていた場合、 payerPhone はユーザーが選択した電話番号となります。

14.9 requestId 属性

この支払い応答を生成した対応する支払いリクエストの id

14.10 complete() メソッド

注意

complete() メソッドは、 ユーザーが支払いリクエストを受諾し [[acceptPromise]] が解決された後に呼び出されます。 complete() メソッドの呼び出しは ユーザーエージェント に対し、支払いのやり取りが終了したことを知らせ (残っているユーザーインターフェイスは閉じられるべきです(SHOULD))。

支払いリクエストが受諾され、呼び出し元に PaymentResponse が返された後で、 呼び出し元が complete() を呼び出す前は、 支払いリクエストのユーザーインターフェイスは保留状態のままです。 この時点では支払いリクエストの受諾が返ってきているため、ユーザーインターフェイスはキャンセルコマンドを提供すべきではありません(SHOULD NOT)。 しかし、何らかの問題が発生し開発者が complete() を呼び出さない場合、 ユーザーインターフェイスはブロックされます。

このため、実装は開発者が complete() を呼び出すための タイムアウトを課してもよい(MAY)とします。タイムアウトが期限切れになった場合、 引数なしで complete() が呼び出されたかのように動作します。

complete() メソッドは次のように動作しなければなりません(MUST):

  1. responsethis とする。
  2. response.[[complete]] が true の場合、 "InvalidStateError" の DOMException拒否された promise を返す。
  3. response.[[retryPromise]] が null でない場合、 "InvalidStateError" の DOMException拒否された promise を返す。
  4. promise新しい promise とする。
  5. serializedData を、 serialize により details.data を JSON 文字列へ直列化した結果とする。
  6. 直列化が 例外を送出 した場合、 その例外で 拒否された promise を返す。
  7. response.methodName を定義する仕様で要求されている場合:
    1. json を、JSONparse()serializedData を渡して呼び出した結果とする。
    2. idl を、変換 により json を、当該仕様で指定された型の IDL 値へ変換した結果とする。
    3. IDL 値への変換が 例外を送出 した場合、 その例外で 拒否された promise を返す。
    4. さらに、response.methodName を定義する仕様で要求されている場合、 idl のメンバーを検証する。メンバーの値が無効であれば、 拒否された promiseTypeError で返す。
      注意: 復旧の機会
  8. response.[[complete]] を true に設定する。
  9. promise を返し、残りの手順を 並行して実行する。
  10. document が、ユーザーインターフェイスの表示中に fully active でなくなる、またはこの段階に達するまでに fully active でなくなった場合は、次を行う:
    1. ユーザーインターフェイスを閉じる。
    2. request支払い関連の閲覧コンテキストpayment request is showing 真偽値を false に設定する。
  11. それ以外の場合:
    1. 残っているユーザーインターフェイスを閉じる。 ユーザーエージェント は、 resultserializedData の値を用いて ユーザー体験に影響を与えてもよい(MAY)。
    2. request支払い関連の閲覧コンテキストpayment request is showing 真偽値を false に設定する。
    3. promise を undefined で解決する。

14.11 onpayerdetailchange 属性

開発者が "payerdetailchange" イベントを処理できるようにします。

14.12 内部スロット

PaymentResponse のインスタンスは、 次の表の internal slots とともに作成されます:

内部スロット 説明(非規範的
[[complete]] 支払い要求が完了している(すなわち complete() が呼び出された、 もしくは致命的なエラーにより応答がもはや使用不能になった)場合は true、 それ以外の場合は false。
[[request]] この PaymentResponse を生成した PaymentRequest のインスタンス。
[[retryPromise]] Null、または Promiseuser accepts the payment request の際に解決され、user aborts the payment request の場合は拒否される。

15. 配送先住所と請求先住所

PaymentRequest インターフェースは、商人がユーザーに対して配送および/または請求の目的で 物理的住所の提供を依頼できるようにします。 配送先住所請求先住所 は、 物理的住所です。

15.1 AddressErrors 辞書

WebIDLdictionary AddressErrors {
  DOMString addressLine;
  DOMString city;
  DOMString country;
  DOMString dependentLocality;
  DOMString organization;
  DOMString phone;
  DOMString postalCode;
  DOMString recipient;
  DOMString region;
  DOMString sortingCode;
};

AddressErrors 辞書のメンバーは、 物理的住所の特定の部分に関する検証エラーを表します。 各辞書メンバーには二重の機能があります。第一に、そのメンバーが存在することは住所の特定部分に検証エラーがあることを示します。 第二に、その文字列値により、開発者は検証エラー(およびエンドユーザーがエラーをどのように修正できるか)を記述できます。

注意

開発者は、ユーザーが住所の一部を修正できない場合があることを認識しておく必要があります。 そのため、ユーザーが制御できない事項の修正を求めないよう注意する必要があります。

addressLine メンバー
住所行 に検証エラーがあることを示します。 ユーザーエージェントの UI では、このメンバーは ContactAddressaddressLine 属性値を提供した入力フィールドに対応します。
city メンバー
市区町村 に検証エラーがあることを示します。 ユーザーエージェントの UI では、このメンバーは ContactAddresscity 属性値を提供した入力フィールドに対応します。
country メンバー
に検証エラーがあることを示します。 ユーザーエージェントの UI では、このメンバーは ContactAddresscountry 属性値を提供した入力フィールドに対応します。
dependentLocality メンバー
小地域(dependent locality) に検証エラーがあることを示します。ユーザーエージェントの UI では、このメンバーは ContactAddressdependentLocality 属性値を提供した入力フィールドに対応します。
organization メンバー
組織名 に検証エラーがあることを示します。 ユーザーエージェントの UI では、このメンバーは ContactAddressorganization 属性値を提供した入力フィールドに対応します。
phone メンバー
電話番号 に検証エラーがあることを示します。 ユーザーエージェントの UI では、このメンバーは ContactAddressphone 属性値を提供した入力フィールドに対応します。
postalCode メンバー
郵便番号 に検証エラーがあることを示します。 ユーザーエージェントの UI では、このメンバーは ContactAddresspostalCode 属性値を提供した入力フィールドに対応します。
recipient メンバー
受取人 に検証エラーがあることを示します。 ユーザーエージェントの UI では、このメンバーは ContactAddressaddressLine 属性値を提供した入力フィールドに対応します。
region メンバー
地域(都道府県など) に検証エラーがあることを示します。 ユーザーエージェントの UI では、このメンバーは ContactAddressregion 属性値を提供した入力フィールドに対応します。
sortingCode メンバー
ソーティングコード に検証エラーがあります。 ユーザーエージェントの UI では、このメンバーは ContactAddresssortingCode 属性値を提供した入力フィールドに対応します。

16. Permissions Policy の統合

この仕様は、文字列 "payment" によって識別される ポリシー制御機能 を定義します [permissions-policy]。その 既定の許可リスト'self' です。

注意

17. イベント

17.1 要約

この節は非規範的です。

イベント名 インターフェース 次のときにディスパッチされる… ターゲット
shippingaddresschange PaymentRequestUpdateEvent ユーザーが新しい配送先住所を提供したとき。 PaymentRequest
shippingoptionchange PaymentRequestUpdateEvent ユーザーが新しい配送オプションを選択したとき。 PaymentRequest
payerdetailchange PaymentRequestUpdateEvent ユーザーが支払者の氏名・メール・電話番号を変更したとき(payer detail changed algorithm を参照)。 PaymentResponse
paymentmethodchange PaymentMethodChangeEvent ユーザーが 支払い方法支払いハンドラー 内で別のものに選択したとき。 PaymentRequest

17.2 PaymentMethodChangeEvent インターフェース

WebIDL[SecureContext, Exposed=Window]
interface PaymentMethodChangeEvent : PaymentRequestUpdateEvent {
  constructor(DOMString type, optional PaymentMethodChangeEventInit eventInitDict = {});
  readonly attribute DOMString methodName;
  readonly attribute object? methodDetails;
};

17.2.1 methodDetails 属性

取得時には、初期化時に設定された値を返します。詳細は methodDetails メンバー( PaymentMethodChangeEventInit) を参照してください。

17.2.2 methodName 属性

取得時には、初期化時に設定された値を返します。詳細は methodName メンバー( PaymentMethodChangeEventInit) を参照してください。

17.2.3 PaymentMethodChangeEventInit 辞書

WebIDLdictionary PaymentMethodChangeEventInit : PaymentRequestUpdateEventInit {
  DOMString methodName = "";
  object? methodDetails = null;
};
methodName メンバー
支払い方法識別子 を表す文字列。
methodDetails メンバー
支払い方法からのデータを表すオブジェクト、または null。

17. PaymentRequestUpdateEvent インターフェース

WebIDL[SecureContext, Exposed=Window]
interface PaymentRequestUpdateEvent : Event {
  constructor(DOMString type, optional PaymentRequestUpdateEventInit eventInitDict = {});
  undefined updateWith(Promise<PaymentDetailsUpdate> detailsPromise);
};

PaymentRequestUpdateEvent は、 ユーザー操作に応答して支払いリクエストの詳細を更新できるようにします。

17.3.1 Constructor

PaymentRequestUpdateEventconstructor(type, eventInitDict) は次のように動作しなければなりません(MUST):

  1. event を、 constructorPaymentRequestUpdateEvent に対して type および eventInitDict とともに呼び出した結果とする。
  2. event[[waitForUpdate]] を false に設定する。
  3. event を返す。

17.3.2 updateWith() メソッド

注意

updateWith()detailsPromise 付き)メソッドは、次のように動作しなければなりません(MUST):

  1. eventthis とする。
  2. eventisTrusted 属性が false の場合、 "throw" で "InvalidStateError" の DOMException を送出する。
  3. event[[waitForUpdate]] が true の場合、 "throw" で "InvalidStateError" の DOMException を送出する。
  4. eventtargetPaymentResponse のインスタンスである場合、 requesteventtarget[[request]] とする。
  5. それ以外の場合、requesteventtarget の値とする。
  6. Assert: requestPaymentRequest のインスタンスである。
  7. request[[state]] が "interactive" でない場合、 "throw" で "InvalidStateError" の DOMException を送出する。
  8. request[[updating]] が true の場合、 "throw" で "InvalidStateError" の DOMException を送出する。
  9. eventstop propagation flagstop immediate propagation flag を設定する。
  10. event[[waitForUpdate]] を true に設定する。
  11. pmi を null とする。
  12. eventmethodName 属性を持つ場合、pmi をその methodName 属性の値に設定する。
  13. detailsPromiserequestpmi を引数に、 update a PaymentRequest's details algorithm を実行する。

17.3.3 内部スロット

PaymentRequestUpdateEvent のインスタンスは、 次の表の internal slots とともに作成されます:

内部スロット 説明(非規範的
[[waitForUpdate]] updateWith() によって開始された更新が現在進行中であるかどうかを示す boolean。

17.3.4 PaymentRequestUpdateEventInit 辞書

WebIDLdictionary PaymentRequestUpdateEventInit : EventInit {};

18. アルゴリズム

内部スロット [[state]]PaymentRequest オブジェクトで "interactive" に設定されると、 ユーザーエージェントは ユーザー操作に基づいて以下のアルゴリズムをトリガーします。

18.1 支払い可能かどうかのアルゴリズム

支払い可能かどうかのアルゴリズムは、 ユーザーエージェント支払い方法により 支払いを実行できるかを、PaymentRequest が構築された際に指定されたそれらの 支払い方法に対して確認します。

  1. メソッドが呼び出された対象の request を、PaymentRequest オブジェクトとする。
  2. request.[[state]] が "created" でない場合、 "InvalidStateError" の DOMException拒否された promise を返す。
  3. 任意で、 トップレベル閲覧コンテキスト の裁量で、"NotAllowedError" の DOMException拒否された promise を返してもよい。
    注意

    これは、フィンガープリント目的での呼び出しメソッドの乱用を検出・防止するために、 ユーザーエージェントがヒューリスティクスを適用できるようにするものです。例えば、 さまざまなサポート対象のPaymentRequest オブジェクトを作成し、 多様な支払い方法を指定して、 それらに対して順番に 支払い可能かどうかのアルゴリズム をトリガーする、といった場合です。 例えば、ユーザーエージェントは成功する呼び出し回数を、 トップレベル閲覧コンテキスト やそれらの呼び出しが行われた期間に基づいて制限するかもしれません。

  4. hasHandlerPromise新しい promise とする。
  5. hasHandlerPromise を返し、残りの手順を 並行して実行する。
  6. request[[serializedMethodData]] の各 paymentMethod タプルについて:
    1. identifier を、その paymentMethod タプルの最初の要素とする。
    2. ユーザーエージェントが identifier に対する支払い要求を処理可能な 支払いハンドラー を持つ場合、 hasHandlerPromise を true で解決し、このアルゴリズムを終了する。
  7. hasHandlerPromise を false で解決する。

18.2 配送先住所変更アルゴリズム

配送先住所変更アルゴリズムは、ユーザーが新しい配送先住所を提供したときに実行されます。 これは以下の手順を実行しなければなりません(MUST)。

  1. ユーザーが操作している PaymentRequest オブジェクトを request とする。
  2. タスクをキューに入れユーザー操作タスクソース上で 次の手順を実行する:
    1. 注意: 受取人情報のプライバシー

      redactList は、この API が商人と共有する受取人に関する個人情報の量を制限します。

      商人にとって、結果として得られる ContactAddress オブジェクトは、例えば配送料の計算に十分な情報を提供しますが、 多くの場合、受取人を物理的に特定し一意に識別するのに十分な情報は提供しません。

      残念ながら、redactList があっても受取人の匿名性は保証できません。 これは、一部の国では郵便番号が非常に細分化されており、 それ自体で受取人を一意に識別できてしまうためです。

    2. redactList を空のリストとする。redactList を « "organization", "phone", "recipient", "addressLine" » に設定する。
    3. address を、 redactList を用いて create a contactaddress from user-provided input の手順を実行した結果とする。
    4. request.shippingAddressaddress に設定する。
    5. request と "shippingaddresschange" を引数に、 PaymentRequest 更新アルゴリズム を実行する。

18.3 配送オプション変更アルゴリズム

配送オプション変更アルゴリズムは、ユーザーが新しい配送オプションを選択したときに実行されます。 これは以下の手順を実行しなければなりません(MUST)。

  1. ユーザーが操作している PaymentRequest オブジェクトを request とする。
  2. タスクをキューに入れユーザー操作タスクソース上で 次の手順を実行する:
    1. request 上の shippingOption 属性を、ユーザーが指定した PaymentShippingOptionid 文字列に設定する。
    2. request と "shippingoptionchange" を引数に、 PaymentRequest 更新アルゴリズム を実行する。

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

ユーザーが 支払い方法 を変更したとき、支払いハンドラーは、MAY(実施してもよい)として 支払い方法変更アルゴリズム を実行できます。 その際に渡される methodDetailsdictionary または object、あるいは null であり、 methodName は DOMString で、ユーザーが操作中の 支払いハンドラー支払い方法識別子 を表します。

Note: paymentmethodchange イベントで共有される情報のプライバシー

ユーザーが支払い方法(例:クレジットカード)を選択または変更すると、 PaymentMethodChangeEvent には 税計算を行う目的でマスキング(秘匿)された請求先住所情報が含まれます。 マスキング対象の属性には、住所行小地域(dependent locality)組織電話番号、 および 受取人 などが含まれます(これらに限りません)。

  1. ユーザーが操作している PaymentRequest オブジェクトを request とする。
  2. Queue a taskuser interaction task source 上に行い、 次の手順を実行する:
    1. Assert: request.[[updating]] は false であること。 同時に行える更新は 1 回のみである。
    2. Assert: request.[[state]] は "interactive" であること。
    3. Fire an event で、名前が "paymentmethodchange" のイベントを request に対して発火し、 PaymentMethodChangeEvent を用いる。 このとき、 methodName 属性は methodName に初期化し、 methodDetails 属性は methodDetails に初期化する。

18.5 PaymentRequest 更新アルゴリズム

PaymentRequest 更新アルゴリズム は、 上記の他のアルゴリズムから呼び出され、ユーザーが PaymentRequestrequest)に対して変更を行ったことを示すための イベントの発火を行う。 発火するイベント名は name とする。

  1. Assert: request.[[updating]] は false であること。 同時に行える更新は 1 回のみである。
  2. Assert: request.[[state]] は "interactive" であること。
  3. event を、 creating an event により PaymentRequestUpdateEvent インターフェイスを用いて作成した結果とする。
  4. eventtype 属性を name に初期化する。
  5. Dispatch eventrequest に対して行う。
  6. もし event.[[waitForUpdate]] が true なら、 追加の更新イベントを発火させる可能性のある UI の部分を無効化する。
  7. それ以外の場合は、 event.[[waitForUpdate]] を true に設定する。

18.6 支払者詳細変更アルゴリズム

ユーザーが UI で payer namepayer email、または payer phone を変更したとき、ユーザーエージェントは MUST(実施しなければならない)として 支払者詳細変更アルゴリズム を実行する。

  1. ユーザーが操作している PaymentRequest オブジェクトを request とする。
  2. request.[[response]] が null の場合は、何もせず戻る。
  3. responserequest.[[response]] とする。
  4. Queue a taskuser interaction task source 上に行い、 次の手順を実行する:
    1. Assert: request.[[updating]] は false であること。
    2. Assert: request.[[state]] は "interactive" であること。
    3. optionsrequest.[[options]] とする。
    4. payer name が変更され、かつ options.requestPayerName が true の場合:
      1. response.payerName 属性を payer name に設定する。
    5. payer email が変更され、かつ options.requestPayerEmail が true の場合:
      1. response.payerEmailpayer email に設定する。
    6. payer phone が変更され、かつ options.requestPayerPhone が true の場合:
      1. response.payerPhonepayer phone に設定する。
    7. event を、 creating an event により PaymentRequestUpdateEvent を用いて作成した結果とする。
    8. eventtype 属性を "payerdetailchange" に初期化する。
    9. Dispatch eventresponse に対して行う。
    10. もし event.[[waitForUpdate]] が true なら、 支払者詳細のさらなる変更を発火させる可能性のある UI の部分を無効化する。
    11. それ以外の場合は、 event.[[waitForUpdate]] を true に設定する。

18.7 ユーザーが支払いリクエストを受諾するアルゴリズム

ユーザーが支払いリクエストを受諾するアルゴリズム は、 ユーザーが支払いリクエストを受諾し、支払う意思を確認したときに実行されます。次の手順を実行するため、 タスクをキューに入れuser interaction task source 上で実行しなければなりません(MUST)。

  1. request を、ユーザーが操作している PaymentRequest オブジェクトとする。
  2. もし request.[[updating]] が true なら、 このアルゴリズムを終了し、それ以上の処理を行わない。ユーザーエージェントの ユーザーインターフェイスは、この状況が決して起こらないようにすべきです(SHOULD)。
  3. request.[[state]] が "interactive" でない場合、 このアルゴリズムを終了し、それ以上の処理を行わない。ユーザーエージェントのユーザーインターフェイスは、 この状況が決して起こらないようにすべきです(SHOULD)。
  4. requestShipping の値が request.[[options]] において true の場合で、 requestshippingAddress 属性が null、 または requestshippingOption 属性が null の場合、このアルゴリズムを終了し、それ以上の処理を行わない。 ユーザーエージェント は、この状況が決して起こらないようにすべきです(SHOULD)。
  5. isRetry を、 request.[[response]] が null でないなら true、 そうでなければ false とする。
  6. response を、 isRetry が true の場合は request.[[response]] とし、そうでない場合は 新しい PaymentResponse とする。
  7. isRetry が false の場合、新たに作成した response を初期化する:
    1. response.[[request]]request に設定する。
    2. response.[[retryPromise]] を null に設定する。
    3. response.[[complete]] を false に設定する。
    4. responserequestId 属性値を、 request.[[details]]id の値に設定する。
    5. request.[[response]]response に設定する。
  8. handler を、 request.[[handler]] とする。
  9. responsemethodName 属性値を、 handler支払い方法識別子 に設定する。
  10. responsedetails 属性値を、 handlersteps to respond to a payment request を実行して得られるオブジェクトに設定する。
  11. requestShipping の値が request.[[options]] において false の場合、 responseshippingAddress 属性値を null に設定する。そうでなければ:
    1. shippingAddress を、 create a contactaddress from user-provided input の結果とする。
    2. responseshippingAddress 属性値を shippingAddress に設定する。
    3. requestshippingAddress 属性値を shippingAddress に設定する。
  12. requestShipping の値が request.[[options]] において true の場合、 responseshippingOption 属性を、 requestshippingOption 属性の値に設定する。 そうでなければ null に設定する。
  13. requestPayerName の値が request.[[options]] において true の場合、 responsepayerName 属性を、ユーザーが提供した 支払者の氏名に(提供がなければ null に)設定する。そうでなければ null に設定する。
  14. requestPayerEmail の値が request.[[options]] において true の場合、 responsepayerEmail 属性を、ユーザーが提供した 支払者のメールアドレスに(提供がなければ null に)設定する。そうでなければ null に設定する。
  15. requestPayerPhone の値が request.[[options]] において true の場合、 responsepayerPhone 属性を、ユーザーが提供した 支払者の電話番号に(提供がなければ null に)設定する。 payerPhone の値を設定する際、 ユーザーエージェントは [E.164] に準拠するよう 電話番号をフォーマットすべきです(SHOULD)。
  16. request.[[state]] を "closed" に設定する。
  17. isRetry が true の場合、 response.[[retryPromise]] を undefined で解決する。 そうでなければ、 request.[[acceptPromise]]response で解決する。

18.8 ユーザーが支払いリクエストを中止するアルゴリズム

ユーザーが支払いリクエストを中止するアルゴリズム は、 現在インタラクティブなユーザーインターフェイスを通じてユーザーが支払いリクエストを中止したときに実行されます。 次の手順を実行するために、 タスクをキューに入れuser interaction task source 上で実行しなければなりません(MUST)。

  1. request を、ユーザーが操作している PaymentRequest オブジェクトとする。
  2. request.[[state]] が "interactive" でない場合、 このアルゴリズムを終了し、それ以上の処理を行わない。ユーザーエージェントのユーザーインターフェイスは、 この状況が決して起こらないようにすべきです(SHOULD)。
  3. request.[[state]] を "closed" に設定する。
  4. requestpayment-relevant browsing contextpayment request is showing 真偽値を false に設定する。
  5. error を、"AbortError" の DOMException とする。
  6. response を、 request.[[response]] とする。
  7. response が null でない場合:
    1. response.[[complete]] を true に設定する。
    2. Assert: response.[[retryPromise]] は null ではない。
    3. response.[[retryPromise]]error で拒否する。
  8. それ以外の場合は、 request.[[acceptPromise]]error で拒否する。
  9. 現在のユーザーインタラクションを中止し、残っているユーザーインターフェイスをすべて閉じる。

18.9 PaymentRequest の details を更新するアルゴリズム

PaymentRequest の details を更新する アルゴリズムは、PaymentDetailsUpdatedetailsPromisePaymentRequestrequest、および DOMString か null(支払い方法識別子)である pmi を受け取ります。手順は detailsPromise の決着に依存します。もし detailsPromise が決着しない場合、 支払いリクエストはブロックされます。ユーザーエージェントは支払いリクエストを中止する手段を提供すべきです(SHOULD)。実装は、 detailsPromise が妥当な時間内に決着しない場合、保留中の更新にタイムアウトを設けてもよいです(MAY)。

タイムアウトが発生した場合、またはユーザーが手動で中止した場合、あるいは 支払いハンドラーが当該支払いを中止することを決定した場合には、 ユーザーエージェントは ユーザーが支払いリクエストを中止する アルゴリズムを実行しなければなりません(MUST)。

  1. request.[[updating]] を true に設定する。
  2. 並行して、 ユーザーが支払いリクエストを受諾できるユーザーインターフェイスを無効にする。これは、ユーザーインターフェイスが新しい details で更新されるまで支払いが受諾されないようにするためです。
  3. 拒否時detailsPromise の拒否時):
    1. 更新を中止し、request と "AbortError" の DOMException を用いる。
  4. 履行時detailsPromise が値 value で解決されたとき):
    1. details を、 IDL 値への変換により valuePaymentDetailsUpdate 辞書へ変換した結果とする。これが例外を 送出した場合は、 更新を中止し、request と その送出された例外を用いる。
    2. serializedModifierData を空のリストとする。
    3. selectedShippingOption を null とする。
    4. shippingOptions を空の sequence<PaymentShippingOption> とする。
    5. details を検証し正規化する:
      1. detailstotal メンバーが存在する場合:
        1. 合計額の確認と正規化details.total.amount に対して行う。 例外が送出された場合は、更新を中止 し、request とその例外を用いる。
      2. detailsdisplayItems メンバーが存在する場合、各 item について details.displayItems 内を反復する:
        1. 金額の確認と正規化item.amount に対して行う。例外が 送出された場合は、更新を中止し、 request とその例外を用いる。
      3. detailsshippingOptions メンバーが存在し、かつ request.[[options]].requestShipping が true の場合:
        1. seenIDs を空集合とする。
        2. option について details.shippingOptions を反復する:
          1. 金額の確認と正規化option.amount に対して行う。 例外が 送出された場合は、更新を中止し、 request とその例外を用いる。
          2. もし seenIDs[option.{{PaymentShippingOption/id}] が 存在するなら、更新を中止し、 requestTypeError を用いる。
          3. option.idseenIDs に追加する。
          4. optionshippingOptions に追加する。
          5. もし option.selected が true なら、 selectedShippingOptionoption.id に設定する。
      4. detailsmodifiers メンバーが存在する場合:
        1. modifiers を次のシーケンスとする: details.modifiers
        2. serializedModifierData を空のリストとする。
        3. PaymentDetailsModifiermodifier について modifiers を反復する:
          1. 支払い方法識別子の検証 の手順を modifier.supportedMethods で実行する。false を返した場合は、 更新を中止し、 requestRangeError 例外を用いる。任意で、開発者に支払い方法識別子が無効であることを通知してもよい。
          2. modifiertotal メンバーが存在する場合:
            1. 合計額の確認と正規化modifier.total.amount に対して行う。例外が送出された場合は 更新を中止し、 request とその例外を用いる。
          3. additionalDisplayItemsmodifier に存在する場合、各 PaymentItemitem について modifier.additionalDisplayItems を反復する:
            1. 金額の確認と正規化item.amount に対して行う。 例外が送出された場合は 更新を中止し、 request とその例外を用いる。
          4. modifierdata メンバーが欠落している場合は、serializedData を null とする。 それ以外の場合、serializedData直列化により modifier.data を JSON 文字列へ変換した結果とする。例外が送出された場合は、 更新を中止し、 request とその例外を用いる。
          5. serializedDataserializedModifierData に追加する。
          6. 存在する場合は、modifierdata メンバーを削除する。
    6. paymentMethodErrors メンバーが存在し、かつ identifier が null でない場合:
      1. pmi を定義する仕様で要求される場合は、 変換を行い、 paymentMethodErrors を IDL 値へ変換する。
      2. 変換が 例外 error を生じた場合は、 更新を中止し、error を用いる。
      3. 支払いハンドラーは、 paymentMethodErrors の関連する誤った各フィールドに対してエラーを表示すべきです(SHOULD)。
    7. 新しい details を用いて PaymentRequest を更新する:
      1. detailstotal メンバーが存在する場合:
        1. request.[[details]].totaldetails.total に設定する。
      2. detailsdisplayItems メンバーが存在する場合:
        1. request.[[details]].displayItemsdetails.displayItems に設定する。
      3. detailsshippingOptions メンバーが存在し、かつ request.[[options]].requestShipping が true の場合:
        1. request.[[details]].shippingOptionsshippingOptions に設定する。
        2. requestshippingOption 属性の値を selectedShippingOption に設定する。
      4. detailsmodifiers メンバーが存在する場合:
        1. request.[[details]].modifiersdetails.modifiers に設定する。
        2. request.[[serializedModifierData]]serializedModifierData に設定する。
      5. もし request.[[options]].requestShipping が true で、 request.[[details]].shippingOptions が空である場合、開発者は現在選択されている配送先住所(requestshippingAddress により与えられる)に対して有効な配送オプションがないことを示しています。

        この場合、ユーザーエージェントはこの旨のエラーを表示すべきであり(SHOULD)、 現在選択されている配送先住所が何らかの理由で無効であることを示してもよいです(MAY)。 ユーザーエージェントは、存在する場合には error メンバーを用いて、その住所に有効な配送オプションがない理由に関する情報を提供すべきです(SHOULD)。

        さらに、 details["shippingAddressErrors"] メンバーが存在する場合、ユーザーエージェントは配送先住所の各誤ったフィールドに対して個別のエラーを表示すべきです(SHOULD)。 これは、表示されているユーザーインターフェイス内の対応する入力フィールドに、 AddressErrors の各存在するメンバーを対応付けることで行います。

        同様に、details["payerErrors"] メンバーが存在し、 かつ request.[[options]]requestPayerNamerequestPayerEmail、 または requestPayerPhone が true の場合、各誤ったフィールドに対して個別のエラーを表示します。

        さらに、 details.paymentMethodErrors が存在する場合、当該支払い方法の各誤った入力フィールドに対して個別のエラーを表示します。

  5. request.[[updating]] を false に設定する。
  6. 変更された request 内の値に基づいてユーザーインターフェイスを更新する。 本アルゴリズムの実行前に無効化したユーザーインターフェイス要素を再び有効化する。

18.9.1 更新を中止

PaymentRequestrequest例外 exception を使って 更新を中止するには:

  1. 任意で、エラーが発生したことをユーザーに知らせるエラーメッセージを表示する。
  2. 現在のユーザーインタラクションを中止し、残っているユーザーインターフェイスをすべて閉じる。
  3. タスクをキューに入れuser interaction task source 上で次を実行する:
    1. request支払い関連の閲覧コンテキストpayment request is showing 真偽値を false に設定する。
    2. request.[[state]] を "closed" に設定する。
    3. response を、 request.[[response]] とする。
    4. response が null でない場合:
      1. response.[[complete]] を true に設定する。
      2. Assert: response.[[retryPromise]] は null ではない。
      3. response.[[retryPromise]]exception で拒否する。
    5. それ以外の場合は、 request.[[acceptPromise]]exception で拒否する。
    6. request.[[updating]] を false に設定する。
  4. このアルゴリズムを中止する。
Note

更新を中止は、提供された detailsPromise の拒否や、その履行値に無効なデータが含まれているといった、支払いリクエストの更新における致命的なエラーが発生したときに実行されます。これは、 開発者が変更イベントを正常に処理できていないため、支払いリクエストが不整合な状態のままになる可能性があります。

その結果、PaymentRequest は "closed" 状態に移行します。エラーは、 [[acceptPromise]](すなわち、 show() により返される promise)を拒否することで開発者に通知されます。

同様に、更新の中止retry() の最中に発生した場合、 [[retryPromise]] は 拒否され、対応する PaymentResponse[[complete]] 内部スロットは true(すなわち、もはや使用できない)に設定されます。

19. プライバシーとセキュリティに関する考慮事項

19.1 show() メソッドにおけるユーザー保護

この節は非規範的です。

ユーザーが機微な認証情報をオリジンに不注意に共有してしまうことを防ぐため、本 API は PaymentRequest の show() メソッドが、該当する Window一時的なアクティベーション(例: クリックや押下)を有している間に呼び出されることを要求します。

迷いや混乱のないユーザー体験のために、この仕様は show() メソッドにより、ユーザーエージェントが同時に表示できる UI を 1 つに制限します。 さらに、ユーザーエージェントは、ページが show() を呼び出せる頻度を制限できます。

19.2 セキュアコンテキスト

この節は非規範的です。

この仕様で定義される API は、セキュアコンテキストでのみ公開されます。 詳細は Secure Contexts 仕様も参照してください。 実際には、この API は HTTPS 経由でのみ利用可能です。これは、支払い方法データ(例: クレジットカード番号)が平文で送信される可能性を抑制するためです。

19.3 クロスオリジンの支払いリクエスト

この節は非規範的です。

商人やその他の受取人が、チェックアウトやその他の e コマースの処理を支払いサービスプロバイダーに委任することは一般的であり、 その際には iframe が用いられます。本 API は、[HTML] の allow 属性を通じて、受取人が許可したクロスオリジン iframe をサポートします。

支払いハンドラーは、 iframe をホストするオリジンと、 その内容(そこで PaymentRequest が開始される)のオリジンの双方にアクセスできます。

19.4 データフィールドの暗号化

この節は非規範的です。

PaymentRequest API はデータフィールドの暗号化を直接はサポートしません。 個々の支払い方法は暗号化データのサポートを含めることを選択できますが、 すべての支払い方法にそれを義務付けるものではありません。

19.5 ユーザーエージェントが支払いハンドラーを突き合わせる方法

この節は非規範的です。

セキュリティ上の理由から、ユーザーエージェントは show() および canMakePayment() におけるマッチングを、URL の 支払い方法識別子と同一オリジンの 支払いハンドラーに限定することができます。

19.6 データの利用

支払い方法の所有者は、その支払い方法のために収集されたユーザーデータがどのように利用され得るかについてのプライバシーポリシーを定めます。 Payment Request API は、データが取引完了の目的で利用されるという明確な期待を設定し、この API に関連するユーザー体験もその意図を伝えます。 受取人は、いかなるデータ利用も支払い方法のポリシーに適合していることを保証する責任を負います。 取引完了を超える許容された利用については、受取人はその利用をユーザーに明確に伝えるべきです。

19.7 ユーザー情報の開示

ユーザーエージェントは、ユーザーの同意なしに、(例: 配送先住所)などのユーザーに関する情報を開発者と共有してはなりません(MUST NOT)。

特に、PaymentMethodDatadata と、 PaymentResponsedetails メンバーは、任意のデータ交換を可能にします。 既存の支払い方法で用いられるデータモデルは広範に及ぶため、この API でデータの詳細を規定すると有用性が制限されてしまいます。 details メンバーは、Web ベース(Payment Handler API により定義)であれプロプライエタリであれ、支払いハンドラーからのデータを運びます。 ユーザーエージェントは、十分なユーザー同意メカニズム(取引当事者の認識や、データ共有の意図を示す仕組みなど)を含まない限り、支払いハンドラーをサポートしてはなりません(MUST NOT)。

displayItems メンバーや additionalDisplayItems メンバーの値を、取引完了を容易にする目的以外で共有することは、ユーザーエージェントはしてはなりません(MUST NOT)。

PaymentMethodChangeEvent は、選択された 支払い方法に特有の情報に基づいて、表示される合計を受取人が更新できるようにします。 例えば、選択された支払い方法に関連付けられた請求先住所が税計算(例: VAT)に影響する可能性があるため、支払者が取引を完了する前に UI に正確な合計を表示できることが望まれます。 同時に、支払い完了前に共有される情報は可能な限り少ないことが望まれます。 したがって、ある支払い方法ユーザーが支払い方法を変更したときの手順を定義する場合、 PaymentMethodChangeEventmethodDetails 属性を通じて共有されるデータを最小化することが重要です。 共有データを最小化するための要件やアプローチは支払い方法によって異なる可能性があり、次のようなものが含まれ得ます:

プライバシーに敏感な情報の共有がユーザーにとって自明でない場合(例: 支払い方法の変更時など)、ユーザーエージェントは、どの情報が商人と共有されるかをユーザーに正確に通知することが推奨されます(RECOMMENDED)。

19.8 canMakePayment() の保護

canMakePayment() メソッドは、さまざまな支払い方法に対するフィーチャー検出を提供します。 将来的に多数の支払い方法が利用可能になった場合、これはフィンガープリントの手段となり得ます。 ユーザーエージェントには、このメソッドの乱用からユーザーを保護することが期待されます。 例えば、ユーザーエージェントは次のようにしてユーザーフィンガープリンティングを低減できます:

レート制限のため、ユーザーエージェントは以下からの繰り返し呼び出しを考慮できます:

これらのレート制限手法は、繰り返し呼び出しに伴うコストを増大させることを意図しています。 それは、複数の 登録可能ドメイン を管理するコストであったり、 複数のウィンドウ(タブやポップアップ)を開くことによるユーザー体験上の摩擦であったりします。

19.9 ユーザーアクティベーションの要件

もしユーザーエージェントが、 show() メソッドの一部としてユーザーアクティベーションを要求しない場合、 追加のセキュリティ緩和策を検討する必要があります。 ユーザーアクティベーションを要求しないと、ページ上で直前のユーザー操作なしに Payment Request の UI を起動できてしまうため、 スパムやクリックジャッキング攻撃のリスクが高まります。

スパムを軽減するために、ユーザーエージェントはある閾値以降でユーザーアクティベーション要件を強制することを決定してもよいでしょう。 例えば、現在のページでユーザーアクティベーションなしに Payment Request の UI を既に表示した後などです。 クリックジャッキング攻撃を軽減するために、ユーザーエージェントはダイアログ表示直後の一定時間におけるクリックを無視する時間的閾値を実装してもよいでしょう。

もう 1 つの関連する緩和策は、 show() の手順 6 に存在し、 ユーザーインタラクションを開始するために文書が可視でなければならない点です。

20. アクセシビリティに関する考慮事項

この節は非規範的です。

Payment Request API のユーザー向け側面について、実装はフォームコントロールやその他の入力手段を通じて、プラットフォームのアクセシビリティ API と統合します。さらに、合計額、配送先住所、連絡先情報の可読性を高めるために、実装はシステムの慣例に従ってデータを整形します。

21. 依存関係

本仕様は、いくつかの他の基盤となる仕様に依存しています。

ECMAScript
用語 internal slot は [ECMASCRIPT] に定義されています。

22. 適合性

非規範的と記された節に加えて、本仕様のすべての著作ガイドライン、図、例、および注記は非規範的です。それ以外の本仕様のすべては規範的です。

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

本仕様に適合性を主張できる製品のクラスは 1 つだけです:ユーザーエージェント

Note

本仕様は主としてウェブブラウザーを対象としていますが、他のソフトウェアも本仕様を適合的に実装できる可能性があります。

ユーザーエージェントは、本仕様に示されたアルゴリズムと区別がつかない結果が得られる限りにおいて、本仕様に示すアルゴリズムを任意の方法で実装してもよいMAY)ものとします。

ユーザーエージェントは、サービス不能攻撃の防止、メモリ枯渇への対策、またはプラットフォーム固有の制限の回避などの目的で、制約のない入力に対して実装固有の上限を課してもよいMAY)ものとします。入力が実装固有の上限を超えた場合、ユーザーエージェントは TypeError を送出するか、あるいは Promise の文脈では拒否しなければならずMUST)、その際、特定の入力がどのように上限を超えたかについて開発者に知らせることができます(任意)。

A. IDL インデックス

WebIDL[SecureContext, Exposed=Window]
interface PaymentRequest : EventTarget {
  constructor(
    sequence<PaymentMethodData> methodData,
    PaymentDetailsInit details,
    optional PaymentOptions options = {}
  );
  [NewObject]
  Promise<PaymentResponse> show(optional Promise<PaymentDetailsUpdate> detailsPromise);
  [NewObject]
  Promise<undefined> abort();
  [NewObject]
  Promise<boolean> canMakePayment();

  readonly attribute DOMString id;
  readonly attribute ContactAddress? shippingAddress;
  readonly attribute DOMString? shippingOption;
  readonly attribute PaymentShippingType? shippingType;

  attribute EventHandler onshippingaddresschange;
  attribute EventHandler onshippingoptionchange;
  attribute EventHandler onpaymentmethodchange;
};

dictionary PaymentMethodData {
  required DOMString supportedMethods;
  object data;
};

dictionary PaymentCurrencyAmount {
  required DOMString currency;
  required DOMString value;
};

dictionary PaymentDetailsBase {
  sequence<PaymentItem> displayItems;
  sequence<PaymentShippingOption> shippingOptions;
  sequence<PaymentDetailsModifier> modifiers;
};

dictionary PaymentDetailsInit : PaymentDetailsBase {
  DOMString id;
  required PaymentItem total;
};

dictionary PaymentDetailsUpdate : PaymentDetailsBase {
  DOMString error;
  PaymentItem total;
  AddressErrors shippingAddressErrors;
  PayerErrors payerErrors;
  object paymentMethodErrors;
};

dictionary PaymentDetailsModifier {
  required DOMString supportedMethods;
  PaymentItem total;
  sequence<PaymentItem> additionalDisplayItems;
  object data;
};

enum PaymentShippingType {
  "shipping",
  "delivery",
  "pickup"
};

dictionary PaymentOptions {
  boolean requestPayerName = false;
  boolean requestBillingAddress = false;
  boolean requestPayerEmail = false;
  boolean requestPayerPhone = false;
  boolean requestShipping = false;
  PaymentShippingType shippingType = "shipping";
};

dictionary PaymentItem {
  required DOMString label;
  required PaymentCurrencyAmount amount;
  boolean pending = false;
};

dictionary PaymentCompleteDetails {
  object? data = null;
};

enum PaymentComplete {
  "fail",
  "success",
  "unknown"
};

dictionary PaymentShippingOption {
  required DOMString id;
  required DOMString label;
  required PaymentCurrencyAmount amount;
  boolean selected = false;
};

[SecureContext, Exposed=Window]
interface PaymentResponse : EventTarget  {
  [Default] object toJSON();

  readonly attribute DOMString requestId;
  readonly attribute DOMString methodName;
  readonly attribute object details;
  readonly attribute ContactAddress? shippingAddress;
  readonly attribute DOMString? shippingOption;
  readonly attribute DOMString? payerName;
  readonly attribute DOMString? payerEmail;
  readonly attribute DOMString? payerPhone;

  [NewObject]
  Promise<undefined> complete(
    optional PaymentComplete result = "unknown",
    optional PaymentCompleteDetails details = {}
  );
  [NewObject]
  Promise<undefined> retry(optional PaymentValidationErrors errorFields = {});

  attribute EventHandler onpayerdetailchange;
};

dictionary PaymentValidationErrors {
  PayerErrors payer;
  AddressErrors shippingAddress;
  DOMString error;
  object paymentMethod;
};

dictionary PayerErrors {
  DOMString email;
  DOMString name;
  DOMString phone;
};

dictionary AddressErrors {
  DOMString addressLine;
  DOMString city;
  DOMString country;
  DOMString dependentLocality;
  DOMString organization;
  DOMString phone;
  DOMString postalCode;
  DOMString recipient;
  DOMString region;
  DOMString sortingCode;
};

[SecureContext, Exposed=Window]
interface PaymentMethodChangeEvent : PaymentRequestUpdateEvent {
  constructor(DOMString type, optional PaymentMethodChangeEventInit eventInitDict = {});
  readonly attribute DOMString methodName;
  readonly attribute object? methodDetails;
};

dictionary PaymentMethodChangeEventInit : PaymentRequestUpdateEventInit {
  DOMString methodName = "";
  object? methodDetails = null;
};

[SecureContext, Exposed=Window]
interface PaymentRequestUpdateEvent : Event {
  constructor(DOMString type, optional PaymentRequestUpdateEventInit eventInitDict = {});
  undefined updateWith(Promise<PaymentDetailsUpdate> detailsPromise);
};

dictionary PaymentRequestUpdateEventInit : EventInit {};

B. 謝辞

本仕様は、以前に Web Platform Incubator Community Group によって公開されたレポートから派生したものです。

C. 変更履歴

CR2 から現在までの変更点:

CR1 から CR2 までの変更点:

D. 参考文献

D.1 規範的参考文献

[contact-picker]
Contact Picker API. Peter Beverloo. W3C. 8 July 2024. W3C 作業草案. URL: https://www.w3.org/TR/contact-picker/
[dom]
DOM Standard. Anne van Kesteren. WHATWG. 現行標準. URL: https://dom.spec.whatwg.org/
[E.164]
The international public telecommunication numbering plan. ITU-T. November 2010. 勧告. URL: https://www.itu.int/rec/dologin_pub.asp?lang=e&id=T-REC-E.164-201011-I!!PDF-E&type=items
[ecma-402]
ECMAScript Internationalization API Specification. Ecma International. URL: https://tc39.es/ecma402/
[ECMASCRIPT]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[fetch]
Fetch Standard. Anne van Kesteren. WHATWG. 現行標準. URL: https://fetch.spec.whatwg.org/
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 現行標準. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. 現行標準. URL: https://infra.spec.whatwg.org/
[ISO4217]
Currency codes - ISO 4217. ISO. 2015. 国際規格. URL: http://www.iso.org/iso/home/standards/currency_codes.htm
[payment-handler]
Payment Handler API. Adrian Hope-Bailie; Ian Jacobs; Rouslan Solomakhin; Jinho Bang. W3C. 25 January 2023. W3C 作業草案. URL: https://www.w3.org/TR/payment-handler/
[payment-method-id]
Payment Method Identifiers. Marcos Caceres. W3C. 8 September 2022. W3C 勧告. URL: https://www.w3.org/TR/payment-method-id/
[permissions-policy]
Permissions Policy. Ian Clelland. W3C. 6 August 2025. W3C 作業草案. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. 現行の最良慣行. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. July 2005. 提案規格. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. 現行の最良慣行. URL: https://www.rfc-editor.org/rfc/rfc8174
[url]
URL Standard. Anne van Kesteren. WHATWG. 現行標準. URL: https://url.spec.whatwg.org/
[WEBIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. 現行標準. URL: https://webidl.spec.whatwg.org/

D.2 参考情報

[rfc6454]
The Web Origin Concept. A. Barth. IETF. December 2011. 提案規格. URL: https://www.rfc-editor.org/rfc/rfc6454
[secure-contexts]
Secure Contexts. Mike West. W3C. 10 November 2023. CRD. URL: https://www.w3.org/TR/secure-contexts/