支払方法マニフェスト

W3C 第一公開作業草案,

このバージョン:
https://www.w3.org/TR/2017/WD-payment-method-manifest-20171212/
最新公開バージョン:
https://www.w3.org/TR/payment-method-manifest/
編集者草案:
https://w3c.github.io/payment-method-manifest/
課題追跡:
GitHub
編集者:
Dapeng Liu (Alibaba)
Domenic Denicola (Google)
Zach Koch (Google)

概要

この仕様は、支払方法マニフェストとして知られる、 支払方法が Web Payments エコシステムにどのように参加するか、および そのようなファイルがどのように使用されるべきかを記述する、機械可読なマニフェストファイルを定義する。

この文書の ステータス

この節は、この文書の公開時点におけるステータスを説明する。他の文書が この文書に取って代わる可能性がある。現在の W3C 公開文書の一覧と、この技術報告書の最新版は、W3C 技術 報告書索引 https://www.w3.org/TR/ で確認できる。

Web Payments Working Group は、グループがまだ対処していないすべてのバグ 報告の一覧を管理している。この草案は、作業グループでなお議論されるべき保留中の課題の一部を 強調している。これらの課題の結果については、それらが妥当であるかどうかを含め、 まだ決定はなされていない。 未解決の課題に対する仕様テキスト案を含むプルリクエストが強く推奨される。

この文書は、Web Payments Working Group により Working Draft として公開された。この文書は W3C Recommendation になることを意図している。

この文書は First Public Working Draft である。

First Public Working Draft としての公開は、W3C Membership による承認を意味しない。これは草案文書であり、 いつでも他の文書によって更新、置換、または廃止される可能性がある。 この文書を進行中の作業以外のものとして引用することは不適切である。

この文書は、W3C Patent Policy の下で運営されるグループにより作成された。W3C は、 グループの成果物に関連して行われたあらゆる特許 開示の公開一覧を管理している。そのページには、特許を開示するための 手順も含まれている。個人が、Essential Claim(s) を含むとその個人が信じる特許について実際の知識を有する場合、その個人は W3C Patent Policy の第 6 節に従って情報を開示しなければならない。

この文書は、2017年3月1日版 W3C Process Document によって管理される。

1. 導入

この節およびその下位節は非規範的である。

1.1. ユースケース

この仕様は、次のユースケースに対応することを意図している:

これは、支払方法のうち、その識別子URL ベースであるすべてのものが、2 つの 重要な情報を含む JSON 形式の支払方法マニフェストファイルを提供するという要件により 達成される:

1.2. マニフェストへのアクセス

支払方法識別子 URL によって識別されるリソースは、 機械可読な支払方法マニフェストを直接含まない。それはしばしば、 "https://alicepay.com/" のような、人間が読むコンテンツにより適した一般的な URL である。 その代わりに、HTTP Link ヘッダーが、支払方法マニフェストを 探すユーザーエージェントを別の場所へ向けるために使用される。 [RFC8288]

支払方法 AlicePay の例では、支払方法識別子 "https://alicepay.com/" を用いると、ユーザーエージェントは、その支払方法識別子 URL に対して、次のようにリクエストを 発行するかもしれない:

HEAD / HTTP/2
Host: alicepay.com
User-Agent: Mellblomenator/9000

するとサーバーは次のように応答する:

HTTP/2 204
Link: </pay/payment-manifest.json>; rel="payment-method-manifest"

1.3. マニフェストファイルの例

§1.2 マニフェストへのアクセス の例を続けると、AlicePay 支払方法は、次の支払方法マニフェストファイルを https://alicepay.com/pay/payment-manifest.json で提供できる:

{
  "default_applications": ["https://alicepay.com/pay/app/webappmanifest.json"],
  "supported_origins": [
    "https://bobpay.xyz",
    "https://alicepay.friendsofalice.example"
  ]
}

これは、ユーザーエージェントに AlicePay 用の支払アプリがインストールされていない場合に、 "https://alicepay.com/pay/app/webappmanifest.json" にあるWeb アプリ マニフェストを参照することで、それを見つけられることを示す。

これはまた、この既定の支払アプリとは別に、AlicePay が、示された 2 つのオリジンでホストされる支払アプリを AlicePay に対して使用することも許可していることを示す。 これは、ユーザーエージェントが、それらのオリジンでホストされ、AlicePay のサポートを主張する支払アプリに 遭遇した場合、それらが AlicePay 支払方法の支払アプリとして動作することを 許可できることを意味する。

マニフェストファイルは、対象の支払方法についてサードパーティの支払アプリがサポートされない場合に、 "supported_origins" キーを省略してもよいし、任意のサードパーティが その支払方法をサポートすることを許可することを示すために、オリジンの配列の代わりに値 "*" を使用してもよい。

2. マニフェスト形式

妥当な支払方法マニフェストファイルは、JSON オブジェクトとして解析可能な 内容を含む、UTF-8 エンコードされたファイルである。 結果として得られる JSON オブジェクトは、 "default_applications" および "supported_origins" という可能なキーを持つ、最大 2 つの項目を含まなければならない。

default_applications キーの値は、存在する場合、空でない JSON 配列でなければならない。 配列内の各項目は、結果として解析されたURLスキームが "https" であるような、絶対 URL 文字列でなければならない。

supported_origins キーの値は、存在する場合、文字列 "*"、または空でない JSON 配列のいずれかでなければならない。後者の場合、配列内の各項目は、 HTTPS オリジンを表す絶対 URL 文字列でなければならない。形式的には、その文字列は、 結果として解析されたURLオリジン直列化と等しくなければならない。

Web 開発者は、すべての支払方法マニフェスト妥当であることを 確保しなければならない。

ファイルの内容に関するすべての適合要件と同様に、これらは Web 開発者向けであり、 実装者向けではない。正確な処理モデル(§3 処理モデルで与えられる)が、実装者がすべての支払 方法マニフェストファイルをどのように処理するかを規定する。 これには無効なものも含まれる。

次の支払方法マニフェスト妥当ではないが、現在指定されている処理 モデルのアルゴリズムはそれでも受け入れる:
{
  "default_applications": ["https://alicepay.com/pay/app/webappmanifest.json"],
  "created_by": "Alice",
  "created_in": "Wonderland"
}

これは将来変更される可能性がある。たとえば、処理モデルが後に、新しい標準 "created_by" キーに意味を定義し、それが文字列ではなくオブジェクトであることを 要求するように拡張される場合である。このような状況を避けるため、Web 開発者は 自身の支払方法マニフェスト妥当性を確保し、それによって望ましくない驚きを 避けるのが最善である。

3. 処理モデル

3.1. Payment Request API への変更

この仕様は、PaymentRequest(methodData, details, options) コンストラクターを変更することで、Payment Request エコシステムの残りの部分と統合する。 これは、アルゴリズムが完了して新しく構築された PaymentRequest オブジェクトを返す前に、次のステップを追加する。 以下では、request を構築中の PaymentRequest インスタンスとする。 [PAYMENT-REQUEST]

  1. identifiers を、request.[[serializedMethodData]] 内の各ペアの最初の項目からなるリストとする。

  2. client現在の設定オブジェクトとする。

  3. identifiers および client を与えて、 支払方法マニフェストを取り込む

これらのステップがプロセス全体を開始する。§3 処理 モデルの残りは、このプロセスが最終的にどのようにして 新しい支払 アプリをユーザーが利用可能にするのかを定義することに関わる。

この仕様が 複数実装者の関心を得るにつれて、この節をここで monkeypatch として維持するのではなく、 Payment Request API 仕様自体に移すことを想定している。

3.2. 支払方法マニフェストの取り込み

支払方法識別子のリスト identifiers と、 環境設定オブジェクト client が与えられたとき、 ユーザーエージェントは、支払方法マニフェストを取り込むために、次のステップを実行してもよい:

  1. identifiers および client を与えて、 支払方法マニフェストを取得する。そしてこれが manifestsMap で非同期に完了するのを待つ。結果が失敗の場合、戻る。

  2. manifestsMap の各 identifiermanifest について、 それぞれに対し:

    1. parsed を、manifest検証し解析した結果とする。これが 失敗を返す場合、continue する。

    2. parseddefault applications内の各 url について、それぞれに対し:

      1. client を与えて、url にあるWeb アプリマニフェストを取得する。そしてそれが webAppManifestString で 非同期に完了するのを待つ。結果が失敗の場合、continue する。

      2. webAppManifest を、webAppManifestString を与えて Web アプリ マニフェストを処理するステップを実行した結果とする。

        Web アプリ マニフェストを処理するステップは非常に寛容であり、 失敗する代わりに、空のオブジェクトや重要なフィールドを欠いたオブジェクトを 返す。ユーザーエージェントは、次のステップでの目的に十分なデータを含むことを 確保するため、処理済み Web アプリマニフェストを 別途検証する必要がある。

      3. ユーザーエージェント固有の方法で、結果として得られた処理済み Web アプリマニフェスト webAppManifest を使用して、identifier により識別される 支払方法に適用可能な支払アプリをインストールする。

        将来的には、結果として得られた処理済み Web アプリマニフェストを使用するための、 ユーザーエージェント非依存の方法が存在する予定である。それは、その serviceworker フィールドを参照し、それを使用して Payment Handler API 仕様に適合する Web ベースの支払アプリをインストールすることによる。 [PAYMENT-HANDLER]

    3. supported originsidentifier に関連付ける。それにより、ユーザーエージェントは将来、 identifier により識別される支払方法に対して、どのサードパーティの支払アプリを表示できるかを判断するために それを使用できる。

3.3. 支払方法マニフェストの取得

リストである JavaScript 文字列 supportedMethods と、環境設定オブジェクト client が与えられたとき、 支払 方法マニフェストを取得するには、次のステップを実行する。 このアルゴリズムは、URL から バイト列へのマップ(空の場合もある)で 非同期に完了する。このマップは、支払方法識別子を対応するマニフェストの内容に対応付ける。

  1. identifierURLs を空のリストとする。

  2. supportedMethods の各 string について、 それぞれに対し:

    1. identifierURL を、string基本 URL 解析した結果とする。結果が失敗の場合、 continue する。

      結果は、URL ベースの支払方法 識別子ではない支払方法識別子、すなわち 標準化された支払方法 識別子について失敗となる。

    2. identifierURL検証した結果が false の場合、continue する。

    3. 任意で、continue する。

      このステップにより、実装はユーザーエージェント固有の理由で、 提供された支払方法 識別子のいずれかをスキップできる。§4 セキュリティと プライバシーに関する考慮事項では、ユーザーエージェントが特定の識別子だけを取り込むことを 好む可能性がある理由の一部を論じる。

    4. identifierURLidentifierURLs追加する。

  3. manifestsMap を空のマップとする。

  4. identifierURLs の各 identifierURL について、 それぞれに対し:

    1. identifierRequest を新しいrequestとする。そのmethod は `HEAD`、urlidentifierURLclientclientmode は "cors"、credentials mode は "omit"、そして redirect mode は "error" である。

    2. identifierRequestFetchする。response identifierResponseprocess response するには:

      1. identifierResponsenetwork errorであるか、 identifierResponsestatusok statusでない場合、continue する。

      2. linkHeaders を、`Link` と identifierResponseheader list を与えて header list values を抽出した結果とする。

      3. manifestURLString を null とする。

      4. linkHeaders の各 linkHeader について、 それぞれに対し:

        1. link-value 生成規則に従って linkHeader を解析する。解析できない場合、 continue する。 [RFC8288]

        2. 解析されたヘッダーが、名前が文字列 "rel" とASCII 大文字小文字無視で一致し、 値が文字列 "payment-method-manifest" とASCII 大文字小文字無視で一致する パラメーターを含む場合、manifestURLString を、解析されたヘッダー内の URI-Reference 生成規則により与えられる文字列に設定し、 break する。

      5. manifestURLString が null でない場合、次を行う:

        1. manifestURL を、identifierResponseurl をベース URL として与え、 manifestURLString基本 URL 解析した結果とする。結果が 失敗の場合、continue する。

        2. manifestURLscheme が "https" でない場合、 continue する。

        3. manifestRequest を新しいrequestとする。そのurlmanifestURLclientclientmode は "cors"、credentials mode は "omit"、そして redirect mode は "error" である。

        4. manifestRequestFetchする。response manifestResponseprocess response end-of-body するには:

          1. manifestResponsenetwork errorであるか、 manifestResponsestatusok statusでない場合、continue する。

          2. bodymanifestResponsebodyとする。

          3. body が null の場合、continue する。

          4. reader を、body からreader を取得した結果とする。

          5. promise を、reader を用いて body から すべての バイトを読み取った結果とする。

          6. Upon fulfillment of promise with a byte sequence bytes, set manifestsMap[identifierURL] to bytes.

  5. 上記のステップにより開始された進行中のすべてのfetchアルゴリズムが完了したら、 指定されたprocess response および process response end-of-body ステップを含め、 このアルゴリズムを manifestsMap で非同期に完了する。

3.4. 支払方法マニフェストの検証と解析

解析済み 支払方法マニフェストは、次の 2 つのフィールドを含む構造体である:

default applications

URL順序付き集合。空の場合もある

supported origins

文字列 "*"、またはオリジン順序付き集合

支払方法マニフェストを含むと称するバイト列 bytes検証し解析するには、次の ステップを実行する。結果は、解析済み支払方法マニフェスト、または失敗のいずれかである。

  1. parsed を、ユーザーエージェント定義のJavaScript realm において、bytes を与えて バイトから JSON を解析した結果とする。これが例外を投げる場合、失敗を返す。

  2. Type(parsed) が Object でない場合、 失敗を返す。

  3. defaultApps を空の順序付き集合とする。

  4. defaultAppsValueGet(parsed, "default_applications") とする。

  5. defaultAppsValue が undefined でない場合:

    1. IsArray(defaultAppsValue) が false の場合、 失敗を返す。

    2. defaultAppsListCreateListFromArrayLike(defaultAppsValue, « String ») とする。これが例外を投げる場合、失敗を返す。

    3. defaultAppsListサイズが 0 の場合、失敗を返す。

    4. defaultAppsList 内の各 defaultAppString について、 それぞれに対し:

      1. defaultAppURL を、defaultAppString基本 URL 解析した結果とする。結果が失敗の場合、 失敗を返す。

      2. defaultAppURLscheme が "https" でない場合、失敗を 返す。

      3. defaultAppURLdefaultApps追加する。

  6. supportedOrigins を空の順序付き集合とする。

  7. supportedOriginsValueGet(parsed, "supported_origins") とする。

  8. supportedOriginsValue が "*" である場合、supportedOrigins を "*" に設定する。

  9. そうでなく、supportedOriginsValue が undefined でない場合:

    1. IsArray(supportedOriginsValue) が false の場合、 失敗を返す。

    2. supportedOriginsListCreateListFromArrayLike(supportedOriginsValue, « String ») とする。これが 例外を投げる場合、失敗を返す。

    3. supportedOriginsListサイズが 0 の場合、失敗を 返す。

    4. supportedOriginsList 内の各 supportedOriginString について、 それぞれに対し:

      1. supportedOriginURL を、supportedOriginString基本 URL 解析した結果とする。結果が失敗の場合、 失敗を返す。

      2. supportedOriginURLscheme が "https" でない場合、失敗を 返す。

      3. supportedOriginURLusername または password が空文字列でない場合、 失敗を返す。

      4. supportedOriginURLpathサイズ が 0 でない場合、失敗を返す。

      5. supportedOriginURLquery または fragment が null でない場合、失敗を返す。

      6. supportedOriginURLoriginsupportedOrigins追加する。

  10. default applicationsdefaultApps により与えられ、supported originssupportedOrigins により与えられる、新しい解析済み支払方法マニフェストを返す。

"default_applications" または "supported_origins" の空配列は 解析を失敗させる。すなわち、これは妥当な支払方法 マニフェストではなく、上記のアルゴリズムにより拒否される:
{
  "default_applications": ["https://alicepay.com/pay/app/webappmanifest.json"],
  "supported_origins": []
}

3.5. Web アプリマニフェストの取得

支払 アプリの決定は、埋め込まれた HTML 文書とは独立して行われるため、 既定の支払アプリに関する情報を与えるWeb アプリマニフェストを取得する手順は、通常の Web アプリマニフェストを取得するステップとは異なる。

URL url環境設定オブジェクト client が与えられたとき、 既定の 支払アプリの Web アプリマニフェストを取得するには、次の ステップを実行する。このアルゴリズムは、 スカラー値 文字列または失敗のいずれかで非同期に完了する。

  1. request を新しいrequestとする。 そのurlurlclientclientmode は "cors"、credentials mode は "omit"、そして redirect mode は "error" である。

  2. requestFetchする。response responseprocess response end-of-body するには:

    1. responsenetwork errorであるか、responsestatusok statusでない場合、 このアルゴリズムを失敗で非同期に完了する。

    2. bodyresponsebodyとする。

    3. body が null の場合、このアルゴリズムを失敗で非同期に完了する。

    4. reader を、body からreader を取得した結果とする。

    5. promise を、reader を用いて body からすべてのバイトを読み取った結果とする。

    6. promise充足されたときバイト列 bytes を伴うなら、このアルゴリズムを、 bytesUTF-8 デコードした結果で非同期に完了する。

    7. promise拒否されたとき、このアルゴリズムを失敗で非同期に 完了する。

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

支払方法マニフェストを取り込むことは、 エンドユーザーの活動に関する情報を支払サービスに明らかにする可能性がある。たとえば、 ある 1 つの Web サイト上でのみサポートされる支払方法は、その支払プロバイダーが その Web サイトを訪問したユーザーの IP アドレスを発見できるようにする可能性がある。

これを軽減する 1 つの方法は、ユーザーがインストールしている、または明示的に関心を示した 支払アプリについてのみマニフェストを取得することである。これにより、リスクは ユーザーの IP アドレスをそれらの当事者とのみ共有することに限定される。

w3c/payment-method-manifest/11支払方法マニフェストの世界における支払アプリの照合とセキュリティ

5. IANA に関する 考慮事項

この登録はコミュニティレビューのためのものであり、レビュー、承認、 および IANA への登録のために IESG に提出される。

関係名

payment-method-manifest

説明

Web Payments エコシステム内の特定の支払方法を記述する支払方法マニフェストへのリンク。

参照

https://w3c.github.io/payment-method-manifest/

注記

そのようなリンクが取得されることが期待される具体的な方法については §3.3 支払方法マニフェストの取得を参照し、それらが使用されるより大きな文脈については §3.2 支払方法 マニフェストの取り込みを参照。

謝辞

§3 処理モデルは、Rouslan Solomakhin により最初に概説されたアルゴリズムに 大きく基づいている。

索引

この仕様で定義される 用語

参照により定義される 用語

参照文献

規範参照文献

[APPMANIFEST]
Marcos Caceres; et al. Web App Manifest. URL: https://w3c.github.io/manifest/
[ECMASCRIPT]
ECMAScript Language Specification. URL: https://tc39.github.io/ecma262/
[ENCODING]
Anne van Kesteren. Encoding Standard. Living Standard. URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PAYMENT-METHOD-ID]
Adrian Bateman; et al. Payment Method Identifiers. URL: https://w3c.github.io/payment-method-id/
[PAYMENT-REQUEST]
Adrian Bateman; et al. Payment Request API. URL: https://w3c.github.io/payment-request/
[PROMISES-GUIDE]
Domenic Denicola. Promise を使用する仕様の 書き方. 2016年2月16日. W3C TAG の Finding. URL: https://www.w3.org/2001/tag/doc/promises-guide
[RFC8288]
M. Nottingham. Web Linking. 2017年10月. Proposed Standard. URL: https://tools.ietf.org/html/rfc8288
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/

参考参照文献

[PAYMENT-HANDLER]
Adrian Hope-Bailie; et al. Payment Handler API. URL: https://w3c.github.io/payment-handler/