この文書の ステータス
この節は、この文書の公開時点におけるステータスを説明する。他の文書が この文書に取って代わる可能性がある。現在の 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 形式の支払方法マニフェストファイルを提供するという要件により 達成される:
-
この支払方法に関連付けられた既定の支払アプリ。それらは、各Web アプリ マニフェストのURLを与える絶対 URL 文字列として参照される。および
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]
-
identifiers を、request.[[serializedMethodData]] 内の各ペアの最初の項目からなるリストとする。
-
client を現在の設定オブジェクトとする。
-
identifiers および client を与えて、 支払方法マニフェストを取り込む。
これらのステップがプロセス全体を開始する。§3 処理 モデルの残りは、このプロセスが最終的にどのようにして 新しい支払 アプリをユーザーが利用可能にするのかを定義することに関わる。
この仕様が 複数実装者の関心を得るにつれて、この節をここで monkeypatch として維持するのではなく、 Payment Request API 仕様自体に移すことを想定している。
3.2. 支払方法マニフェストの取り込み
支払方法識別子のリスト identifiers と、 環境設定オブジェクト client が与えられたとき、 ユーザーエージェントは、支払方法マニフェストを取り込むために、次のステップを実行してもよい:
-
identifiers および client を与えて、 支払方法マニフェストを取得する。そしてこれが manifestsMap で非同期に完了するのを待つ。結果が失敗の場合、戻る。
-
manifestsMap の各 identifier → manifest について、 それぞれに対し:
-
parsed のdefault applications内の各 url について、それぞれに対し:
-
client を与えて、url にあるWeb アプリマニフェストを取得する。そしてそれが webAppManifestString で 非同期に完了するのを待つ。結果が失敗の場合、continue する。
-
webAppManifest を、webAppManifestString を与えて Web アプリ マニフェストを処理するステップを実行した結果とする。
Web アプリ マニフェストを処理するステップは非常に寛容であり、 失敗する代わりに、空のオブジェクトや重要なフィールドを欠いたオブジェクトを 返す。ユーザーエージェントは、次のステップでの目的に十分なデータを含むことを 確保するため、処理済み Web アプリマニフェストを 別途検証する必要がある。
-
ユーザーエージェント固有の方法で、結果として得られた処理済み Web アプリマニフェスト webAppManifest を使用して、identifier により識別される 支払方法に適用可能な支払アプリをインストールする。
将来的には、結果として得られた処理済み Web アプリマニフェストを使用するための、 ユーザーエージェント非依存の方法が存在する予定である。それは、その
serviceworkerフィールドを参照し、それを使用して Payment Handler API 仕様に適合する Web ベースの支払アプリをインストールすることによる。 [PAYMENT-HANDLER]
-
-
supported originsを identifier に関連付ける。それにより、ユーザーエージェントは将来、 identifier により識別される支払方法に対して、どのサードパーティの支払アプリを表示できるかを判断するために それを使用できる。
3.3. 支払方法マニフェストの取得
リストである JavaScript 文字列 supportedMethods と、環境設定オブジェクト client が与えられたとき、 支払 方法マニフェストを取得するには、次のステップを実行する。 このアルゴリズムは、URL から バイト列へのマップ(空の場合もある)で 非同期に完了する。このマップは、支払方法識別子を対応するマニフェストの内容に対応付ける。
-
identifierURLs を空のリストとする。
-
supportedMethods の各 string について、 それぞれに対し:
-
identifierURL を、string を基本 URL 解析した結果とする。結果が失敗の場合、 continue する。
結果は、URL ベースの支払方法 識別子ではない支払方法識別子、すなわち 標準化された支払方法 識別子について失敗となる。
-
任意で、continue する。
このステップにより、実装はユーザーエージェント固有の理由で、 提供された支払方法 識別子のいずれかをスキップできる。§4 セキュリティと プライバシーに関する考慮事項では、ユーザーエージェントが特定の識別子だけを取り込むことを 好む可能性がある理由の一部を論じる。
-
identifierURL を identifierURLs に追加する。
-
-
manifestsMap を空のマップとする。
-
identifierURLs の各 identifierURL について、 それぞれに対し:
-
identifierRequest を新しいrequestとする。そのmethod は `
HEAD`、url は identifierURL、client は client、mode は "cors"、credentials mode は "omit"、そして redirect mode は "error" である。 -
identifierRequest をFetchする。response identifierResponse で process response するには:
-
identifierResponse がnetwork errorであるか、 identifierResponse のstatus がok statusでない場合、continue する。
-
linkHeaders を、`
Link` と identifierResponse の header list を与えて header list values を抽出した結果とする。 -
manifestURLString を null とする。
-
linkHeaders の各 linkHeader について、 それぞれに対し:
-
link-value生成規則に従って linkHeader を解析する。解析できない場合、 continue する。 [RFC8288] -
解析されたヘッダーが、名前が文字列 "
rel" とASCII 大文字小文字無視で一致し、 値が文字列 "payment-method-manifest" とASCII 大文字小文字無視で一致する パラメーターを含む場合、manifestURLString を、解析されたヘッダー内のURI-Reference生成規則により与えられる文字列に設定し、 break する。
-
-
manifestURLString が null でない場合、次を行う:
-
manifestURL を、identifierResponse のurl をベース URL として与え、 manifestURLString を基本 URL 解析した結果とする。結果が 失敗の場合、continue する。
-
manifestRequest を新しいrequestとする。そのurl は manifestURL、client は client、mode は "
cors"、credentials mode は "omit"、そして redirect mode は "error" である。 -
manifestRequest をFetchする。response manifestResponse で process response end-of-body するには:
-
manifestResponse がnetwork errorであるか、 manifestResponse のstatus がok statusでない場合、continue する。
-
body を manifestResponse のbodyとする。
-
body が null の場合、continue する。
-
reader を、body からreader を取得した結果とする。
-
promise を、reader を用いて body から すべての バイトを読み取った結果とする。
-
Upon fulfillment of promise with a byte sequence bytes, set manifestsMap[identifierURL] to bytes.
-
-
-
-
-
上記のステップにより開始された進行中のすべてのfetchアルゴリズムが完了したら、 指定されたprocess response および process response end-of-body ステップを含め、 このアルゴリズムを manifestsMap で非同期に完了する。
3.4. 支払方法マニフェストの検証と解析
解析済み 支払方法マニフェストは、次の 2 つのフィールドを含む構造体である:
支払方法マニフェストを含むと称するバイト列 bytes を検証し解析するには、次の ステップを実行する。結果は、解析済み支払方法マニフェスト、または失敗のいずれかである。
-
parsed を、ユーザーエージェント定義のJavaScript realm において、bytes を与えて バイトから JSON を解析した結果とする。これが例外を投げる場合、失敗を返す。
-
Type(parsed) が Object でない場合、 失敗を返す。
-
defaultApps を空の順序付き集合とする。
-
defaultAppsValue を Get(parsed, "default_applications") とする。
-
defaultAppsValue が undefined でない場合:
-
IsArray(defaultAppsValue) が false の場合、 失敗を返す。
-
defaultAppsList を CreateListFromArrayLike(defaultAppsValue, « String ») とする。これが例外を投げる場合、失敗を返す。
-
defaultAppsList のサイズが 0 の場合、失敗を返す。
-
defaultAppsList 内の各 defaultAppString について、 それぞれに対し:
-
-
supportedOrigins を空の順序付き集合とする。
-
supportedOriginsValue を Get(parsed, "supported_origins") とする。
-
supportedOriginsValue が "
*" である場合、supportedOrigins を "*" に設定する。 -
そうでなく、supportedOriginsValue が undefined でない場合:
-
IsArray(supportedOriginsValue) が false の場合、 失敗を返す。
-
supportedOriginsList を CreateListFromArrayLike(supportedOriginsValue, « String ») とする。これが 例外を投げる場合、失敗を返す。
-
supportedOriginsList のサイズが 0 の場合、失敗を 返す。
-
supportedOriginsList 内の各 supportedOriginString について、 それぞれに対し:
-
-
default applications が defaultApps により与えられ、supported origins が supportedOrigins により与えられる、新しい解析済み支払方法マニフェストを返す。
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 アプリマニフェストを取得するには、次の ステップを実行する。このアルゴリズムは、 スカラー値 文字列または失敗のいずれかで非同期に完了する。
-
request を新しいrequestとする。 そのurl は url、client は client、mode は "
cors"、credentials mode は "omit"、そして redirect mode は "error" である。 -
request をFetchする。response response で process response end-of-body するには:
-
response がnetwork errorであるか、response のstatus がok statusでない場合、 このアルゴリズムを失敗で非同期に完了する。
-
body を response のbodyとする。
-
body が null の場合、このアルゴリズムを失敗で非同期に完了する。
-
reader を、body からreader を取得した結果とする。
-
promise を、reader を用いて body からすべてのバイトを読み取った結果とする。
-
promise が充足されたとき、バイト列 bytes を伴うなら、このアルゴリズムを、 bytes をUTF-8 デコードした結果で非同期に完了する。
-
promise が拒否されたとき、このアルゴリズムを失敗で非同期に 完了する。
-
4. セキュリティとプライバシーに関する考慮事項
支払方法マニフェストを取り込むことは、 エンドユーザーの活動に関する情報を支払サービスに明らかにする可能性がある。たとえば、 ある 1 つの Web サイト上でのみサポートされる支払方法は、その支払プロバイダーが その Web サイトを訪問したユーザーの IP アドレスを発見できるようにする可能性がある。
これを軽減する 1 つの方法は、ユーザーがインストールしている、または明示的に関心を示した 支払アプリについてのみマニフェストを取得することである。これにより、リスクは ユーザーの IP アドレスをそれらの当事者とのみ共有することに限定される。
5. IANA に関する 考慮事項
5.1.
payment-method-manifest リンク関係
この登録はコミュニティレビューのためのものであり、レビュー、承認、 および IANA への登録のために IESG に提出される。
- 関係名
-
payment-method-manifest
- 説明
-
Web Payments エコシステム内の特定の支払方法を記述する支払方法マニフェストへのリンク。
- 参照
- 注記
-
そのようなリンクが取得されることが期待される具体的な方法については §3.3 支払方法マニフェストの取得を参照し、それらが使用されるより大きな文脈については §3.2 支払方法 マニフェストの取り込みを参照。
謝辞
§3 処理モデルは、Rouslan Solomakhin により最初に概説されたアルゴリズムに 大きく基づいている。