支付方法清单

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 出版物列表以及本技术报告的最新修订版可在 https://www.w3.org/TR/ 的 W3C 技术 报告索引中找到。

Web Payments 工作组维护着一份该组尚未处理的所有缺陷 报告列表。本草案突出显示了一些仍待工作组讨论的待处理议题。 对这些议题的结果尚未作出决定,包括它们是否有效。 强烈鼓励提交带有拟议规范文本的拉取请求来处理未决议题。

本文档由 Web Payments 工作 组作为工作草案发布。本文档旨在成为 W3C 推荐标准。

本文档是一份第一份公开工作草案

作为第一份公开工作草案发布并不意味着获得 W3C 会员的认可。本文档是草案文档,可能会 随时由其他文档更新、替换或废弃。除作为进行中的工作外,不宜 引用本文档。

本文档由一个依据 W3C 专利 政策运行的小组制作。W3C 维护着与该组交付物相关的 任何专利 披露的公开列表;该页面还包含 披露专利的说明。实际知晓某项专利且该个人认为该专利包含 必要 权利要求的个人,必须按照 W3C 专利政策第 6 节披露该信息。

本文档受 2017 年 3 月 1 日 W3C 流程 文档管辖。

1. 介绍

本节及其子节是非规范性的。

1.1. 用例

本规范旨在处理以下用例:

这是通过要求其支付方法标识符基于 URL 的每个支付方法 提供一个 JSON 格式的支付方法清单文件来实现的,该文件包含两项 关键信息:

1.2. 访问清单

支付方法标识符 URL 标识的资源并不直接 包含 机器可读的支付方法清单。它通常是通用 URL(例如 "https://alicepay.com/"),更适合人类可读内容。相反, 使用 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 还允许托管在两个指定支付应用用于 AlicePay。这意味着,如果用户代理 遇到托管在这些源并声称支持 AlicePay 的支付应用,它可以允许 它们充当 AlicePay 支付方法的支付应用。

如果相关支付应用不支持第三方支付方法,清单文件也可以省略 "supported_origins" 键,或者它可以使用值 "*" 来代替数组,以表示允许任何第三方 支持该支付方法。

2. 清单格式

有效支付方法清单文件是一个以 UTF-8 编码的文件,其中包含 可解析为 JSON 对象的内容。所得 JSON 对象最多必须包含 两项,可能的键为 "default_applications" 和 "supported_origins"。

default_applications 键的值(如果存在)必须是非空 JSON 数组。 数组中的每一项都必须是一个绝对 URL 字符串,并且所得解析后的 URL方案为 "https"。

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. 给定 identifiersclient摄取支付方法清单

这些步骤会启动整个过程。§3 处理 模型的其余部分 负责定义此过程最终如何使新的支付 应用可供 用户使用。

随着本规范 获得多个实现者的兴趣,我们预计会将本节 移入 Payment Request API 规范本身,而不是在此维护猴子补丁。

3.2. 摄取支付方法清单

给定支付方法标识符列表 identifiers, 以及环境设置对象 client,用户 代理可以运行以下步骤,以摄取支付方法清单

  1. 给定 identifiersclient获取支付方法清单,并等待其 以 manifestsMap 异步完成。如果结果为失败,则返回。

  2. manifestsMap 中的每个 identifiermanifest 执行

    1. parsed验证并解析 manifest 的结果。如果这 返回失败,则继续

    2. parsed默认 应用中的每个 url 执行

      1. 给定 client获取 Web 应用清单url,并等待其 以 webAppManifestString 异步完成。如果 结果为失败,则继续

      2. webAppManifest 为给定 webAppManifestString 运行处理 Web 应用 清单的步骤所得的结果。

        处理 Web 应用 清单的步骤非常宽容,会 返回空对象或缺少关键字段的对象,而不是失败。用户 代理将需要在下一步单独验证已处理的 Web 应用清单,以确保它 包含足够的数据供其使用。

      3. 以用户代理特定的方式,使用所得已处理的 Web 应用清单 webAppManifest,为由 identifier 标识的支付方法安装任何适用的支付应用

        未来计划是存在一种 与用户代理无关的方式来 使用所得已处理的 Web 应用清单,方法是 查阅其 serviceworker 字段,并使用它来安装 符合 Payment Handler API 规范的基于 Web 的支付应用[PAYMENT-HANDLER]

    3. 受支持源关联到 identifier,以便 用户代理将来可以使用它来确定哪些第三方支付应用可以 为由 identifier 标识的支付方法显示。

3.3. 获取支付方法清单

获取 支付方法清单,给定列表形式的JavaScript 字符串 supportedMethods 以及环境设置对象 client,执行 以下步骤。 此算法将以一个映射(可能为空)异步完成,该映射从 URL字节序列,将支付方法标识符映射到相应 清单的内容。

  1. identifierURLs 为空列表

  2. supportedMethods 中的每个 string 执行

    1. identifierURL 为对 string 进行基本 URL 解析的结果。如果 结果为失败,则继续

      对于任何不是基于 URL 的支付方法 标识符支付方法标识符,即对于 标准化支付方法 标识符,结果将为失败。

    2. 如果对 identifierURL 进行验证 返回 false,则继续

    3. 可选地,继续

      此步骤允许实现出于用户代理特定的原因跳过任何给定的支付方法 标识符§4 安全和 隐私考量讨论了用户 代理可能倾向于只摄取某些标识符的一些原因。

    4. identifierURL 追加identifierURLs

  3. manifestsMap 为空映射

  4. identifierURLs 中的每个 identifierURL 执行

    1. identifierRequest 为一个新的请求,其方法为 `HEAD`,urlidentifierURLclientclientmode 为 "cors",credentials mode 为 "omit",且redirect mode 为 "error"。

    2. 获取 identifierRequest。要使用响应 identifierResponse 处理响应

      1. 如果 identifierResponse网络错误,或 identifierResponse状态不是ok 状态,则继续

      2. linkHeaders 为给定 `Link` 和 identifierResponse标头列表提取标头列表值的结果。

      3. manifestURLString 为 null。

      4. linkHeaders 中的每个 linkHeader 执行

        1. 按照 link-value 产生式解析 linkHeader。如果无法 解析,则继续[RFC8288]

        2. 如果解析后的标头包含一个参数,其名称与字符串 "rel" 进行 ASCII 大小写不敏感匹配, 且其值与字符串 "payment-method-manifest" 进行 ASCII 大小写不敏感匹配, 则将 manifestURLString 设置为解析后 标头中由 URI-Reference 产生式给出的 字符串,并中断

      5. 如果 manifestURLString 不为 null,则:

        1. manifestURL 为对 manifestURLString 执行基本 URL 解析的结果, 其基 URL 由 identifierResponseurl 给出。如果 结果为失败,则继续

        2. 如果 manifestURL方案不是 "https", 则继续

        3. manifestRequest 为一个新的请求,其urlmanifestURLclientclientmode 为 "cors",credentials mode 为 "omit",且redirect mode 为 "error"。

        4. 获取 manifestRequest。要使用响应 manifestResponse 处理响应 体结束

          1. 如果 manifestResponse网络错误,或 manifestResponse状态不是ok 状态,则继续

          2. bodymanifestResponsebody

          3. 如果 body 为 null,则继续

          4. reader 为从 body获取读取器的结果。

          5. promise 为使用 readerbody读取 所有字节的结果。

          6. promise字节序列 bytes 兑现时, 将 manifestsMap[identifierURL] 设置bytes

  5. 一旦上述步骤启动的所有正在进行的获取算法均完成, 包括所指定的处理响应处理响应体结束步骤, 以 manifestsMap 异步 完成此算法。

3.4. 验证并解析支付方法清单

已解析 支付方法清单是一个结构,包含两个字段:

默认应用

有序集合,其中包含URL,可能 为空

受支持源

要么是字符串 "*",要么是有序集合,其中包含

验证并解析一个声称包含支付方法清单的字节序列 bytes,执行以下 步骤。结果要么是已解析支付方法清单,要么是失败。

  1. parsed 为给定 bytes,在 用户代理定义的 JavaScript 领域从字节解析 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. 如果 defaultAppURL方案不是 "https",则返回 失败。

      3. defaultAppURL 追加defaultApps

  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. 如果 supportedOriginURL方案不是 "https",则返回 失败。

      3. 如果 supportedOriginURL用户名密码不是空字符串, 则返回失败。

      4. 如果 supportedOriginURL路径大小 不为 0,则返回失败。

      5. 如果 supportedOriginURL查询片段不为 null,则返回失败。

      6. supportedOriginURL追加supportedOrigins

  10. 返回一个新的已解析支付方法清单,其中默认应用defaultApps 给出,且受支持源supportedOrigins 给出。

"default_applications" 或 "supported_origins" 的空数组 将导致解析失败。也就是说,这不是有效支付方法 清单,并将 被上述算法拒绝:
{
  "default_applications": ["https://alicepay.com/pay/app/webappmanifest.json"],
  "supported_origins": []
}

3.5. 获取 Web 应用清单

由于支付 应用的确定独立于任何嵌入的 HTML 文档, 因此获取提供默认支付应用信息的Web 应用清单的过程不同于通常的获取 Web 应用清单的步骤

获取默认 支付应用的 Web 应用清单,给定URL url 以及 环境设置对象 client,执行 以下步骤。此算法将 以标量值 字符串或失败异步完成。

  1. request 为一个新的请求, 其urlurlclientclientmode 为 "cors",credentials mode 为 "omit",且redirect mode 为 "error"。

  2. 获取 request。要使用响应 response 处理响应体结束

    1. 如果 response网络错误,或 response状态不是ok 状态, 则以失败异步完成此算法。

    2. bodyresponsebody

    3. 如果 body 为 null,则以失败异步完成此算法。

    4. reader 为从 body获取读取器的结果。

    5. promise 为使用 readerbody读取所有字节的结果。

    6. promise字节序列 bytes 兑现时,以对 bytes 执行 UTF-8 解码的结果异步完成此算法。

    7. promise 拒绝时,以失败异步 完成此算法。

4. 安全和隐私考量

摄取支付方法清单可能会向 支付服务泄露有关终端用户活动的信息。例如,一个仅在某个网站上受支持的支付方法可能会 允许该支付提供商发现访问该网站的用户的 IP 地址。

缓解这种情况的一种方式是,仅针对用户已安装或已明确表示感兴趣的支付应用获取清单。这会将 风险限制为仅与这些方共享用户的 IP 地址。

w3c/payment-method-manifest/11支付方法清单世界中的支付应用匹配和安全性

5. IANA 考量

此注册供社区审阅,并将提交给 IESG 进行审阅、批准, 并向 IANA 注册。

关系名称

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 应用清单. URL: https://w3c.github.io/manifest/
[ECMASCRIPT]
ECMAScript 语言规范. URL: https://tc39.github.io/ecma262/
[ENCODING]
Anne van Kesteren. 编码标准. 现行标准. URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch 标准. 现行标准. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML 标准. 现行 标准. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 标准. 现行 标准. URL: https://infra.spec.whatwg.org/
[PAYMENT-METHOD-ID]
Adrian Bateman; et al. 支付方法标识符. 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 结论. URL: https://www.w3.org/2001/tag/doc/promises-guide
[RFC8288]
M. Nottingham. Web 链接. 2017 年 10 月. 提议 标准. URL: https://tools.ietf.org/html/rfc8288
[URL]
Anne van Kesteren. URL 标准. 现行标准. URL: https://url.spec.whatwg.org/

资料性参考文献

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