From 1802e5559dfffe84d46d8f1e2d97f4c5c30f5660 Mon Sep 17 00:00:00 2001 From: Adrian Hope-Bailie Date: Thu, 21 Apr 2016 03:54:23 +0200 Subject: [PATCH] Initial draft of new architecture document --- proposals/architecture/flow.png | Bin 0 -> 58585 bytes proposals/architecture/flow.puml | 45 +++ proposals/architecture/index.html | 544 ++++++++++++++++++++++++++++++ 3 files changed, 589 insertions(+) create mode 100644 proposals/architecture/flow.png create mode 100644 proposals/architecture/flow.puml create mode 100644 proposals/architecture/index.html diff --git a/proposals/architecture/flow.png b/proposals/architecture/flow.png new file mode 100644 index 0000000000000000000000000000000000000000..1ac2bc02b999a905b09605f777051244f653677e GIT binary patch literal 58585 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 literal 0 HcmV?d00001 diff --git a/proposals/architecture/flow.puml b/proposals/architecture/flow.puml new file mode 100644 index 0000000..df5e970 --- /dev/null +++ b/proposals/architecture/flow.puml @@ -0,0 +1,45 @@ +@startuml +autonumber + +Participant "Payee" as Payee +Participant "Payment Mediator" as Mediator +Participant "Payer Payment App" as App +Actor "Payer" as Payer + +title Payment Request Flow + +Payee->Mediator: Payment Request + +alt Payer selects Payment App + Mediator->Payer: Get Payment App selection + Payer->Mediator: Select Payment App +else Mediator uses an algorithm to select Payment App + Mediator->Mediator: Select Payment App +end + +create App +Mediator->App: Payment Request + +opt Payer interacts with Payment App + App->Payer + Payer->App +end + +opt App communicates directly with payee + App->Payee: Get updated payment request + Payee->App: Updated payment request +end + +alt Payer selects Payment Method + App->Payer: Get Payment Method selection + Payer->App: Select Payment Method +else Payment App uses an algorithm to select Payment Method + App->Mediator: Select Payment Method +end + +note over App: Payment Method\n specific processing + +App->Mediator: Payment Response +Mediator->Payee: Payment Response + +@enduml \ No newline at end of file diff --git a/proposals/architecture/index.html b/proposals/architecture/index.html new file mode 100644 index 0000000..f8f138f --- /dev/null +++ b/proposals/architecture/index.html @@ -0,0 +1,544 @@ + + + + A Role-based Architecture for Processing Payment Requests + + + + + + +
+

The mission of the Web Payments Working Group is to make payments easier and more secure on the Web.

+ +

The group is chartered to develop multiple technologies. This document describes an architecture and a set + of roles in that architecture that, together, faciliatate the group's mission.

+ +

This intentionally describes components by their role, acknowledging that different implementations + may result in multiple roles being adopted by a single system component. No specifics are defined about how + the functions of each role will be fulfilled beyond the internal algorithms that each must execute. Specific + interfaces may be described in detail in accompanying documents that define how these roles are implemented + in those contexts.

+ +

This architecture is focused on the interactions between a payer and payee on the Web and does not + cover the architecture or components required for the full end to end payment process.

+
+ +
+ +
+

Design Decisions

+ +
+

Improve the payment experience for payers

+ +

Payments on the Web today are very payee-centric. The entire payment process is driven by the payee, usually + an online merchant, who presents the user with one or more ways to pay. In the majority of cases the user + provides a static credential (such as the details of a credit card) back to the merchant or is redirected + to a digital wallet service where they approve the transaction.

+ +

Unless the user is able to find a digital wallet that is supported by all of the payee's they wish to pay + they will never have a standardized payment experience and the majority of the time that experience is + driven by the payee.

+ +

Further, there is no standardized mechanism to estabilsh a bi-directional channel of communcation between the + payer (or their service provider) and the payee (or their service provider) which could be used to exchange + payment details and credentials in a more secure manner or negotiate the use of an entirely new payment + method.

+ +

To remedy this one-sided situation this architecture proposes a new standardized component, the + payment app, that is used by the payer to handle payment requests.

+
+
+

Protect payer privacy

+ +

Facilitating an autonomous process for matching the payment methods that the payer supports with those that + the payee supports seems trivial on the surface, however it is also important to ensure that the + architecture doesn't allow for user data to be leaked to the payee system.

+ +

To protect the payer's privacy the architecture defines the role of a payment mediator that sits + between the payer and payee mediating the initial handshake between them and conencting the requesting + payee system with an appropriate payer payment app.

+
+
+ +
+

Definitions

+ +

In this document we use the following terms with the implied definition as stated below:

+
+
Payer
+
A payer is implied to mean any system operated by (or on behalf of) the + payer. This includes systems operated by the payer's payment services provider. +
+
Payee
+
A payee is implied to mean any system operated by (or on behalf of) the + payee. This includes systems operated by the payee's payment services provider. +
+
Payment Request
+
A payment request is a request from a payee to be paid. + It contains the details of what to pay and how the payment can be made. How the + payment can be made is specified as a list of payment method identifiers. The payment request MUST + conatin all of the payment method data required for each payment method identified in it's set + of supported payment methods. +
+
Payment Response
+
A payment response is a response to a payment request + (normally the result of processing by a payment app). The content of a payment response will be dependant on + how the payment is being processed. +
+
Payment App
+
A payment app is a component that fulfills the conformance + criteria specified for a payment app in this specification. +
+
Payment Mediator
+
A payment mediator is a component that fulfills the + conformance criteria specified for a payment mediator in this specification. +
+
Payment Method
+
A payment method defines how a payment request + must be processed. It defines the format and content of the payment request and payment response messages + that are exchanged with a payment app. A payment app must be able to process payment requests + for one or more payment methods. +
+
Payment Method Data
+
Payment requests and payment responses have a limited set of data elements that are common to + all payments, irresepective of the payment method. However payment methods can define additional + custom data that is specific to that payment method. This custom data is called + payment method data. +
+
Payment Method Specification
+
A payment method specification + defines what payment method data is required inpayment requests and payment responses + for a particular payment method. It also lists the payment method identifiers that are defined for + that payment method. +
+
Payment Method Identifiers
+
Payment Method Identfiers are + defined in [[!METHOD-IDENTIFIERS]]
+
+
+ +
+

+ This specification defines two classes of products: +

+
+
Payment App
+
+

+ A payment app MUST behave as described in this specification + in order to be considered conformant. In this specification, payment app means a software + component that exercises the role of a payment app as described in the section Roles. +

+ +

An informative summary of the required capabilities of a payment app are: +

    +
  • It makes available a list of the payment methods for which it is able to process payment requests. +
  • +
  • It accepts and processes payment requests that conform to the requirements for one of the payment + methods it supports. +
  • +
  • It returns payment responses that conform to the requirements of one of the payment methods it + supports and one of the payment methods that was listed as supported in the original request. +
  • +
+

+

+ Payment apps MAY implement algorithms given in this specification in any way desired, so long as + the end result is indistinguishable from the result that would be obtained by the specification's + algorithms. +

+
+
Payment Mediator
+
+

+ A payment mediator MUST behave as described in this specification + in order to be considered conformant. In this specification, payment mediator means a software + component that exercises the role of a payment mediator as described in the section Roles. +

+ +

A summary of the required capabilities of a payment mediator are: +

    +
  • It maintains a record of the available payment apps that it is able to pass payment requests to. +
  • +
  • It maintains a record of the payment methods that each of these payment apps supports.
  • +
  • It accepts payment requests and, using algorithms, user input or a combination of the two, + determines which payment app to pass the payment request on to. +
  • +
  • It accepts payment responses back from the payment app and passes these on to the originator + of the corresponding payment request. +
  • +
+

+

+ Payment mediators MAY implement algorithms given in this specification in any way desired, so long as + the end result is indistinguishable from the result that would be obtained by the specification's + algorithms. +

+
+
+
+
+

Payment Request Flow

+ +

The flow of a payment request is shown in the diagram below:

+ + +

In this flow, any system or system component playing the role of payment app or payment mediator is + assumed to be controlled by the payer. The payment request originates from the payee and is + always processed first by a payment mediator.

+ +

It's quite possible that a single component may fulfil both roles or even that the system only supports a single + payment app, which is always used by default, and therefor the role of the payment mediator is + reduced to simply proxying the request and response between the payee system and the payment app.

+
+ +
+

Payment Methods

+ +

Each payment app will support one or more payment methods. A payment method is a system and + set of rules for processing a payment request. This architecture is designed to support the broadest + possible array of payment methods. When a payee accepts a given payment method, the assumption is that the + payee will know how to process the payment method data returned by the payment app for that payment + method.

+ +

Each payment method is identified by a payment method identifier. The payment mediator compares + payment method identifiers in the payment request to those, known to be enabled in the + available payment apps to determine which payment apps to offer the payer to use to process the + payment request.

+

Payment method identifiers support distributed extensibility, meaning that there is not a central + machine-readable registry to discover or register payment methods. Rather, any perosn or entity can + define a new payment method as long as they publish a payment method specification that defines: +

+
    +
  1. How a payment app should process a payment request.
  2. +
  3. What payment method data is expected to be included in the request.
  4. +
  5. What payment method data is expected to be included in the response.
  6. +
  7. What payment method identifiers identify this payment method.
  8. +
+
+
+

Roles

+ +

+ The following are the key roles within this architecture. +

+
+

Payment App

+ +

A payment app is a component able to process a payment request and return a payment response. Banks, + merchants, mobile operators, and anyone else who wants to, will make these available. User agents are also + likely to take on the role of a payment app, storing payment related information on behalf of the user, + as they already do today with passwords, and using this to process certain payment requests. It is expected + that payment apps will increase security and privacy by giving users more control over what they share over + the network. Payment apps will distinguish themselves through the features and services they provide beyond + the required capabilities described here, for example by offering strong user authentication, loyalty + program integration, back-channel communications with the merchant for fraud analytics, and so on.

+ +

Payment apps should be implementable on desktops, mobile devices, televisions, embedded devices and other + devices and operating systems. Payment apps may even be implemented in contexts where they do not have direct + access to the Web since they payment app receives payment requests from the payment mediator.

+ +

As part of processing a payment request, a payment app MAY render a user interface and/or take advantage of one or + more other IO channels for payer or third-party interaction (e.g., with a payment service provider). In some + cases, and where supported by a payment method, a payment app may be able to facilitate a payment without + immediate user interaction based on prior payer consent. (Example: A Web of Things scenario where the payer + is a machine capable of executing payments in accordance with predefined rules and logic).

+ +

The composition of a payment app will be platform and deployment dependent and many aspects of how the + payment app communicates with the host platform, interacts with the payer and payee, and communicates with + third-party services will be determined by the implementer who provides the execution environment for the + app, the channels supported by the chosen payment method and the capabilities of the payment mediator, + that mediates interactions between the payment app and the payee.

+ +
+

Supported vs Enabled Payment Methods

+ +

Payment apps support one or more payment methods. Support for a payment method implies that + the app SHOULD be able to process a payment request that conforms to the rules defined in the + payment method specification for that payment method and SHOULD be able to return a valid + payment response. +

+ +

However, sometimes an app will be designed to support a specific payment method but the app will + not have been configured to process payments using that payment method. This may be due to some + payment method data that the payer needs to configure such as a user credential or payment + instrument details. In that case the payment app is said to support the payment + method but that payment method is not enabled. +

+ +

For example, a payment app may be capable of processing a basic credit card payment that simply + returns the card details in the payment response. Unless the user has configured the payment app with + the card details or is able to provide these at the time of processing, that method is not + enabled. +

+ +

If a payment app defines a payment method as enabled then it MUST be able to process any + payment request that lists that that payment method as supported and is formatted correctly according + to the payment method specification for that payment method. +

+ +

Payment mediators should only consider enabled payment methods when evaluating if a + payment app is appropriate to process a given payment request.

+
+ +
+

Algorithms

+

+ The following algorithms must be implemented by all conforming payment apps: +

+
+

Processing Payment Requests

+

The most important capability of a payment app is it's ability to process a payment request + and return a valid payment response.

+

The steps for processing a payment request are given by the following algorithm. The + algorithm takes a valid payment request (request) as input and returns a valid + payment response (response).

+
    +
  1. + Let methods be an empty list. +
  2. +
  3. + Let enabled methods be the list of payment method identifiers for the + payment methods that are currently enabled in the app. +
  4. +
  5. + Let candidate methods be the list of payment method identifiers listed as + supported in request. +
  6. +
  7. + If enabled methods is empty throw an exception. +
  8. +
  9. + For each unique candidate payment method identifier in candidate methods +
      +
    1. + If no identifier, that is an exact string match for candidate payment method identifier, + is found in enabled methods, move onto the next item if there are any left. +
    2. +
    3. + Append candidate payment method identifier to methods. +
    4. +
    +
  10. +
  11. + If methods is empty throw an exception. +
  12. +
  13. + Let selected payment method be the result of selecting a payment method with + methods as input. +
  14. +
  15. + Let response be the result of performing payment method specific processing with + request and selected payment method as input. +
  16. +
+
+
+

Returning a list of enabled Payment Methods

+

+ In order for a payment mediator to know if it should consider passing a payment request + to a payment app it must know which payment methods are enabled in that app.

+

+ The payment app MUST provide a mechanism for external components to + get a list of enabled payment methods. The return value MUST be a set of unique + payment method identifiers and the payment app MUST be capable of + performing payment method specific processing for all payment methods identified by the + identifiers in that set. +

+
+
+
+

Extension Points

+

The following extension points are defined for implemntation specific processing.

+
+

Selecting a Payment Method

+

+ A payment app should implement a mechanism for selecting a payment method which takes as + input a list of payment method identifiers and returns a single payment method identifier. + This mechanism MAY include user input, selection based on a custom algorithm or even configured + defaults.

+
+
+

Performing Payment Method Specific Processing

+

+ A payment app that claims to have a particular payment method enabled must provide a + mechanism for performing payment method specific processing for that payment method. +

+

+ The input to this process will be a complete payment request and the payment method identifier + of the payment method that should be used to process the request. The payment app SHOULD + expect the request to contain any payment method data required to complete the processing of the + request. +

+

+ The specific behaviour of the payment app during this processing MAY include + user interaction or communication with other systems or components. This will be defined, either + explicitly or implicitly, in the appropriate payment method specification. The payment app + MUST return a payment response that contains the appropriate payment method data for the + payment method identifed by the payment method identifier passed as input to the process. +

+
+
+
+ +
+

Payment Mediator

+

The payment mediator sits between the payee's system and the payer's payment app(s) and performs a + number of functions:

+
    +
  1. + It determines which payment apps can be used to fulfill a payment request given the payee's + accepted payment methods. +
  2. +
  3. + It helps the payer choose one (typically with explicit interaction or prior consent). +
  4. +
  5. + It passes the payment request from the payee to the to the payer's selected payment app and + passes the payment response from the payment app back to the payee. +
  6. +
+
+

Algorithms

+

+ The following algorithms must be implemented by all conforming payment mediators: +

+
+

Filtering for capable Payment Apps

+

A payment mediator, upon receiving a payment request must compare the set of + payment methods supported by the payee (as defined in the payment request) with the + set of payment methods enabled in all available payment apps to which it has + access and produce a list of payment apps that should be capable of processing the + request.

+

The steps for getting a list of capable payment apps are given by the following algorithm. + The algorithm takes a valid payment request (request) and the set of + payment apps to which it is able to pass the payment request (apps) as + input and returns a set of payment method identifiers.

+
+ There are a number of issues open against the browser API which need to be resolved to come to a + conclusion on the correct algorithm to use in mathcing payment method identifiers. +
+
+

Extension Points

+

The following extension points are defined for implemntation specific processing.

+
+

Selection of Payment App

+

Once the mediator has determined the set of payment apps that are able to process the + payment request it must select one and pass the request to it.

+

The steps for selecting a payment app are implementation specific and MAY involve user + interaction with the payer or may involve an algorithm that uses defaults and configuration data to + make the selection.

+

The input to this process is an ordered list of payment apps and the output is a single + payment app.

+
+
Passing the Payment Request to the Payment App +

The payment mediator must have some mechanism of passing the payment request to the + payment app that was selected following the steps for selecting a payment app.

+

The payment request MUST not be altered by the payment mediator.

+
+
+
+
+ +
+

+ The working group maintains a + list of all bug reports that the group has not yet addressed. + This draft highlights some of the pending issues that are still to be discussed in the working + group. No decision has been taken on the outcome of these issues including whether they are valid. + Pull requests with proposed specification text for outstanding issues are strongly encouraged. +

+ +

+ This specification was derived from + A Payments + Initiation Architecture for the Web. +

+