How Payment Request API works

Learn how the Payment Request API works at a high level.

Payment Request API

When a customer tries to purchase something from your website, the site must ask the customer to provide payment information and, optionally, other information such as shipping preference. You can achieve this easily and quickly using the Payment Request API (PR API).

Basic structure

Constructing a PaymentRequest object requires two parameters: payment methods and payment details. In addition, a third payment options parameter is optional. A basic request could be created like this:

const request = new PaymentRequest(paymentMethods, paymentDetails);

Let's look at how each parameter is built and used.

Payment methods

The first parameter, paymentMethods, is a list of supported payment methods in an array variable. Each element in the array comprises two components, supportedMethods and, optionally, data.

For supportedMethods, the merchant needs to specify a Payment Method Identifier such as https://bobbucks.dev/pay. The existence and content of data depends on the content of supportedMethods and payment app provider's design.

Both pieces of information should be provided by the payment app provider.

// Supported payment methods
const paymentMethods = [{
  supportedMethods: 'https://bobbucks.dev/pay',
  data: {
    ... // Optional parameters defined by the payment app provider.
  }
}];

Payment details

The second parameter, paymentDetails, is passed as an object and specifies payment details for the transaction. It contains the required value total, which specifies the total amount due from the customer. This parameter can also optionally list the purchased items.

In the example below, the optional purchased items list (just one item, in this case) is shown, as is the required total amount due. In both cases the currency unit is specified with each individual amount.

const paymentDetails = {
  displayItems: [{
    label: 'Anvil L/S Crew Neck - Grey M x1',
    amount: { currency: 'USD', value: '22.15' }
  }],
  total: {
    label: 'Total due',
    amount: { currency: 'USD', value : '22.15' }
  }
};

Check whether the payment method is available

Before invoking the payment procedure, the merchant can check whether the user and the environment are ready for making a payment.

Calling canMakePayment() checks if the browser supports at least one payment method specified in the object.

request.canMakePayment().then(result => {
  if (result) {
    // This browser supports the specified payment method.
  } else {
    // This browser does NOT support the specified payment method.
  }
}).catch(e => {
  // An exception
});

Learn more about PaymentRequest.canMakePayment() on MDN

The show() method

After setting the two parameters and creating the request object as shown above, you can call the show() method, which displays the payment app user interface.

request.show().then(response => {
  // [process payment]
  // send to a PSP etc.
  response.complete('success');
});

How payment app user interface will look is completely up to the payment app provider. After the customer agrees to make a payment, a JSON object is passed to the merchant which contains all the required information to transfer money. The merchant can then send it to the PSP to process the payment.

Finally, you may close the Payment Request UI by completing the process with response.complete('success') or response.complete('fail') depending on the result that the PSP returns.

Next up

Learn more about Web Payments.