blob: 0935f62ffbae4f6e1d7fb30aa39300f3fecaa7b0 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
[JavaPackage="org.chromium.payments.mojom"]
module payments.mojom;
import "components/payments/mojom/payment_request_data.mojom";
import "mojo/public/mojom/base/time.mojom";
import "url/mojom/url.mojom";
struct PaymentResponse {
string method_name;
// Payment method specific JSON string that is built either by the browser or
// a payment app, for example Android Pay. Browser ensures that the string can
// be successfully parsed into base::JSONParser. Renderer parses this string
// via v8::JSON::Parse() and hands off the result to the merchant website.
// There's no one format for this object, so more specific types cannot be
// used. A simple example:
//
// {"nameOnCard": "Jon Doe", "pan": "4111 1111 1111 1111"}
string stringified_details;
PaymentAddress? shipping_address;
string? shipping_option;
PayerDetail payer;
};
struct PayerDetail {
string? email;
string? name;
string? phone;
};
enum PaymentErrorReason {
UNKNOWN,
USER_CANCEL,
NOT_SUPPORTED,
NOT_SUPPORTED_FOR_INVALID_ORIGIN_OR_SSL,
ALREADY_SHOWING,
INVALID_DATA_FROM_RENDERER,
};
enum CanMakePaymentQueryResult {
CAN_MAKE_PAYMENT,
CANNOT_MAKE_PAYMENT,
};
enum HasEnrolledInstrumentQueryResult {
HAS_ENROLLED_INSTRUMENT,
HAS_NO_ENROLLED_INSTRUMENT,
QUERY_QUOTA_EXCEEDED,
// Used only on localhost and file:// schemes to warn web developer that the
// query quota has been exceeded, but Chrome is returning an answer anyway.
WARNING_HAS_ENROLLED_INSTRUMENT,
WARNING_HAS_NO_ENROLLED_INSTRUMENT,
};
// Implemented in the renderer process. Sandboxed. Deals with untrusted data.
// Implementation: third_party/blink/renderer/modules/payments/payment_request.h
// Important: these methods are asynchronous. For example, when Blink calls:
// PaymentRequest request = new PaymentRequest();
// request.canMakePayment();
// and when Java's PaymentRequest#init() invokes PaymentRequestClient#onError(),
// the execution sequence would be:
// Blink: PaymentRequest request = new PaymentRequest();
// Blink: request.canMakePayment();
// Java: PaymentRequest#init()
// Java: PaymentRequestClient#onError()
// Java: PaymentRequest#canMakePayment()
// Blink: request.onError()
interface PaymentRequestClient {
OnPaymentMethodChange(string method_name, string stringified_details);
OnShippingAddressChange(PaymentAddress address);
OnShippingOptionChange(string shipping_option_id);
OnPayerDetailChange(PayerDetail detail);
OnPaymentResponse(PaymentResponse response);
OnError(PaymentErrorReason error, string error_message);
OnComplete();
OnAbort(bool aborted_successfully);
OnCanMakePayment(CanMakePaymentQueryResult result);
OnHasEnrolledInstrument(HasEnrolledInstrumentQueryResult result);
WarnNoFavicon();
};
struct PaymentItem {
string label;
PaymentCurrencyAmount amount;
bool pending;
};
struct PaymentShippingOption {
string id;
string label;
PaymentCurrencyAmount amount;
bool selected;
};
enum AndroidPayEnvironment {
PRODUCTION,
TEST
};
enum BasicCardNetwork {
AMEX,
DINERS,
DISCOVER,
JCB,
MASTERCARD,
MIR,
UNIONPAY,
VISA
};
struct GooglePaymentMethodData {
// A JSON string built by the renderer from the same merchant-provided
// JavaScript object used to build |stringified_data| in the containing
// PaymentMethodData. The renderer interprets the JavaScript object as a GPay
// API object and sets additional parameters to request contact and shipping
// information from the GPay payment app. The renderer uses
// blink::JSONObject::toJSONString() to generate this string from the modified
// JavaScript object. The browser does not parse the string and passes it
// as-is directly to the GPay payment app.
string stringified_data;
// Each of the following flags is true if the corresponding piece of data was
// not requested in |stringified_data| in the containing PaymentMethodDatabut
// is now set in |stringified_data| above. The Android browser process uses
// these flags to redact the response from the native GPay SDK before
// returning it to the renderer.
bool phone_requested;
bool name_requested;
bool email_requested;
bool shipping_requested;
};
// Parameters for the "secure-payment-confirmation" payment method identifier.
// https://github.com/rsolomakhin/secure-payment-confirmation
struct SecurePaymentConfirmationRequest {
// A list of WebAuthn credential identifiers. These values will be looked up
// in "secure_payment_confirmation_instrument" table. Upon user gesture, one
// of these credentials will be queried from WebAuthn.
array<array<uint8>> credential_ids;
// An indefinite-length blob passed from the relying party server, to be sent
// to an authenticator for signing together with the price and merchant
// origin.
array<uint8> network_data;
// Time to wait for an authenticator to complete an operation provided by the
// relying party.
mojo_base.mojom.TimeDelta? timeout;
};
struct PaymentMethodData {
string supported_method;
// A JSON string built by the renderer from a JavaScript object that the
// merchant website provides. The renderer uses
// blink::JSONObject::toJSONString() to generate this string. The browser does
// not parse the string and passes it as-is directly to payment apps. There's
// no one format for this object, so more specific types cannot be used. A
// simple example:
//
// {"gateway": "stripe"}
string stringified_data;
// Data specific to the skip-to-GPay experimental flow. This field is only set
// if |supported_method| is Google Pay and if the current request is eligible
// for the skip-to-GPay experimental flow.
[EnableIf=is_android]
GooglePaymentMethodData? gpay_bridge_data;
// Android Pay specific method data is parsed in the renderer.
// https://developers.google.com/web/fundamentals/getting-started/primers/payment-request/android-pay
// TODO(rouslan): Stop parsing Android Pay data. http://crbug.com/620173
AndroidPayEnvironment environment;
// Value of 0 means the merchant did not specify or it was an invalid value.
int32 min_google_play_services_version;
// Value of 0 means the merchant did not specify or it was an invalid value.
int32 api_version;
// Basic card specific method data is parsed in the renderer.
array<BasicCardNetwork> supported_networks;
// Parameters for the "secure-payment-confirmation" payment method identifier.
SecurePaymentConfirmationRequest? secure_payment_confirmation;
};
struct PaymentDetailsModifier {
PaymentItem? total;
array<PaymentItem> additional_display_items;
PaymentMethodData method_data;
};
struct PaymentDetails {
PaymentItem? total;
// If any of these lists is null, then PaymentRequest.UpdateWith() ignores
// them. If any of these lists are empty, then PaymentRequest.UpdateWith()
// clears the corresponding lists in the browser.
array<PaymentItem>? display_items;
array<PaymentShippingOption>? shipping_options;
array<PaymentDetailsModifier>? modifiers;
string error = "";
AddressErrors? shipping_address_errors;
// Identifier identifying the payment request, to be exposed
// to payment apps. It is optional since this structure is used
// by PaymentDetailsUpdate (next to PaymentDetailsInit) but
// PaymentDetailsUpdate has no id.
string? id;
string? stringified_payment_method_errors;
};
enum PaymentShippingType {
SHIPPING,
DELIVERY,
PICKUP
};
struct PaymentOptions {
bool request_payer_name;
bool request_payer_email;
bool request_payer_phone;
bool request_shipping;
PaymentShippingType shipping_type;
};
enum PaymentComplete {
FAIL,
SUCCESS,
UNKNOWN
};
// Implemented in the browser process. Not sandboxed. Deals with trusted data.
// Android implementation (Clank, WebLayer):
// components/payments/content/android/java/src/org/chromium/components/payments/MojoPaymentRequestGateKeeper.java
// Desktop (Windows, ChromeOS, Linux, MacOS) implementation:
// components/payments/content/payment_request.h
interface PaymentRequest {
// Instantiates the renderer-browser connection with the information from the
// JavaScript constructor of PaymentRequest.
// |google_pay_bridge_eligible| is true when the renderer process deems the
// current request eligible for the skip-to-GPay experimental flow. It is
// ultimately up to the browser process to determine whether to trigger it.
Init(pending_remote<PaymentRequestClient> client,
array<PaymentMethodData> method_data,
PaymentDetails details,
PaymentOptions options,
[EnableIf=is_android] bool google_pay_bridge_eligible);
// Shows the user interface with the payment details.
// |is_user_gesture|: Whether the show is triggered from a user gesture.
// |wait_for_updated_details|: It's true when merchant passed in a promise
// into PaymentRequest.show(), so Chrome should disregard the initial payment
// details and show a spinner until the promise resolves with the correct
// payment details. The payment details will be updated with UpdateWith().
Show(bool is_user_gesture, bool wait_for_updated_details);
// Updates the payment details in response to (1) new shipping address or
// shipping option, or (2) the resolution of show()'s PaymentDetailsUpdate
// promise.
// |details|: The details that the merchant provides to update the payment
// request.
UpdateWith(PaymentDetails details);
// Called when the merchant received a new shipping address or shipping
// option, but did not update the payment details in response.
OnPaymentDetailsNotUpdated();
// Requests to abort the checkout in process, for example because the item
// went out of stock.
Abort();
// Closes the payment user interface.
Complete(PaymentComplete result);
// Called when the merchant calls explicitly retry() method in JavaScript.
// The |errors| contains merchant-defined error message strings. They are
// used to indicate to the end-user that something is wrong with the data of
// the payment response.
Retry(PaymentValidationErrors errors);
// Queries whether support for the merchant-specified payment method is
// available, either because the user has a registered payment handler for
// that method, or because the browser can do just-in-time registration for a
// suitable payment handler.
CanMakePayment();
// Queries whether support for the merchant-specified payment method is
// available and the user has an enrolled instrument for that payment method
// that is ready to pay.
HasEnrolledInstrument();
};