Tutorial

  • This tutorial provides a step-by-step guide for integrating Google Pay into Android applications for accepting card payments.

  • Developers can configure payment settings, including supported card networks and payment providers.

  • The tutorial includes code examples in Kotlin and Java to demonstrate the integration process.

  • The example gateway is for testing purposes only; replace it with your provider's details for live transactions.

  • Developers should ensure to review the Google Pay API documentation and best practices for a successful integration.

Follow the steps in this tutorial to add Google Pay to your Android application and configure it to accept payment cards.

Step 1: Define your payment configuration

Configure your Google Pay API version

Declare the version of the Google Pay API that your application uses. The major and minor versions affect the fields expected in each passed object and are included in the response.

Create a base request object that contains properties that are present in all other request objects.

Kotlin

privatevalbaseRequest=JSONObject()
.put("apiVersion",2)
.put("apiVersionMinor",0)

Java

privatestaticJSONObjectgetBaseRequest()throwsJSONException{
returnnewJSONObject()
.put("apiVersion",2)
.put("apiVersionMinor",0);
}

Request a payment token for your payment provider

Google encrypts information about a payer's selected card for secure processing by a payment provider.

Kotlin

privatefungatewayTokenizationSpecification():JSONObject{
returnJSONObject().apply{
put("type","PAYMENT_GATEWAY")
put("parameters",JSONObject(mapOf(
"gateway"to"example",
"gatewayMerchantId"to"exampleGatewayMerchantId")))
}
}

Java

privatestaticJSONObjectgetGatewayTokenizationSpecification()throwsJSONException{
returnnewJSONObject()
.put("type","PAYMENT_GATEWAY")
.put("parameters",newJSONObject()
.put("gateway","example")
.put("gatewayMerchantId","exampleGatewayMerchantId")
);
}

Replace example and exampleGatewayMerchantId with the appropriate values for your payment provider. Use the following table to find the specific gateway and gatewayMerchantId values for your payment provider:

Gateway Parameters and documents
9Pay
 "gateway": "ninepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

91APP PAYMENTS
 "gateway": "payments91app"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

A-IT
 "gateway": "aitecomm"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ABA PayWay
 "gateway": "ababank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

accept.blue
 "gateway": "acceptblue"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ACI
 "gateway": "aciworldwide"
 "gatewayMerchantId": "YOUR_ENTITY_ID"

Developer docs

ACpay
 "gateway": "acpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Acquired.com
 "gateway": "acquired"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Adyen
 "gateway": "adyen"
 "gatewayMerchantId": "YOUR_MERCHANT_ACCOUNT_NAME"

Developer docs

African Payment Solution (PTY) Ltd t/a LekkaPay
 "gateway": "lekkapay"
 "gatewayMerchantId": "YOUR_MERCHANT_ACCOUNT_NAME"

Developer docs

AI Fintech
 "gateway": "aifintech"
 "gatewayMerchantId": "YOUR_MERCHANT_ACCOUNT_NAME"

Developer docs

Airba Pay
 "gateway": "airbapay""
 "gatewayMerchantId": "YOUR_MERCHANT_ACCOUNT_NAME"

Developer docs

Airvend
 "gateway": "airvend"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Airwallex
 "gateway": "airwallex"
 "gatewayMerchantId": "YOUR_MERCHANT_ACCOUNT_NAME"

Developer docs

Akurateco
 "gateway": "akuratecolab"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Alfa-Bank
 "gateway": "alfabank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Algoritma
 "gateway": "algoritma"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Allinpay
 "gateway": "allinpayintl"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

AllPayments
 "gateway": "allpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

alticepay
 "gateway": "alticepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

AMO FINTECH LLC
 "gateway": "amofintech"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Amwal Pay
 "gateway": "amwalalraqamia"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Anedot
 "gateway": "anedot"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ApcoPay
 "gateway": "apcopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

APPEX
 "gateway": "epos"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Armenian Card OJSC
 "gateway": "epgarca"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

AsiaBill
 "gateway": "asiabill"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Assist
 "gateway": "assist"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Assist Belarus
 "gateway": "belassist"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Assist Kazakhstan
 "gateway": "assistkz"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Aurus
 "gateway": "auruspay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Authorize.net
 "gateway": "authorizenet"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Axerve
 "gateway": "gestpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

AXS
 "gateway": "axsasia"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

azericardgpay
 "gateway": "azericardgpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

B2B Soft Pay
 "gateway": "b2bsoftpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bancstac
 "gateway": "bancstac"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bank 131
 "gateway": "bank131"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bank Muscat
 "gateway": "bankmuscat"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

BANK RBK
 "gateway": "bankrbkkzpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bank Vostok
 "gateway": "bankvostok"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Barclaycard
 "gateway": "barclayssmartpayadvance"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Barion
 "gateway": "barion"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Basis Theory
 "gateway": "basistheory"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

BCC.KZ
 "gateway": "bccpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

bePaid
 "gateway": "ecomcharge"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bereke Bank
 "gateway": "berekepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Better Payment Germany GmbH
 "gateway": "betterpayment"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Billing Systems
 "gateway": "billingsystems"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bindo Labs Limited
 "gateway": "bindo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

bisys.kz
 "gateway": "bisysgpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bizon.one
 "gateway": "bizonone"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bizzon
 "gateway": "bizzon"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Blackstone Merchant Services
 "gateway": "blackstone"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Blocks
 "gateway": "blocks"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bluefin
 "gateway": "bluefin"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bluefin Europe
 "gateway": "bluefineurope"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Blue Media
 "gateway": "bluemedia"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

BlueSnap
 "gateway": "bluesnap"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Blusky Technology Services
 "gateway": "bluskysvcpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

BORICA
 "gateway": "borica"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

BPC
 "gateway": "bpcpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

BR-DGE
 "gateway": "comcarde"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Braintree
 "gateway": "braintree"
 "braintree:apiVersion": "v1"
 "braintree:sdkVersion": "braintree.client.VERSION"
 "braintree:merchantId": "YOUR_BRAINTREE_MERCHANT_ID"
 "braintree:clientKey": "YOUR_BRAINTREE_TOKENIZATION_KEY"

Developer docs

Braspag
 "gateway": "cielo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

BridgerPay
 "gateway": "bridgerpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Bonum
 "gateway": "bonumpsp"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

BT Pay
 "gateway": "btpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Buckaroo
 "gateway": "buckaroo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Buya
 "gateway": "buya"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Callpay
 "gateway": "callpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CARDAQ
 "gateway": "cardaq"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CardCom
 "gateway": "cardcom"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CardConnect
 "gateway": "cardconnect"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Cardknox
 "gateway": "cardknox"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

cardlink
 "gateway": "cardlink"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Cardstream
 "gateway": "crst"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Cashflows
 "gateway": "cashflowsgateway"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Cathay United Bank
 "gateway": "cathaybk"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CCAvenue UAE
 "gateway": "ccavenueuae"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CCV
 "gateway": "ccv"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Cecabank
 "gateway": "cecabank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Celerispay
 "gateway": "celerispay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CentralPay
 "gateway": "centralpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Centrobill LTD
 "gateway": "centrobill"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Chargehive
 "gateway": "chargehive"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CharityEngine
 "gateway": "charityengine"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Chase Merchant Services
 "gateway": "chase"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Checkout.com
 "gateway": "checkoutltd"
 "gatewayMerchantId": "YOUR_PUBLIC_KEY"

Developer docs

CIBPAY MMC
 "gateway": "cibpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

City Bank PLC
 "gateway": "citybank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CityPay
 "gateway": "citypay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Cloud9 Payment Gateway (C9PG)
 "gateway": "c9pg"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CloudPayments
 "gateway": "cloudpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CloudWalk
 "gateway": "cloudwalk"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Coinflow
 "gateway": "coinflow"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Comax (Native Data LTD)
 "gateway": "comaxpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Computop
 "gateway": "computop"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ConcordPay
 "gateway": "concordpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Conekta
 "gateway": "conektagpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Connectum
 "gateway": "connectum"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ConnexPay
 "gateway": "connexpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CoralPay
 "gateway": "coralpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Corefy
 "gateway": "paycoreio"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Coriunder Limited
 "gateway": "coriunder"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Corvus Pay
 "gateway": "corvuspay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Credit2000
 "gateway": "credit2000"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Credorax
 "gateway": "credorax"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CrossPay
 "gateway": "crosspay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Cross Switch
 "gateway": "crossswitch"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CSG Forte
 "gateway": "csgforte"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CTBC Bank
 "gateway": "ctbcbank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CURO Payments
 "gateway": "curopayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

CYBERBIZ
 "gateway": "cyberbizpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Cybersource
 "gateway": "cybersource"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

danube.pay
 "gateway": "danubepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Datacap Systems, Inc.
 "gateway": "datatrans"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Datatrans
 "gateway": "datatrans"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

DECTA
 "gateway": "decta"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs

Dejavoo
 "gateway": "denovosystempay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

DEUNA
 "gateway": "deuna"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Deutsche Bank AG
 "gateway":
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs

Deutsche Bank – Merchant Solutions
 "gateway":
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

DG Financial Technology, Inc.
 "gateway": "veritrans"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Dibsy
 "gateway": "dibsy"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Digital Commerce Bank
 "gateway": "dcpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Digital Finance
 "gateway": "digitalfinance"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Dintero
 "gateway": "dintero"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

dLocal
 "gateway": "dlocal"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

DNA Payments
 "gateway": "dnapayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Dojo
 "gateway": "dojo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

DOKU
 "gateway": "dokudjakarta"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Doremi-Tech
 "gateway": "doremitech"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Dotpay
 "gateway": "dotpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

e-SiTef - Software Express
 "gateway": "softwareexpress"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

easycard
 "gateway": "easycard"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

EasyPay
 "gateway": "easypay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Easypay EU
 "gateway": "easypaypt"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

EBANX
 "gateway": "ebanx"
 "gatewayMerchantId": "YOUR_PUBLIC_INTEGRATION_KEY"

Developer docs

EBizCharge
 "gateway": "ebizcharge"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

eCard
 "gateway": "ecard"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Ecart Pay
 "gateway": "ecartpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Ecentric Payment Systems
 "gateway": "ecentric"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Ecomm Merchant Solutions
 "gateway": "ecommmerchantsolutions"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ECOMMPAY
 "gateway": "ecommpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Ecopaynet
 "gateway": "ecopaynet"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ECPay
 "gateway": "ecpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

ECRYPT INC
 "gateway": "ecrypt"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

EdfaPay
 "gateway": "edfapay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

eftcorporation
 "gateway": "eftcorporation"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

eGHL
 "gateway": "eghl"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Elavon (Converge)
 "gateway": "convergepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Emerchantpay
 "gateway": "emerchantpay"
 "gatewayMerchantID": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

emspay
 "gateway": "emsonline"
 "gatewayMerchantID": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Encoded
 "gateway": "encoded"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

epay
 "gateway": "epay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

EPAYJSC
 "gateway": "epayjsc"
 "gatewayMerchantID": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

EpicPay
 "gateway": "epicpay"
 "gatewayMerchantID": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Espago
 "gateway": "espago"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Etisalat
 "gateway": "etisalatpaymentgateway"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

EuPlatesc - Europayment Services SRL
 "gateway": "euplatesc"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Euronet Merchant Services (epay)
 "gateway": "emspi"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Evertec Placetopay S.A.S
 "gateway": "placetopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Evervault
 "gateway": "evervault"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

EveryPay S.A.
 "gateway": "EveryPay S.A."
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

EVONET
 "gateway": "cardinfolink"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

EVOPAY
 "gateway": "EVOPAY"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Evo Payment Gateway
 "gateway": "evopaymentgateway"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

exactly.com
 "gateway": "exactly"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Exact Payments
 "gateway": "exactpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Fat Zebra
 "gateway": "fatzebra"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Fenige
 "gateway": "fenige"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Fexco payUnite
 "gateway": "fexco"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Fibonatix
 "gateway": "fibonatixparagon"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Financial Line
 "gateway": "finline"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Finanso UA
 "gateway": "finansoua"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

finby
 "gateway": "finby"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

fincode byGMO
 "gateway": "fincode"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

FINEXUS
 "gateway": "finexus"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Finix
 "gateway": "finix"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

FireAntPay
 "gateway": "fireantpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

First American by Deluxe
 "gateway": "firstpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Fiuu (formerly Razer Merchant Services & MOLPay)
 "gateway": "molpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

FIS Biller Solutions
 "gateway": "fisglobalbsp"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Fiserv
 "gateway": "fiserv"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Fiserv
 "gateway": "fiservipg"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Flintn
 "gateway": "flintn"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Flitt
 "gateway": "flitt"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Flow pagos
 "gateway": "flow_pay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Fluid Pay
 "gateway": "fluidpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Flyway
 "gateway": "flyway"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

FM Finance LTD
 "gateway": "fmfinanceltd"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ForteBank
 "gateway": "fortebank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Forward
 "gateway": "forward"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

FPAY
 "gateway": "fizzapay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Fractal
 "gateway": "fractal"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Freedom Finance Bank
 "gateway": "axayscom"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

FreedomPay
 "gateway": "freedompay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

FreedomPay.Money
 "gateway": "payboxmoney"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Freepay
 "gateway": "freepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Frisbii
 "gateway": "Frisbii"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Frontstream
 "gateway": "frontstreampayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Fung Payments
 "gateway": "fungpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Gatewell Payments
 "gateway": "gatewellpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

GBPayments
 "gateway": "gbpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

geidea
 "gateway": "geidea"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Getnet
 "gateway": "getnetpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

GETTRX
 "gateway": "globalelectronictechnology"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Gkash
 "gateway": "gkash"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Global One Pay
 "gateway": "globalonepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Global Payments
 "gateway": "globalpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

globalpaymentsinc
 "gateway": "globalpaymentsinc"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

GMO Payment Gateway
 "gateway": "gmopg"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

GoDaddy Payments
 "gateway": "godaddypayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Good Idea Technologies
 "gateway": "git"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

GoPay
 "gateway": "gopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

GP Webpay
 "gateway": "gpwebpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Gravity Payments
 "gateway": "gravitypayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Gr4vy
 "gateway": "gr4vy"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Halyk Bank
 "gateway": "halykbank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Helcim
 "gateway": "helcim"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

HiPay
 "gateway": "hipay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

HIPS
 "gateway": "hips"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

HiTrust
 "gateway": "hitrustpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

hutko
 "gateway": "hutko"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Hyp
 "gateway": "hyp"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

icard
 "gateway": "icardwallet"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

iCount
 "gateway": "iCount"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

iCredit
 "gateway": "rivhit"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

IDid Tecnologia Ltda
 "gateway": "idid"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

iKhokha
 "gateway": "ikhokha"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

IMOJE
 "gateway": "imoje"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Impaya
 "gateway": "impayarus"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Infofintech S A S
 "gateway": "infofintech"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Inovio Payments
 "gateway": "inoviopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

InPlat
 "gateway": "inplat"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

InstaMed
 "gateway": "instamed"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

IntaSend Solutions Limited
 "gateway": "intasend"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

IntellectMoney
 "gateway": "intellectmoney"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Interactive Transaction Solutions
 "gateway": "interactivets"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Interpay
 "gateway": "interpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Interpay Llp
 "gateway": "interpaypro"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Interswitch Payment Gallery
 "gateway": "interswitch"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Intervale
 "gateway": "intervale"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ioka fintech
 "gateway": "ioka"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

iPay88
 "gateway": "ipay88"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

IPSI
 "gateway": "ipsi"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

iQmetrix
 "gateway": "iqmetrixpaymentservicesgateway"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

iVeri Payment Technologies
 "gateway": "iveri"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

IXOPAY
 "gateway": "ixopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

JagoLink Limited
 "gateway": "jagolink"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

JetPay
 "gateway": "jetpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

jpmmps
 "gateway": "jpmmps"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

JudoPay
 "gateway": "judopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Juspay
 "gateway": "juspay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

JustiFi
 "gateway": "justifi"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

KapitalBank
 "gateway": "eCommerceKapitalBank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Kassa
 "gateway": "kassacom"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

kassa24pay
 "gateway": "kassa24pay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Kazpost JSC
 "gateway": "qazpost"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

KimNganPay
 "gateway": "kimngan"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Kineox
 "gateway": "kineox"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Klix by Citadele
 "gateway": "klix"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Koin
 "gateway": "koin"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

KPay Group
 "gateway": "kpaygroup"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Kronor.io
 "gateway": "kronor"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Kyrgyzkommertsbank
 "gateway": "kkbpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Lapsa Payments
 "gateway": "lapsapayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Lemonway
 "gateway": "lemonway"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

LHV Pank
 "gateway": "lhvpank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Liberty
 "gateway": "liberty"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Life Pay
 "gateway": "lifepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Limepay
 "gateway": "limepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Linkly
 "gateway": "linkly"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

LiqPay
 "gateway": "liqpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

LITIQON OÜ
 "gateway": "nuvex"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Littlepay
 "gateway": "littlepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

LogPay
 "gateway": "logpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Loyale
 "gateway": "loyale"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

lynck
 "gateway": "lynck"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Lyra
 "gateway": "lyra"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MADFIN TECH
 "gateway": "madfingate"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Magnetiq Bank
 "gateway": "magnetiq"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

maib
 "gateway": "maibecomm"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MakeCommerce (Maksekeskus)
 "gateway": "maksekeskus"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Maksu GMBH
 "gateway": "maksupayeu"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Mandarin
 "gateway": "mandarin"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Market Pay
 "gateway": "marketpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Mastercard Payment Gateway Services
 "gateway": "mpgs"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Maya
 "gateway": "mayaph"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Mellifera
 "gateway": "mellifera"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MerchantE
 "gateway": "merchante"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Midtrans
 "gateway": "midtrans"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Menahel4uGoCredit
 "gateway": "menahel4ugocredit"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Merchant Warrior
 "gateway": "merchantwarrior"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Minsait Payments Systems
 "gateway": "minsaitpaymentsgateway"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MITEC
 "gateway": "mitecmx"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MIXPLAT
 "gateway": "mixplat"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Mobbex
 "gateway": "mobbex"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

MOBI.Money
 "gateway": "mobimoney"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Modulbank
 "gateway": "modulbank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Mollie
 "gateway": "mollie"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Mondido
 "gateway": "mondido"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Monei
 "gateway": "monei"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

monek
 "gateway": "monek"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Moneris
 "gateway": "moneris"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Moneta
 "gateway": "moneta"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Monext
 "gateway": "monext"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MoneyHash
 "gateway": "moneyhash"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Money.Mail.Ru
 "gateway": "moneymailru"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

monripayments
 "gateway": "monripayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Moov
 "gateway": "moov"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Moyasar
 "gateway": "moyasar"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MPay
 "gateway": "managepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MSolution
 "gateway": "msolution"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

mstartipg
 "gateway": "mstartipg"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MTB BANK, PJSC
 "gateway": "mtb"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Multicarta
 "gateway": "mulitcarta"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MultiSafepay
 "gateway": "multisafepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Mundipagg
 "gateway": "mundipagg"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MyCheck
 "gateway": "mycheck"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Mycar Pay
 "gateway": "mycarpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MyChoice2Pay
"gateway":"mychoice2pay"
"gatewayMerchantId":"YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MyFatoorah
 "gateway": "myfatoorah"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

MyPay
 "gateway": "mypay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

myPOS
 "gateway": "mypos"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

N&TS Group
 "gateway": "netsgroup"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

NCCC
 "gateway": "nccc"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Neolink
 "gateway": "neolinkprocessing"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Neon Pay
 "gateway": "neonpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Neopayment
 "gateway": "neopayment"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Netopia
 "gateway": "netopia"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Netvalve
 "gateway": "netvalve"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Network International
 "gateway": "networkintl"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Newebpay (formerly STPath, Pay2Go)
 "gateway": "newebpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Newtech
 "gateway": "newtechmobile"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Nexi
 "gateway": "nexi"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Nexi
 "gateway": "siavpos"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Nexi Easy
 "gateway": "easy"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

NMI
 "gateway": "gatewayservices"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

noon payments
 "gateway": "noonpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Noqoody Pay
 "gateway": "noqoodypay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

North
 "gateway": "north"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Novalnet
 "gateway": "novalnet"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Nexi Relay
 "gateway": "nexirelay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

NTT DATA
 "gateway": "nttdatahk"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Nuvei
 "gateway": "nuvei"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Oceanpayment
 "gateway": "oceanpayment"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Omise
 "gateway": "omise"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Omno
 "gateway": "omno"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

One Inc
 "gateway": "oneinc"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Onelya
 "gateway": "onelya"
 "gatewayMerchantId": "YOUR_GATWAY_MERCHANT_ID"

Developer docs

Onerway
 "gateway": "ronghan"
 "gatewayMerchantId": "YOUR_GATWAY_MERCHANT_ID"

Developer docs

OneVision Limited
 "gateway": "onevision"
 "gatewayMerchantId": "YOUR_GATWAY_MERCHANT_ID"

Developer docs

OnPay
 "gateway": "onpayio"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Opayo by Elavon
 "gateway": "opayoelavon"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ONVO
 "gateway": "onvopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Orient Commercial Joint Stock Bank (OCB)
 "gateway": "ocbcheckout"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

OrkestaPay
 "gateway": "orkestapay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Oschadbank
 "gateway": "oschadbank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Outpayce
 "gateway": "outpayce"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

pagarme
 "gateway": "pagarme"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PagBank
 "gateway": "pagbank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PagBrasil
 "gateway": "pagbrasil"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PagSeguro
 "gateway": "pagsegurointernational"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pay N Seconds
 "gateway": "paynseconds"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

PAY2M
 "gateway": "pay2m"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payadmit
 "gateway": "payadmit"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payarc
 "gateway": "payarc"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paybis
 "gateway": "paybis"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PAYBOX VERIFONE
 "gateway": "paybox"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Pay.com
 "gateway": "paycom"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PAYCOMET
 "gateway": "paycomet"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paycore
 "gateway": "twisto"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paycross Ltd
 "gateway": "paycross"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paydock
 "gateway": "paydock"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayEase
 "gateway": "payeasenet"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayEngine
 "gateway": "payengine"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayerMax
 "gateway": "payermax"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayFabric
 "gateway": "payfabric"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayFacto
 "gateway": "payfacto"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayFast
 "gateway": "gopayfastuat"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

paygent
 "gateway": "paygent"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payhub
 "gateway": "payhub"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayKKa
 "gateway": "paykkaeu"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payku
 "gateway": "payku"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayLane
 "gateway": "paylane"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payler
 "gateway": "payler"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayLink®
 "gateway": "paylink"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payload
"gateway":"payload"
"gatewayMerchantId":"YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paymark
 "gateway": "paymark"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayMaster
 "gateway": "paymaster"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayMe
 "gateway": "payme"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payment Fusion
 "gateway": "paymentfusion"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PaymentIQ
 "gateway": "worldlinedevcode"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paymentvision
 "gateway": "paymentvision"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paymentwall
 "gateway": "paymentwall"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paymo
 "gateway": "paymo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paymob
 "gateway": "gpaymob"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayMongo
 "gateway": "paymongo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paymtech
 "gateway": "paymtech"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayNearMe
 "gateway": "paynearme"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payneteasy
 "gateway": "payneteasy"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayNetWorx
 "gateway": "paynetworx"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayNext Inc
 "gateway": "paynext"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pay.nl
 "gateway": "paynl"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paynopain
 "gateway": "paynopain"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayOne
 "gateway": "payone"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayOnline
 "gateway": "payonline"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payonomy Limited
 "gateway": "asperato"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Payoo
 "gateway": "payoo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayPal Complete Payments
 "gateway": "paypalppcp"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pay Theory
 "gateway": "paytheory"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayPlus
 "gateway": "payplus"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayPlusLLC
 "gateway": "payplusllc"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayPro Pvt Ltd
 "gateway": "paypro"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Payrails
 "gateway": "payrails"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayRex
 "gateway": "payrexhq"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payrexx
 "gateway": "payrexx"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayRiff
 "gateway": "payriff"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payrix
 "gateway": "payrix"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paysafe
 "gateway": "paysafe"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payscout
 "gateway": "payscout"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paysend Business
 "gateway": "paysend"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paysoft
 "gateway": "paysoft"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paystack Payments Limited
 "gateway": "paystack"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pay360
 "gateway": "pay360"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayTabs
 "gateway": "paytabs"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

paytech
 "gateway": "paytechsolutions"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayTech Ukraine
 "gateway": "paytech"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payten Payment Gateway
 "gateway": "paytentr"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paythru
 "gateway": "paythru"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payture
 "gateway": "payture"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayU
 "gateway": "payu"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayU LATAM
 "gateway": "payulatam"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PAYUNi
 "gateway": "payuni"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayU Romania
 "gateway": "payuro"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PayU Russia
 "gateway": "payuru"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payway
 "gateway": "payway"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Paywiser
 "gateway": "paywiser"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Payzone Ireland
 "gateway": "payzoneireland"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PBT Gateway Services Ltd
 "gateway": "pbtgateway"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pelecard
 "gateway": "pelecard"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pensopay
 "gateway": "pensopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pifagorus Ltd
 "gateway": "pifagorusgate"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pikassa
 "gateway": "pikassa"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PingPong
 "gateway": "pingpongx"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pin Payments
 "gateway": "pinpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Planet
 "gateway": "cccpayment"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PlanetPay
 "gateway": "itcardpaymentservice"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Plategka.com
 "gateway": "plategkacom"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Platon
 "gateway": "platon"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Plexo
 "gateway": "plexouy"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Plexy
 "gateway": "plexy"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Pomelo
 "gateway": "pomelopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Portmone
 "gateway": "portmonecom"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PortPos
 "gateway": "portpos"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Powerpay
 "gateway": "powerpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Praxis
 "gateway": "praxistech"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Preczn
 "gateway": "preczn"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PrimePay
 "gateway": "primepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Primer
 "gateway": "primer"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Procard
 "gateway": "procard"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ProcessOut
 "gateway": "processout"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Przelewy24
 "gateway": "przelewy24"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PSCB
 "gateway": "pscbru"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PSiGate Inc.
 "gateway": "psigate"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

PXP Financial
 "gateway": "pxpfinancial"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Qenta Payment CEE
 "gateway": "qenta"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

QIWI
 "gateway": "qiwi"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

QNB
 "gateway": "qnbpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Qualpay
 "gateway": "qualpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

QuickPay
 "gateway": "quickpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Qvalent
 "gateway": "qvalent"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Radial
 "gateway": "radial"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Raiffeisen Processing Centre
 "gateway": "raiffeisenprocessingcentre"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

RapidCents
 "gateway": "rapidcentspay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Rapyd
 "gateway": "rapyd"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

RBK.money
 "gateway": "rbkmoney"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Rebail Capital
 "gateway": "rebailcapital"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Rebilly
 "gateway": "Rebilly"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Recurly
 "gateway": "recurly"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Reddot
 "gateway": "reddotpayment"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Rede
 "gateway": "rede"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Redsys
 "gateway": "redsys"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Reepay
 "gateway": "reepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Revenue Monster
 "gateway": "revenuemonster"
 "gatewayMerchantId": "YOUR_REVOLUT_ORDER_TOKEN"

Developer docs

Revolut
 "gateway": "revolut"
 "gatewayMerchantId": "YOUR_REVOLUT_ORDER_TOKEN"

Developer docs

RocketGate
 "gateway": "rocketgate"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

revPAY (Revenue Harvest)
 "gateway": "revpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Rootline
 "gateway": "rootline"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Russian Standard Bank
 "gateway": "rsb"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Ryft
 "gateway": "ryft"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

S.C. C SOLUTION S.R.L.
 "gateway": "plationline"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Safepay
 "gateway": "safepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Saferpay
 "gateway": "worldlinesaferpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Safexpay
 "gateway": "safexpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Sberbank
 "gateway": "sberbank"
 "gatewayMerchantId": "YOUR_ORGANIZATION_NAME"

Developer docs

SEB Baltic
 "gateway": "sebbaltic"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SEBES Technology
 "gateway": "sebes"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SecurePay
 "gateway": "securepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Sense Bank
 "gateway": "sensebank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SensePass
 "gateway": "sensepass"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Servicios Digitales Popular S.A.
 "gateway": "pagosazul"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Shift4
 "gateway": "shift4payments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Shiji Group
 "gateway": "shijipaymentsolutions"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SH Start High
 "gateway": "shstartpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

shvarenapay
"gateway":"shvarenapay"
"gatewayMerchantId":"YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SIBS Romania
 "gateway": "romcard"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

simbasoft
 "gateway": "simbasoft"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SimplePay Zrt
"gateway":"simplepay"
"gatewayMerchantId":"YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Sipay
 "gateway": "sipay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SmartPay
 "gateway": "smartpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Softbank Payment Service
 "gateway": "sbps"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Softtouch POS and Payments
 "gateway": "softtouch"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Sohar International
 "gateway": "soharinternational"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Sokin
 "gateway": "sokinpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Solid
 "gateway": "solid"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Sony Payment Services
 "gateway": "sonypaymentservices"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Splitit
 "gateway": "splitit"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Spreedly
 "gateway": "spreedly"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Square
 "gateway": "square"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SredaPay
 "gateway": "sredapay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SSLCOMMERZ
 "gateway": "sslcommerz"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Stancer
 "gateway": "stancer"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Stripe
 "gateway": "stripe"
 "stripe:version": "2018-10-31"
 "stripe:publishableKey": "YOUR_PUBLIC_STRIPE_KEY"

Developer docs

SUMIT
 "gateway": "sumit"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

SUNBAY
 "gateway": "sunbay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Suntech
 "gateway": "esafe"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Surfboard Payments
 "gateway": "surfboard"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Svea Bank
 "gateway": "svea"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Swedbank Baltic
 "gateway": "swedbankbaltic"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Swedbank Pay
 "gateway": "payexswedbankpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TabaPay
 "gateway": "tabapay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TapPay (Cherri Tech)
 "gateway": "tappay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TapPayments
 "gateway": "tappayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

tarlanpayments
 "gateway": "tarlanpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TAS Link
 "gateway": "taslink"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Tatra banka (CardPay)
 "gateway": "tatrabanka"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Technology Partnership PGS
 "gateway": "technologypartnership"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TEKO
 "gateway": "teko"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Telepay
 "gateway": "telerompay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Telr
 "gateway": "telr"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

theMAP
 "gateway": "themap"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Till Payments
 "gateway": "tillpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Tilopay
 "gateway": "tilopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Time Project LLC
 "gateway": "timeproject"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Tinkoff
 "gateway": "tinkoff"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TIPTOP PAY
 "gateway": "tiptoppay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

TORA
 "gateway": "tora"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TotalPay
 "gateway": "totalpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TPay
 "gateway": "tpaycom"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TPay.com
 "gateway": "tpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Transact Campus
 "gateway": "transactcampus"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Transact Pro
 "gateway": "transactpro"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Transactworld CY
 "gateway": "TransactworldCY"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Transaction Services Network
 "gateway": "tns"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Transpayrent
 "gateway": "transpayrent"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Tranzila
 "gateway": "tranzila"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Tranzzo
 "gateway": "tranzzo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Tribe Payments
 "gateway": "tribepayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Truevo
 "gateway": "truevo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TrustPay
 "gateway": "trustpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Trust Payments
 "gateway": "trustpayments"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Tuna
 "gateway": "tuna"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

TWPAYZ
 "gateway": "transactworlduk"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Tyler Technologies
 "gateway": "tylertech"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

2can&ibox
 "gateway": "twocan"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

UAPAY
 "gateway": "uapay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

UBRR
 "gateway": "ubrrpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Ukrcardpay
 "gateway": "ukrcardpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

UkrGasBank Pay
 "gateway": "ukrgasbankpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Unibank OJSC
 "gateway": "unibankcheckout"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Unipaas payments technologies
 "gateway": "unipaas"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

unitedfinancialcorporation
 "gateway": "unitedfinancialcorporation"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Uniteller
 "gateway": "uniteller"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Unitpay
 "gateway": "unitpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Unlimint
 "gateway": "unlimint"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Unzer
 "gateway": "unzer"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Unzer Austria
 "gateway": "unzeraustria"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

UPC
 "gateway": "upc"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Upgate
 "gateway": "upgate"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

USAePay
 "gateway": "usaepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

UseePay
 "gateway": "useepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

USIO, Inc.
 "gateway": "usio"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Valitor
 "gateway": "valitor"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

value.io
 "gateway": "inspirecommerce"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Vanco
 "gateway": "vanco"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

VantagePay
 "gateway": "vantagepay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Vantiv
 "gateway": "vantiv"
 "vantiv:merchantPayPageId": "YOUR_PAY_PAGE_ID"
 "vantiv:merchantOrderId": "YOUR_ORDER_ID"
 "vantiv:merchantTransactionId": "YOUR_TRANSACTION_ID"
 "vantiv:merchantReportGroup": "*web"

Developer docs

Vayapay
 "gateway": "vayapay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Vendo
 "gateway": "vendoservices"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Verestro
 "gateway": "verestro"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Verifone Payments BV
 "gateway": "twocheckoutpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Very Good Security
 "gateway": "verygoodsecurity"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Vesta
 "gateway": "vesta"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Victoriabank
 "gateway": "victoriabank"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Vindicia
 "gateway": "vindicia"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Vinr
 "gateway": "vinrpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Viva Wallet
 "gateway": "vivawallet"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

VTEX
 "gateway": "vtex"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

W-HA
 "gateway": "wha"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Waffo
 "gateway": "waffo"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Wallee
 "gateway": "wallee"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Walletdoc
 "gateway": "walletdoc"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Walletto
 "gateway": "walletto"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

WayForPay
 "gateway": "wayforpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

WEAT
 "gateway": "weatpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

WhenThen
 "gateway": "whenthen"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Whitegate
 "gateway": "Whitegate"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

WHITELARK LTD
 "gateway": "whitelark"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Windcave
 "gateway": "windcave"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Wirebank
"gateway":"wirebank"
"gatewayMerchantId":"YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Wirecard
"gateway":"wirecard"
"gatewayMerchantId":"YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Wondergate
 "gateway": "wondergate"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

WOOPPAY
 "gateway": "wooppay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

WooshPay
 "gateway": "swooshtransfer"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Worldline (GlobalCollect)
 "gateway": "globalcollect"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Worldline - Ingenico (WL Online Checkout)
 "gateway": "worldlineingenicoogone"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Worldline Nordics (Worldline Online Checkout)
 "gateway": "worldlineonlinecheckout"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Worldline Sips
 "gateway": "wlsips"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Worldnet
 "gateway": "worldnet"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Worldpay
 "gateway": "worldpay"
 "gatewayMerchantId": "YOUR_WORLDPAY_MERCHANT_ID"

Developer docs

Wpay
 "gateway": "wpayaus"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

WSPay
 "gateway": "wspay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Xendit
 "gateway": "xendit"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

xMoney
 "gateway": "xmoneypay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

XPATE
 "gateway": "xpate"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

xpay
 "gateway": "xpaycomua"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

XPay by PostEx
 "gateway": "xpaybypostex"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

YabandPay B.V.
 "gateway": "yabandpay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Yapstone
 "gateway": "yapstone"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

YIĞIM Payment System
 "gateway": "yigim"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

ЮKassa (YooKassa)
 "gateway": "yoomoney"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Yuno
 "gateway": "yuno"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Z-credit
 "gateway": "zcredit"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Zalopay
 "gateway": "zalopay"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

ZEN.com
 "gateway": "zen"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Zest
 "gateway": "zestpayment"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

Zift
 "gateway": "zift"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

No developer docs available

Zuora
 "gateway": "zuora"
 "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID"

Developer docs

The PAYMENT_GATEWAY tokenization type is the most common merchant implementation of the card payment method in the Google Pay API. If your payment provider isn't supported, you might be able to accept Google Pay by a DIRECT integration. For more information, see the Direct tokenization documentation.

Define supported payment card networks

Define the card networks that your application accepts.

Kotlin

privatevalallowedCardNetworks=JSONArray(listOf(
"AMEX",
"DISCOVER",
"INTERAC",
"JCB",
"MASTERCARD",
"VISA"))

Java

privatestaticJSONArraygetAllowedCardNetworks(){
returnnewJSONArray()
.put("AMEX")
.put("DISCOVER")
.put("INTERAC")
.put("JCB")
.put("MASTERCARD")
.put("VISA");
}

The Google Pay API might return cards on file from your account (PAN_ONLY) or a device token on an Android-powered device authenticated with a 3-D Secure cryptogram (CRYPTOGRAM_3DS). You can configure the API to return the methods that your application supports.

Before you set allowedCardAuthMethods, confirm with your payment processor and acquirer on whether device tokens (CRYPTOGRAM_3DS) are supported in your region.

Kotlin

privatevalallowedCardAuthMethods=JSONArray(listOf(
"PAN_ONLY",
"CRYPTOGRAM_3DS"))

Java

privatestaticJSONArraygetAllowedCardAuthMethods(){
returnnewJSONArray()
.put("PAN_ONLY")
.put("CRYPTOGRAM_3DS");
}

For more information, see the reference documentation for the CardParameters object. For Android device tokens support, check with your gateway or processor for the card networks supported.

Describe your allowed payment methods

In order to describe your application's support for the CARD payment method, combine your supported authentication methods and card networks.

Kotlin

privatefunbaseCardPaymentMethod():JSONObject=
JSONObject()
.put("type","CARD")
.put("parameters",JSONObject()
.put("allowedAuthMethods",allowedCardAuthMethods)
.put("allowedCardNetworks",allowedCardNetworks)
.put("billingAddressRequired",true)
.put("billingAddressParameters",JSONObject()
.put("format","FULL")
)
)

Java

privatestaticJSONObjectgetBaseCardPaymentMethod()throwsJSONException{
returnnewJSONObject()
.put("type","CARD")
.put("parameters",newJSONObject()
.put("allowedAuthMethods",getAllowedCardAuthMethods())
.put("allowedCardNetworks",getAllowedCardNetworks())
.put("billingAddressRequired",true)
.put("billingAddressParameters",newJSONObject()
.put("format","FULL")
)
);
}

Extend your configuration with information about how to tokenize the payment method.

Kotlin

privatevalcardPaymentMethod:JSONObject=baseCardPaymentMethod()
.put("tokenizationSpecification",gatewayTokenizationSpecification)

Java

privatestaticJSONObjectgetCardPaymentMethod()throwsJSONException{
returngetBaseCardPaymentMethod()
.put("tokenizationSpecification",getGatewayTokenizationSpecification());
}

For more information, see the reference documentation for the CardParameters object.

Step 2: Create a PaymentsClient instance

Create a PaymentsClient instance to interact with the Google Pay API.

Kotlin

funcreatePaymentsClient(context:Context):PaymentsClient{
valwalletOptions=Wallet.WalletOptions.Builder()
.setEnvironment(Constants.PAYMENTS_ENVIRONMENT)
.build()
returnWallet.getPaymentsClient(context,walletOptions)
}

Java

publicstaticPaymentsClientcreatePaymentsClient(Contextcontext){
Wallet.WalletOptionswalletOptions=
newWallet.WalletOptions.Builder().setEnvironment(Constants.PAYMENTS_ENVIRONMENT).build();
returnWallet.getPaymentsClient(context,walletOptions);
}

Step 3: Determine readiness to pay with the Google Pay API

Add your allowed payment methods to your base request object with the following code snippet:

Kotlin

funisReadyToPayRequest():JSONObject? =
try{
baseRequest
.put("allowedPaymentMethods",JSONArray().put(baseCardPaymentMethod()))
}catch(e:JSONException){
null
}

Java

publicstaticJSONObjectgetIsReadyToPayRequest(){
try{
returngetBaseRequest()
.put("allowedPaymentMethods",newJSONArray().put(getBaseCardPaymentMethod()));
}catch(JSONExceptione){
returnnull;
}
}

Before you display the Google Pay button, call the isReadyToPay API to determine if the user can make payments with the Google Pay API. For a full list of configuration properties, see the IsReadyToPayRequest JSON object documentation.

Kotlin

privatefunpossiblyShowGooglePayButton(){
valisReadyToPayJson=PaymentsUtil.isReadyToPayRequest()?:return
valrequest=IsReadyToPayRequest.fromJson(isReadyToPayJson.toString())?:return
// The call to isReadyToPay is asynchronous and returns a Task. We need to provide an
// OnCompleteListener to be triggered when the result of the call is known.
valtask=paymentsClient.isReadyToPay(request)
task.addOnCompleteListener{completedTask->
try{
completedTask.getResult(ApiException::class.java)?.let(::setGooglePayAvailable)
}catch(exception:ApiException){
// Process error
Log.w("isReadyToPay failed",exception)
}
}
}

Kotlin
(coroutines)

privatesuspendfunfetchCanUseGooglePay():Boolean{
valrequest=IsReadyToPayRequest.fromJson(PaymentsUtil.isReadyToPayRequest().toString())
returnpaymentsClient.isReadyToPay(request).await()
}

Java

privatevoidpossiblyShowGooglePayButton(){
finalOptional<JSONObject>isReadyToPayJson=PaymentsUtil.getIsReadyToPayRequest();
if(!isReadyToPayJson.isPresent()){
return;
}
// The call to isReadyToPay is asynchronous and returns a Task. We need to provide an
// OnCompleteListener to be triggered when the result of the call is known.
IsReadyToPayRequestrequest=IsReadyToPayRequest.fromJson(isReadyToPayJson.get().toString());
Task<Boolean>task=paymentsClient.isReadyToPay(request);
task.addOnCompleteListener(this,
newOnCompleteListener<Boolean>(){
@Override
publicvoidonComplete(@NonNullTask<Boolean>task){
if(task.isSuccessful()){
setGooglePayAvailable(task.getResult());
}else{
Log.w("isReadyToPay failed",task.getException());
}
}
});
}

Step 4: Add a Google Pay payment button

Add a Google Pay payment button to your app to encourage shoppers to check out with payment methods that are supported by the Google Pay API and your app.

For more information about available button types, colors, and display requirements, see the ButtonOptions reference.

Add the PayButton layout to your application's checkout layout:

Kotlin
(Compose)

PayButton(
modifier=Modifier
.testTag("payButton")
.fillMaxWidth(),
onClick=onGooglePayButtonClick,
allowedPaymentMethods=PaymentsUtil.allowedPaymentMethods.toString()

XML

<com.google.android.gms.wallet.button.PayButton
android:id="@+id/googlePayButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="20dp"/>

If you are adding the Google Pay button using XML...

Go to the Android activity and initialize the Google Pay button alongside other UI elements:

Kotlin

overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
// Use view binding to access the UI elements
layout=ActivityCheckoutBinding.inflate(layoutInflater)
setContentView(layout.root)
// Setup buttons
googlePayButton=layout.googlePayButton
googlePayButton.initialize(
ButtonOptions.newBuilder()
.setAllowedPaymentMethods(PaymentsUtil.allowedPaymentMethods.toString()).build()
)
googlePayButton.setOnClickListener{requestPayment()}
// Check Google Pay availability
model.canUseGooglePay.observe(this,Observer(::setGooglePayAvailable))
}

Java

privatevoidinitializeUi(){
// Use view binding to access the UI elements
ActivityCheckoutBindinglayoutBinding=ActivityCheckoutBinding.inflate(getLayoutInflater());
setContentView(layoutBinding.getRoot());
// The Google Pay button is a layout file – take the root view
googlePayButton=layoutBinding.googlePayButton;
try{
googlePayButton.initialize(
ButtonOptions.newBuilder()
.setAllowedPaymentMethods(PaymentsUtil.getAllowedPaymentMethods().toString()).build()
);
googlePayButton.setOnClickListener(this::requestPayment);
}catch(JSONExceptione){
// Keep Google Pay button hidden (consider logging this to your app analytics service)
}
}

Step 5: Create a PaymentDataRequest object

A PaymentDataRequest JSON object describes the information that you request from a payer in a Google Pay payment sheet. This includes information about the transaction price and the status of the provided price. For more information, see TransactionInfo JSON object documentation.

The following blocks add information about the merchant and the transaction to the PaymentDataRequest object needed to start the payment process with Google Pay.

Kotlin

privatefungetTransactionInfo(price:String):JSONObject=
JSONObject()
.put("totalPrice",price)
.put("totalPriceStatus","FINAL")
.put("countryCode",Constants.COUNTRY_CODE)
.put("currencyCode",Constants.CURRENCY_CODE)

Java

privatestaticJSONObjectgetTransactionInfo(Stringprice)throwsJSONException{
returnnewJSONObject()
.put("totalPrice",price)
.put("totalPriceStatus","FINAL")
.put("countryCode",Constants.COUNTRY_CODE)
.put("currencyCode",Constants.CURRENCY_CODE)
.put("checkoutOption","COMPLETE_IMMEDIATE_PURCHASE");
}

Kotlin

privatevalmerchantInfo:JSONObject=
JSONObject().put("merchantName","Example Merchant")

Java

privatestaticJSONObjectgetMerchantInfo()throwsJSONException{
returnnewJSONObject().put("merchantName","Example Merchant");
}

Assign your base request object to a new PaymentDataRequest JSON object. Then, add the payment methods supported by your application, such as any configuration of additional data expected in the response. Finally, add information about the transaction and the merchant who makes the request:

Kotlin

fungetPaymentDataRequest(priceLabel:String):JSONObject=
baseRequest
.put("allowedPaymentMethods",allowedPaymentMethods)
.put("transactionInfo",getTransactionInfo(priceLabel))
.put("merchantInfo",merchantInfo)
.put("shippingAddressRequired",true)
.put("shippingAddressParameters",JSONObject()
.put("phoneNumberRequired",false)
.put("allowedCountryCodes",JSONArray(listOf("US","GB")))
)

Java

publicstaticJSONObjectgetPaymentDataRequest(StringpriceLabel){
try{
returnPaymentsUtil.getBaseRequest()
.put("allowedPaymentMethods",getAllowedPaymentMethods())
.put("transactionInfo",getTransactionInfo(priceLabel))
.put("merchantInfo",getMerchantInfo())
.put("shippingAddressRequired",true)
.put("shippingAddressParameters",newJSONObject()
.put("phoneNumberRequired",false)
.put("allowedCountryCodes",newJSONArray(Constants.SHIPPING_SUPPORTED_COUNTRIES))
);
}catch(JSONExceptione){
returnnull;
}
}

The PaymentDataRequest object is a Parcelable that represents a payment data request. The PaymentDataRequest provides information that's necessary in order to support a payment.

For more information, see the PaymentDataRequest JSON object documentation.

Step 6: Initiate the payment process with Google Pay

To start the payment process, call the loadPaymentData request using the PaymentsClient object. This call returns a Task object with the result of the operation.

First, create the loadPaymentData task, using the request created in the previous step:

Kotlin

fungetLoadPaymentDataTask(priceLabel:String):Task<PaymentData>{
valpaymentDataRequestJson=PaymentsUtil.getPaymentDataRequest(priceLabel)
valrequest=PaymentDataRequest.fromJson(paymentDataRequestJson.toString())
returnpaymentsClient.loadPaymentData(request)
}

Java

publicTask<PaymentData>getLoadPaymentDataTask(StringpriceLabel){
JSONObjectpaymentDataRequestJson=PaymentsUtil.getPaymentDataRequest(priceLabel);
if(paymentDataRequestJson==null){
returnnull;
}
PaymentDataRequestrequest=
PaymentDataRequest.fromJson(paymentDataRequestJson.toString());
returnpaymentsClient.loadPaymentData(request);
}

To process the result, use one of the activity result contracts in the API. This example uses GetPaymentDataResult which yields an object with information about the operation in addition to the result itself:

Kotlin

privatevalpaymentDataLauncher=registerForActivityResult(GetPaymentDataResult()){taskResult->
when(taskResult.status.statusCode){
CommonStatusCodes.SUCCESS->{
taskResult.result!!.let{
Log.i("Google Pay result:",it.toJson())
model.setPaymentData(it)
}
}
//CommonStatusCodes.CANCELED -> The user canceled
//CommonStatusCodes.DEVELOPER_ERROR -> The API returned an error (it.status: Status)
//else -> Handle internal and other unexpected errors
}
}

Java

privatefinalActivityResultLauncher<Task<PaymentData>>paymentDataLauncher=
registerForActivityResult(newGetPaymentDataResult(),result->{
intstatusCode=result.getStatus().getStatusCode();
switch(statusCode){
caseCommonStatusCodes.SUCCESS:
handlePaymentSuccess(result.getResult());
break;
//case CommonStatusCodes.CANCELED: The user canceled
caseCommonStatusCodes.DEVELOPER_ERROR:
handleError(statusCode,result.getStatus().getStatusMessage());
break;
default:
handleError(statusCode,"Unexpected non API"+
" exception when trying to deliver the task result to an activity!");
break;
}
});

Before presenting the user with a confirmation of their purchase, extract the payment token from the PaymentData result object, and use this token to create the payment transaction with your gateway.

For more information about the result object, see the PaymentData JSON object reference.

Now, use the activity result launcher and the task to show the Google Pay payment selector:

Kotlin

privatefunrequestPayment(){
valtask=model.getLoadPaymentDataTask(priceLabel="50.2")
task.addOnCompleteListener(paymentDataLauncher::launch)
}

Kotlin
(coroutines)

privatefunrequestPayment(){
lifecycleScope.launch{
valtask=model.getLoadPaymentDataTask(priceLabel="50.2")
paymentDataLauncher.launch(task.awaitTask())
}
}

Java

publicvoidrequestPayment(Viewview){
// The price provided to the API should include taxes and shipping.
finalTask<PaymentData>task=model.getLoadPaymentDataTask("50.2");
task.addOnCompleteListener(paymentDataLauncher::launch);
}

Step 7: Enable Callbacks using Dynamic Price Updates

First, update your PaymentDataRequest object to enable callbacks.

Kotlin

fungetPaymentDataRequest(price:String):JSONObject{
returngetBaseRequest()
.put("allowedPaymentMethods",getAllowedPaymentMethods())
.put("transactionInfo",getTransactionInfo(price))
.put("merchantInfo",JSONObject().put("merchantName",Constants.MERCHANT_NAME))
.put("shippingAddressRequired",true)
.put("shippingOptionRequired",true)
.put("shippingOptionParameters",getShippingOptionParameters())
.put(
"shippingAddressParameters",
JSONObject()
.put("phoneNumberRequired",false)
.put("allowedCountryCodes",JSONArray(Constants.SHIPPING_SUPPORTED_COUNTRIES))
)
.put(
"callbackIntents",
JSONArray()
.put("PAYMENT_AUTHORIZATION")
.put("SHIPPING_ADDRESS")
.put("SHIPPING_OPTION")
)
}

Java

publicstaticJSONObjectgetPaymentDataRequest(StringpriceLabel)throwsJSONException{
returngetBaseRequest()
.put("allowedPaymentMethods",getAllowedPaymentMethods())
.put("transactionInfo",getTransactionInfo(priceLabel))
.put("merchantInfo",newJSONObject().put("merchantName",Constants.MERCHANT_NAME))
.put("shippingAddressRequired",true)
.put("shippingOptionRequired",true)
.put("shippingOptionParameters",getShippingOptionParameters())
.put(
"shippingAddressParameters",
newJSONObject()
.put("phoneNumberRequired",false)
.put("allowedCountryCodes",newJSONArray(Constants.SHIPPING_SUPPORTED_COUNTRIES)))
.put(
"callbackIntents",
newJSONArray()
.put("PAYMENT_AUTHORIZATION")
.put("SHIPPING_ADDRESS")
.put("SHIPPING_OPTION"));
}

Next, implement MerchantPaymentDataCallbacks and MerchantPaymentDataCallbacksService logic by extending BasePaymentDataCallbacks and BasePaymentDataCallbacksService, respectively, to handle callback events.

MerchantPaymentDataCallbacks

Kotlin

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.activity
importandroid.os.Bundle
importandroid.util.Log
importcom.google.android.gms.samples.pay.Constants
importcom.google.android.gms.samples.pay.util.PaymentsUtil
importcom.google.android.gms.wallet.PaymentData
importcom.google.android.gms.wallet.callback.BasePaymentDataCallbacks
importcom.google.android.gms.wallet.callback.IntermediatePaymentData
importcom.google.android.gms.wallet.callback.OnCompleteListener
importcom.google.android.gms.wallet.callback.PaymentAuthorizationResult
importcom.google.android.gms.wallet.callback.PaymentDataRequestUpdate
importorg.json.JSONException
importorg.json.JSONObject
/**
 * Implementation of [BasePaymentDataCallbacks] that handles callbacks from the Google Pay
 * payment sheet.
 */
classMerchantPaymentDataCallbacks:BasePaymentDataCallbacks(){
/**
 * onPaymentDataChanged callback - Handles payment data changes in the payment sheet such as
 * shipping address and shipping options.
 */
overridefunonPaymentDataChanged(
request:IntermediatePaymentData?,
onCompleteListener:OnCompleteListener<PaymentDataRequestUpdate>,
){
valnewSavedState=Bundle()
try{
valintermediatePaymentDataJson=JSONObject(request?.toJson()?:"{}")
valpaymentDataRequestUpdateJson=PaymentsUtil.getPaymentDataRequestUpdate(
intermediatePaymentDataJson,
Constants.BASE_PRICE,
)
newSavedState.putString("paymentDataRequestUpdate",paymentDataRequestUpdateJson.toString())
// return the generated data to the client
onCompleteListener.complete(
PaymentDataRequestUpdate.fromJson(paymentDataRequestUpdateJson.toString())
.withUpdatedSavedState(newSavedState),
)
}catch(e:Exception){
Log.e("MerchantPaymentDataCallbacks","onPaymentDataChanged failed",e)
}
}
/**
 * onPaymentAuthorized callback - Called when a payment is authorized in the payment sheet.
 */
overridefunonPaymentAuthorized(
request:PaymentData?,
onCompleteListener:OnCompleteListener<PaymentAuthorizationResult>,
){
Log.i("Invocation","onPaymentAuthorized invoked")
valsavedState=Bundle()
valpaymentAuthorizationResultJson=JSONObject()
try{
valpaymentDataJson=JSONObject(request?.toJson()?:"{}")
valinfo=paymentDataJson.getJSONObject("paymentMethodData").getJSONObject("info")
// example of how to check for a card network
valcardNetwork=info.getString("cardNetwork")
if(cardNetwork=="VISA"){
paymentAuthorizationResultJson.put("transactionState","SUCCESS")
}else{
paymentAuthorizationResultJson.put("transactionState","ERROR")
valerror=JSONObject().apply{
put("reason","PAYMENT_DATA_INVALID")
put("message","Only Visa is accepted!")
put("intent","PAYMENT_AUTHORIZATION")
}
paymentAuthorizationResultJson.put("error",error)
}
onCompleteListener.complete(
PaymentAuthorizationResult.fromJson(paymentAuthorizationResultJson.toString())
.withUpdatedSavedState(savedState),
)
}catch(e:Exception){
Log.e("MerchantPaymentDataCallbacks","onPaymentAuthorized failed",e)
}
}
}

Java

/*
 * Copyright 2020 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.activity;
importandroid.os.Bundle;
importandroid.util.Log;
importandroidx.annotation.NonNull;
importcom.google.android.gms.samples.pay.Constants;
importcom.google.android.gms.samples.pay.util.PaymentsUtil;
importcom.google.android.gms.wallet.PaymentData;
importcom.google.android.gms.wallet.callback.BasePaymentDataCallbacks;
importcom.google.android.gms.wallet.callback.IntermediatePaymentData;
importcom.google.android.gms.wallet.callback.OnCompleteListener;
importcom.google.android.gms.wallet.callback.PaymentAuthorizationResult;
importcom.google.android.gms.wallet.callback.PaymentDataRequestUpdate;
importjava.util.Objects;
importorg.json.JSONException;
importorg.json.JSONObject;
/**
 * Implementation of {@link BasePaymentDataCallbacks} that handles callbacks from the Google Pay
 * payment sheet.
 */
publicclass MerchantPaymentDataCallbacksextendsBasePaymentDataCallbacks{
/**
 * Handles payment data changes in the payment sheet such as shipping address and shipping
 * options. Values passed back to it will update the payment sheet.
 *
 * @param request The updated payment data from the payment sheet.
 * @param onCompleteListener The listener to call when the update is complete.
 */
@Override
publicvoidonPaymentDataChanged(
IntermediatePaymentDatarequest,
@NonNullOnCompleteListener<PaymentDataRequestUpdate>onCompleteListener){
// define prices and variables
JSONObjectpaymentDataRequestUpdate;
BundlenewSavedState=newBundle();
try{
assertrequest!=null;
JSONObjectintermediatePaymentData=newJSONObject(request.toJson());
// define transaction info
paymentDataRequestUpdate=
PaymentsUtil.getPaymentDataRequestUpdate(intermediatePaymentData,Constants.BASE_PRICE);
newSavedState.putString("paymentDataRequestUpdate",paymentDataRequestUpdate.toString());
// return the generated data to the client
onCompleteListener.complete(
PaymentDataRequestUpdate.fromJson(paymentDataRequestUpdate.toString())
.withUpdatedSavedState(newSavedState));
}catch(JSONExceptione){
Log.e("SampleMerchantPaymentDataCallbacksService",e.getMessage(),e);
thrownewRuntimeException(e);
}
}
/**
 * Called when a payment is authorized in the payment sheet. Use this callback to perform any
 * final validation on the payment data. Throwing an error will allow the user to make
 * corrections to the payment sheet.
 *
 * @param request The payment data from the payment sheet.
 * @param onCompleteListener The listener to call when the authorization is complete.
 */
@Override
publicvoidonPaymentAuthorized(
PaymentDatarequest,
@NonNullOnCompleteListener<PaymentAuthorizationResult>onCompleteListener){
Log.i("Invocation","onPaymentAuthorized invoked");
BundlesavedState=newBundle();
JSONObjectpaymentAuthorizationResultJson=newJSONObject();
try{
assertrequest!=null;
JSONObjectpaymentDataJson=newJSONObject(request.toJson());
JSONObjectinfo=paymentDataJson.getJSONObject("paymentMethodData").getJSONObject("info");
// example of how to check for a card network
StringcardNetwork=info.getString("cardNetwork");
if(cardNetwork.equals("VISA")){
paymentAuthorizationResultJson.put("transactionState","SUCCESS");
}else{
paymentAuthorizationResultJson.put("transactionState","ERROR");
JSONObjecterror=
newJSONObject()
.put("reason","PAYMENT_DATA_INVALID")
.put("message","Only Visa is accepted!")
.put("intent","PAYMENT_AUTHORIZATION");
paymentAuthorizationResultJson.put("error",error);
}
onCompleteListener.complete(
PaymentAuthorizationResult.fromJson(paymentAuthorizationResultJson.toString())
.withUpdatedSavedState(savedState));
}catch(JSONExceptione){
Log.e("SampleMerchantPaymentDataCallbacksService",Objects.requireNonNull(e.getMessage()));
thrownewRuntimeException(e);
}
}
}

MerchantPaymentDataCallbacksService

Kotlin

packagecom.google.android.gms.samples.pay.service
importcom.google.android.gms.wallet.callback.BasePaymentDataCallbacks
importcom.google.android.gms.samples.pay.activity.MerchantPaymentDataCallbacks
importcom.google.android.gms.wallet.callback.BasePaymentDataCallbacksService
/**
 * Service class which hosts the payment data callbacks initiated by Google Play services
 * within a {@link PaymentsClient#loadPaymentData(PaymentDataRequest)}.
 *
 * <p>The callbacks are implemented through MerchantPaymentDataCallbacks returned from {@link #createPaymentDataCallbacks()}.
 */
classMerchantPaymentDataCallbacksService:BasePaymentDataCallbacksService(){
overridefuncreatePaymentDataCallbacks():BasePaymentDataCallbacks{
returnMerchantPaymentDataCallbacks()
}
}

Java

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.service;
importandroidx.annotation.NonNull;
importcom.google.android.gms.samples.pay.activity.MerchantPaymentDataCallbacks;
importcom.google.android.gms.wallet.callback.BasePaymentDataCallbacks;
importcom.google.android.gms.wallet.callback.BasePaymentDataCallbacksService;
/**
 * Service class which hosts the payment data callbacks initiated by Google Play services within a
 * {@link
 * com.google.android.gms.wallet.PaymentsClient#loadPaymentData(com.google.android.gms.wallet.PaymentDataRequest)}.
 *
 * <p>The callbacks are implemented through MerchantPaymentDataCallbacks returned from {@link
 * #createPaymentDataCallbacks()}.
 */
publicclass MerchantPaymentDataCallbacksServiceextendsBasePaymentDataCallbacksService{
@NonNull
@Override
protectedBasePaymentDataCallbackscreatePaymentDataCallbacks(){
returnnewMerchantPaymentDataCallbacks();
}
}

Finally, update your AndroidManifest.xml file to specify com.google.android.gms.permission.BIND_PAYMENTS_CALLBACK_SERVICE as its permission and include an intent filter with the action name com.google.android.gms.wallet.callback.PAYMENT_DATA_CALLBACKS.

Kotlin

<service
android:name="com.google.android.gms.samples.pay.service.MerchantPaymentDataCallbacksService"
android:permission="com.google.android.gms.permission.BIND_PAYMENTS_CALLBACK_SERVICE"
android:enabled="true"
android:exported="true">
<intent-filter>
<actionandroid:name="com.google.android.gms.wallet.callback.PAYMENT_DATA_CALLBACKS"/>
</intent-filter>
</service>

Java

<service
android:name="com.google.android.gms.samples.pay.service.MerchantPaymentDataCallbacksService"
android:enabled="true"
android:exported="true"
android:permission="com.google.android.gms.permission.BIND_PAYMENTS_CALLBACK_SERVICE">
<intent-filter>
<actionandroid:name="com.google.android.gms.wallet.callback.PAYMENT_DATA_CALLBACKS"/>
</intent-filter>
</service>

Put it all together

The following snippet shows a complete example for a properly configured project. For the project-level setup steps, see Configure your project.

Kotlin

Activity

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.activity
importandroid.os.Bundle
importandroid.util.Log
importandroidx.activity.ComponentActivity
importandroidx.activity.compose.setContent
importandroidx.activity.viewModels
importandroidx.compose.runtime.getValue
importandroidx.lifecycle.compose.collectAsStateWithLifecycle
importcom.google.android.gms.common.api.CommonStatusCodes
importcom.google.android.gms.samples.pay.Constants
importcom.google.android.gms.samples.pay.R
importcom.google.android.gms.samples.pay.ui.ProductScreen
importcom.google.android.gms.samples.pay.viewmodel.CheckoutViewModel
importcom.google.android.gms.samples.pay.viewmodel.PaymentUiState
importcom.google.android.gms.tasks.Task
importcom.google.android.gms.wallet.PaymentData
importcom.google.android.gms.wallet.contract.TaskResultContracts.GetPaymentDataResult
classCheckoutActivity:ComponentActivity(){
privatevalmodel:CheckoutViewModelbyviewModels()
privatevalpaymentDataLauncher=registerForActivityResult(GetPaymentDataResult()){taskResult->
when(taskResult.status.statusCode){
CommonStatusCodes.SUCCESS->{
taskResult.result?.let{
Log.i("Google Pay result:",it.toJson())
model.setPaymentData(it)
}
}
CommonStatusCodes.CANCELED->{
// The user canceled the payment attempt
Log.i("Google Pay result:","Payment canceled by user")
}
else->{
// Handle internal and other unexpected errors
Log.w("Google Pay result:","Payment failed. Status: ${taskResult.status}")
}
}
}
overridefunonCreate(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContent{
valpayState:PaymentUiStatebymodel.paymentUiState.collectAsStateWithLifecycle()
ProductScreen(
title="Men's Tech Shell Full-Zip",
description="A versatile full-zip that you can wear all day long and even...",
price="$${Constants.BASE_PRICE}",
image=R.drawable.ts_10_11019a,
payUiState=payState,
onGooglePayButtonClick=this::requestPayment,
)
}
}
privatefunrequestPayment(){
valtask=model.getLoadPaymentDataTask(Constants.BASE_PRICE)
task.addOnCompleteListener(paymentDataLauncher::launch)
}
}

Util

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.util
importandroid.content.Context
importcom.google.android.gms.samples.pay.Constants
importcom.google.android.gms.wallet.PaymentsClient
importcom.google.android.gms.wallet.Wallet
importjava.math.BigDecimal
importjava.util.Locale
importorg.json.JSONArray
importorg.json.JSONException
importorg.json.JSONObject
/**
 * Contains helper static methods for dealing with the Payments API.
 *
 * Many of the parameters used in the code are optional and are set here merely to call out their
 * existence. Please consult the documentation to learn more and feel free to remove ones not
 * relevant to your implementation.
 */
objectPaymentsUtil{
/**
 * Encapsulated shipping option parameters (set of options) definition.
 *
 * @return A [JSONObject] containing shipping options and the default selected option.
 * @throws JSONException If the JSON object is malformed.
 */
@Throws(JSONException::class)
fungetShippingOptionParameters():JSONObject{
valshippingOptionParameters=JSONObject()
valshippingOptions=JSONArray()
shippingOptions.put(
createShippingOption(
"shipping-001","$0.00: Free shipping label","Free Shipping example text"
)
)
shippingOptions.put(
createShippingOption(
"shipping-002","$1.99: Standard shipping label","Standard shipping example text."
)
)
shippingOptions.put(
createShippingOption(
"shipping-003","$1000: Express shipping label","Express shipping example text."
)
)
shippingOptions.put(
createShippingOption(
"shipping-004","$2000: Same-day shipping label","Same-day shipping example text."
)
)
shippingOptionParameters.put("shippingOptions",shippingOptions)
shippingOptionParameters.put("defaultSelectedOptionId","shipping-001")
returnshippingOptionParameters
}
/**
 * Defines an encapsulated shipping option.
 *
 * @param id The unique identifier for the shipping option.
 * @param label The label to display for the shipping option.
 * @param description A brief description of the shipping option.
 * @return A [JSONObject] representing the shipping option.
 * @throws JSONException If the JSON object is malformed.
 */
@Throws(JSONException::class)
privatefuncreateShippingOption(id:String,label:String,description:String):JSONObject{
returnJSONObject().put("id",id).put("label",label).put("description",description)
}
/**
 * Encapsulated definition for a display item.
 *
 * @param label The label to display for the item.
 * @param type The type of the display item (e.g., LINE_ITEM, SUBTOTAL).
 * @param price The price of the item.
 * @return A [JSONObject] representing the display item.
 * @throws JSONException If the JSON object is malformed.
 */
@Throws(JSONException::class)
funcreateDisplayItem(label:String,type:String,price:String):JSONObject{
returnJSONObject().put("label",label).put("type",type).put("price",price)
}
/**
 * Create a Google Pay API base request object with properties used in all requests.
 *
 * @return Google Pay API base request object.
 * @throws JSONException if the object is malformed.
 */
@Throws(JSONException::class)
privatefungetBaseRequest():JSONObject{
returnJSONObject().put("apiVersion",2).put("apiVersionMinor",0)
}
/**
 * Creates an instance of [PaymentsClient] for use in an [Context] using the
 * environment and theme set in [Constants].
 *
 * @param context is the caller's context.
 * @return An instance of [PaymentsClient].
 */
funcreatePaymentsClient(context:Context):PaymentsClient{
valwalletOptions=Wallet.WalletOptions.Builder()
.setEnvironment(Constants.PAYMENTS_ENVIRONMENT)
.build()
returnWallet.getPaymentsClient(context,walletOptions)
}
/**
 * Gateway Integration: Identify your gateway and your app's gateway merchant identifier.
 *
 * The Google Pay API response will return an encrypted payment method capable of being charged
 * by a supported gateway after payer authorization.
 *
 * TODO: Check with your gateway on the parameters to pass and modify them in Constants.java.
 *
 * @return Payment data tokenization for the CARD payment method.
 * @throws JSONException if the object is malformed.
 * @see [PaymentMethodTokenizationSpecification](https://developers.google.com/pay/api/android/reference/object#PaymentMethodTokenizationSpecification)
 */
@Throws(JSONException::class)
privatefungetGatewayTokenizationSpecification():JSONObject{
returnJSONObject()
.put("type","PAYMENT_GATEWAY")
.put(
"parameters",
JSONObject()
.put("gateway","example")
.put("gatewayMerchantId","exampleGatewayMerchantId")
)
}
/**
 * `DIRECT` Integration: Decrypt a response directly on your servers. This configuration has
 * additional data security requirements from Google and additional PCI DSS compliance complexity.
 *
 * Please refer to the documentation for more information about `DIRECT` integration. The
 * type of integration you use depends on your payment processor.
 *
 * @return Payment data tokenization for the CARD payment method.
 * @throws JSONException if the object is malformed.
 * @see [PaymentMethodTokenizationSpecification](https://developers.google.com/pay/api/android/reference/object#PaymentMethodTokenizationSpecification)
 */
@Throws(JSONException::class)
privatefungetDirectTokenizationSpecification():JSONObject{
returnJSONObject()
.put("type","DIRECT")
.put("parameters",JSONObject(Constants.DIRECT_TOKENIZATION_PARAMETERS))
}
/**
 * Card networks supported by your app and your gateway.
 *
 * TODO: Confirm card networks supported by your app and gateway & update in Constants.java.
 *
 * @return Allowed card networks.
 * @see [CardParameters](https://developers.google.com/pay/api/android/reference/object#CardParameters)
 */
privatefungetAllowedCardNetworks():JSONArray{
returnJSONArray(Constants.SUPPORTED_NETWORKS)
}
/**
 * Card authentication methods supported by your app and your gateway.
 *
 * TODO: Confirm your processor supports Android device tokens on your supported card networks
 * and make updates in Constants.java.
 *
 * @return Allowed card authentication methods.
 * @see [CardParameters](https://developers.google.com/pay/api/android/reference/object#CardParameters)
 */
privatefungetAllowedCardAuthMethods():JSONArray{
returnJSONArray(Constants.SUPPORTED_METHODS)
}
/**
 * Describe your app's support for the CARD payment method.
 *
 * The provided properties are applicable to both an IsReadyToPayRequest and a
 * PaymentDataRequest.
 *
 * @return A CARD PaymentMethod object describing accepted cards.
 * @throws JSONException if the object is malformed.
 * @see [PaymentMethod](https://developers.google.com/pay/api/android/reference/object#PaymentMethod)
 */
@Throws(JSONException::class)
privatefungetBaseCardPaymentMethod():JSONObject{
returnJSONObject()
.put("type","CARD")
.put(
"parameters",
JSONObject()
.put("allowedAuthMethods",getAllowedCardAuthMethods())
.put("allowedCardNetworks",getAllowedCardNetworks())
.put("billingAddressRequired",true)
.put("billingAddressParameters",JSONObject().put("format","FULL"))
)
}
/**
 * Describe the expected returned payment data for the CARD payment method.
 *
 * @return A CARD PaymentMethod describing accepted cards and optional fields.
 * @throws JSONException if the object is malformed.
 * @see [PaymentMethod](https://developers.google.com/pay/api/android/reference/object#PaymentMethod)
 */
@Throws(JSONException::class)
privatefungetCardPaymentMethod():JSONObject{
returngetBaseCardPaymentMethod()
.put("tokenizationSpecification",getGatewayTokenizationSpecification())
}
/**
 * Return a collection of payment methods allowed to complete the operation with Google Pay.
 *
 * @return A JSONArray object with the list of payment methods.
 * @throws JSONException if the JSON object is malformed.
 */
@Throws(JSONException::class)
fungetAllowedPaymentMethods():JSONArray{
returnJSONArray().put(getCardPaymentMethod())
}
/**
 * An object describing accepted forms of payment by your app, used to determine a viewer's
 * readiness to pay.
 *
 * @return API version and payment methods supported by the app.
 * @throws JSONException if the object is malformed.
 * @see [IsReadyToPayRequest](https://developers.google.com/pay/api/android/reference/object#IsReadyToPayRequest)
 */
@Throws(JSONException::class)
fungetIsReadyToPayRequest():JSONObject{
returngetBaseRequest()
.put("allowedPaymentMethods",JSONArray().put(getBaseCardPaymentMethod()))
}
/**
 * Provide Google Pay API with a payment amount, currency, and amount status.
 *
 * @param price The price of the product.
 * @return information about the requested payment.
 * @throws JSONException if the object is malformed.
 * @see [TransactionInfo](https://developers.google.com/pay/api/android/reference/object#TransactionInfo)
 */
@Throws(JSONException::class)
fungetTransactionInfo(price:String):JSONObject{
returnJSONObject()
.put("totalPrice",price)
.put("totalPriceLabel","Total")
.put("totalPriceStatus","FINAL")
.put("countryCode",Constants.COUNTRY_CODE)
.put("currencyCode",Constants.CURRENCY_CODE)
.put("checkoutOption","COMPLETE_IMMEDIATE_PURCHASE")
.put("displayItems",getDisplayItems(price))
}
/**
 * Provide Google Pay API with a payment amount, currency, and amount status.
 *
 * @param price The price of the product.
 * @return information about the requested payment.
 * @throws JSONException if the object is malformed.
 * @see [TransactionInfo](https://developers.google.com/pay/api/android/reference/object#TransactionInfo)
 */
@Throws(JSONException::class)
fungetDisplayItems(price:String):JSONArray{
valdisplayItems=JSONArray()
valtax=String.format(
Locale.getDefault(),"%.2f",BigDecimal(price).multiply(BigDecimal(Constants.TAX_RATE.toString()))
)
displayItems.put(createDisplayItem("Total","SUBTOTAL",price))
displayItems.put(createDisplayItem("Tax","TAX",tax))
returndisplayItems
}
/**
 * An object describing information to be requested via the Google Pay payment sheet.
 *
 * @param price the price of the product
 * @return Payment data expected by your app.
 * @throws JSONException If the object is malformed.
 * @see [PaymentDataRequest](https://developers.google.com/pay/api/android/reference/object#PaymentDataRequest)
 */
@Throws(JSONException::class)
fungetPaymentDataRequest(price:String):JSONObject{
returngetBaseRequest()
.put("allowedPaymentMethods",getAllowedPaymentMethods())
.put("transactionInfo",getTransactionInfo(price))
.put("merchantInfo",JSONObject().put("merchantName",Constants.MERCHANT_NAME))
.put("shippingAddressRequired",true)
.put("shippingOptionRequired",true)
.put("shippingOptionParameters",getShippingOptionParameters())
.put(
"shippingAddressParameters",
JSONObject()
.put("phoneNumberRequired",false)
.put("allowedCountryCodes",JSONArray(Constants.SHIPPING_SUPPORTED_COUNTRIES))
)
.put(
"callbackIntents",
JSONArray()
.put("PAYMENT_AUTHORIZATION")
.put("SHIPPING_ADDRESS")
.put("SHIPPING_OPTION")
)
}
/**
 * An object describing information to be updated via the Google Pay payment sheet.
 *
 * @param intermediatePaymentData the intermediate payment data containing user selections.
 * @param price the price of the product.
 * @return Payment data expected by your app.
 * @throws JSONException If the object is malformed.
 * @see [PaymentDataRequest](https://developers.google.com/pay/api/android/reference/object#PaymentDataRequest)
 */
@Throws(JSONException::class)
fungetPaymentDataRequestUpdate(
intermediatePaymentData:JSONObject,price:String
):JSONObject{
// Populate the payment request with default data
valpaymentDataRequestUpdate=JSONObject()
paymentDataRequestUpdate.put("newTransactionInfo",getTransactionInfo(price))
valshippingOptionParameters=getShippingOptionParameters()
paymentDataRequestUpdate.put("newShippingOptionParameters",shippingOptionParameters)
// Update the selected shippingOption based on the user selection
varshippingOptionId="shipping-001"
if(intermediatePaymentData.has("shippingOptionData")
 && intermediatePaymentData.getJSONObject("shippingOptionData").has("id")
){
shippingOptionId=
intermediatePaymentData.getJSONObject("shippingOptionData").getString("id")
paymentDataRequestUpdate
.getJSONObject("newShippingOptionParameters")
.put("defaultSelectedOptionId",shippingOptionId)
}
// Get display item for the selected shipping method and add it to paymentDataRequestUpdate
valshippingDisplayItem=getShippingDisplayItem(shippingOptionId)
paymentDataRequestUpdate
.getJSONObject("newTransactionInfo")
.getJSONArray("displayItems")
.put(shippingDisplayItem)
// define shipping price
if(shippingDisplayItem.has("price")){
// Update displayItems with the new price.
valtotalPrice=
paymentDataRequestUpdate.getJSONObject("newTransactionInfo").getString("totalPrice")
valshippingPrice=shippingDisplayItem.getString("price")
valnewTotalPriceValue=BigDecimal(totalPrice).add(BigDecimal(shippingPrice))
paymentDataRequestUpdate
.getJSONObject("newTransactionInfo")
.put("totalPrice",String.format(Locale.getDefault(),"%.2f",newTotalPriceValue))
}
returnpaymentDataRequestUpdate
}
/**
 * Get a display item object for the selected shipping option.
 *
 * @param shippingOptionId the ID of the selected shipping option.
 * @return a JSONObject containing the display item for the shipping option.
 * @throws JSONException if the shipping option is invalid.
 */
@Throws(JSONException::class)
privatefungetShippingDisplayItem(shippingOptionId:String?):JSONObject{
if(shippingOptionId==null){
returnJSONObject()
}
returnwhen(shippingOptionId){
"shipping-001"->createDisplayItem("Shipping","LINE_ITEM","0")
"shipping-002"->createDisplayItem("Shipping","LINE_ITEM","1.99")
"shipping-003"->createDisplayItem("Shipping","LINE_ITEM","1000")
"shipping-004"->createDisplayItem("Shipping","LINE_ITEM","2000")
"shipping_option_unselected"->JSONObject()
else->throwJSONException("This shipping option is invalid for the given address")
}
}
}

View model

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.viewmodel
importandroid.app.Application
importandroid.util.Log
importandroidx.lifecycle.AndroidViewModel
importandroidx.lifecycle.viewModelScope
importcom.google.android.gms.common.api.ApiException
importcom.google.android.gms.common.api.CommonStatusCodes
importcom.google.android.gms.samples.pay.util.PaymentsUtil
importcom.google.android.gms.tasks.CancellationTokenSource
importcom.google.android.gms.tasks.Task
importcom.google.android.gms.wallet.IsReadyToPayRequest
importcom.google.android.gms.wallet.PaymentData
importcom.google.android.gms.wallet.PaymentDataRequest
importcom.google.android.gms.wallet.PaymentsClient
importkotlinx.coroutines.flow.MutableStateFlow
importkotlinx.coroutines.flow.StateFlow
importkotlinx.coroutines.flow.asStateFlow
importkotlinx.coroutines.flow.update
importkotlinx.coroutines.launch
importkotlinx.coroutines.suspendCancellableCoroutine
importkotlinx.coroutines.tasks.await
importorg.json.JSONException
importorg.json.JSONObject
importjava.util.concurrent.Executor
importkotlin.coroutines.resume
classCheckoutViewModel(application:Application):AndroidViewModel(application){
privateval_paymentUiState:MutableStateFlow<PaymentUiState>=
MutableStateFlow(PaymentUiState.NotStarted)
valpaymentUiState:StateFlow<PaymentUiState>=_paymentUiState.asStateFlow()
// A client for interacting with the Google Pay API.
privatevalpaymentsClient:PaymentsClient=PaymentsUtil.createPaymentsClient(application)
init{
viewModelScope.launch{
verifyGooglePayReadiness()
}
}
/**
 * Determine the user's ability to pay with a payment method supported by your app and display
 * a Google Pay payment button.
 */
privatesuspendfunverifyGooglePayReadiness(){
valnewUiState:PaymentUiState=try{
if(fetchCanUseGooglePay()){
PaymentUiState.Available
}else{
PaymentUiState.Error(CommonStatusCodes.ERROR)
}
}catch(exception:ApiException){
PaymentUiState.Error(exception.statusCode,exception.message)
}
_paymentUiState.update{newUiState}
}
/**
 * Determine the user's ability to pay with a payment method supported by your app.
 */
privatesuspendfunfetchCanUseGooglePay():Boolean{
valrequest=IsReadyToPayRequest.fromJson(PaymentsUtil.getIsReadyToPayRequest().toString())
returnpaymentsClient.isReadyToPay(request).await()
}
/**
 * Creates a [Task] that starts the payment process with the transaction details included.
 *
 * @param price the price of the product
 * @return a [Task] with the payment information.
 * @see [PaymentDataRequest](https://developers.google.com/android/reference/com/google/android/gms/wallet/PaymentsClient#loadPaymentData(com.google.android.gms.wallet.PaymentDataRequest))
 */
fungetLoadPaymentDataTask(price:String):Task<PaymentData>{
valpaymentDataRequestJson=PaymentsUtil.getPaymentDataRequest(price)
valrequest=PaymentDataRequest.fromJson(paymentDataRequestJson.toString())
returnpaymentsClient.loadPaymentData(request)
}
/**
 * At this stage, the user has already seen a popup informing them an error occurred. Normally,
 * only logging is required.
 *
 * @param statusCode will hold the value of any constant from CommonStatusCode or one of the
 * WalletConstants.ERROR_CODE_* constants.
 * @see [Wallet Constants Library](https://developers.google.com/android/reference/com/google/android/gms/wallet/WalletConstants.constant-summary)
 */
privatefunhandleError(statusCode:Int,message:String?){
Log.e("Google Pay API error","Error code: $statusCode, Message: $message")
}
funsetPaymentData(paymentData:PaymentData){
valpayState=extractPaymentBillingName(paymentData)?.let{
PaymentUiState.PaymentCompleted(payerName=it)
}?:PaymentUiState.Error(CommonStatusCodes.INTERNAL_ERROR)
_paymentUiState.update{payState}
}
privatefunextractPaymentBillingName(paymentData:PaymentData):String?{
valpaymentInformation=paymentData.toJson()
try{
// Token will be null if PaymentDataRequest was not constructed using fromJson(String).
valpaymentMethodData=
JSONObject(paymentInformation).getJSONObject("paymentMethodData")
valbillingName=paymentMethodData.getJSONObject("info")
.getJSONObject("billingAddress").getString("name")
Log.d("BillingName",billingName)
// Logging token string.
Log.d(
"Google Pay token",paymentMethodData
.getJSONObject("tokenizationData")
.getString("token")
)
returnbillingName
}catch(error:JSONException){
Log.e("handlePaymentSuccess","Error: $error")
}
returnnull
}
}
abstractclassPaymentUiStateinternalconstructor(){
objectNotStarted:PaymentUiState()
objectAvailable:PaymentUiState()
classPaymentCompleted(valpayerName:String):PaymentUiState()
classError(valcode:Int,valmessage:String?=null):PaymentUiState()
}
suspendfun<T>Task<T>.awaitTask(cancellationTokenSource:CancellationTokenSource? =null):Task<T>{
returnif(isComplete)thiselsesuspendCancellableCoroutine{cont->
// Run the callback directly to avoid unnecessarily scheduling on the main thread.
addOnCompleteListener(DirectExecutor,cont::resume)
cancellationTokenSource?.let{cancellationSource->
cont.invokeOnCancellation{cancellationSource.cancel()}
}
}
}
/**
 * An [Executor] that just directly executes the [Runnable].
 */
privateobjectDirectExecutor:Executor{
overridefunexecute(r:Runnable){
r.run()
}
}

Constants

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay
importcom.google.android.gms.wallet.WalletConstants
/**
 * This file contains several constants you must edit before proceeding.
 * Please take a look at PaymentsUtil.java to see where the constants are used and to potentially
 * remove ones not relevant to your integration.
 *
 *
 * Required changes:
 *
 * 1. Update SUPPORTED_NETWORKS and SUPPORTED_METHODS if required (consult your processor if
 * unsure)
 * 1. Update CURRENCY_CODE to the currency you use.
 * 1. Update SHIPPING_SUPPORTED_COUNTRIES to list the countries where you currently ship. If this
 * is not applicable to your app, remove the relevant bits from PaymentsUtil.java.
 * 1. If you're integrating with your `PAYMENT_GATEWAY`, update
 * PAYMENT_GATEWAY_TOKENIZATION_NAME and PAYMENT_GATEWAY_TOKENIZATION_PARAMETERS per the
 * instructions they provided. You don't need to update DIRECT_TOKENIZATION_PUBLIC_KEY.
 * 1. If you're using `DIRECT` integration, please edit protocol version and public key as
 * per the instructions.
 */
objectConstants{
/**
 * Changing this to ENVIRONMENT_PRODUCTION will make the API return chargeable card information.
 * Please refer to the documentation to read about the required steps needed to enable
 * ENVIRONMENT_PRODUCTION.
 *
 * @value #PAYMENTS_ENVIRONMENT
 */
constvalPAYMENTS_ENVIRONMENT=WalletConstants.ENVIRONMENT_TEST
/**
 * The allowed networks to be requested from the API. If the user has cards from networks not
 * specified here in their account, these will not be offered for them to choose in the popup.
 *
 * @value #SUPPORTED_NETWORKS
 */
valSUPPORTED_NETWORKS=listOf(
"AMEX",
"DISCOVER",
"JCB",
"MASTERCARD",
"VISA"
)
/**
 * The Google Pay API may return cards on file on Google.com (PAN_ONLY) and/or a device token on
 * an Android device authenticated with a 3-D Secure cryptogram (CRYPTOGRAM_3DS).
 *
 * @value #SUPPORTED_METHODS
 */
valSUPPORTED_METHODS=listOf(
"PAN_ONLY",
"CRYPTOGRAM_3DS"
)
/**
 * Required by the API, but not visible to the user.
 *
 * @value #COUNTRY_CODE Your local country
 */
constvalCOUNTRY_CODE="US"
/**
 * Required by the API, but not visible to the user.
 *
 * @value #CURRENCY_CODE Your local currency
 */
constvalCURRENCY_CODE="USD"
/**
 * Supported countries for shipping (use ISO 3166-1 alpha-2 country codes). Relevant only when
 * requesting a shipping address.
 *
 * @value #SHIPPING_SUPPORTED_COUNTRIES
 */
valSHIPPING_SUPPORTED_COUNTRIES=listOf("US","GB")
/**
 * The name of your payment processor/gateway. Please refer to their documentation for more
 * information.
 *
 * @value #PAYMENT_GATEWAY_TOKENIZATION_NAME
 */
constvalPAYMENT_GATEWAY_TOKENIZATION_NAME="example"
/**
 * Custom parameters required by the processor/gateway.
 * In many cases, your processor / gateway will only require a gatewayMerchantId.
 * Please refer to your processor's documentation for more information. The number of parameters
 * required and their names vary depending on the processor.
 *
 * @value #PAYMENT_GATEWAY_TOKENIZATION_PARAMETERS
 */
valPAYMENT_GATEWAY_TOKENIZATION_PARAMETERS=mapOf(
"gateway"toPAYMENT_GATEWAY_TOKENIZATION_NAME,
"gatewayMerchantId"to"exampleGatewayMerchantId"
)
/**
 * Only used for `DIRECT` tokenization. Can be removed when using `PAYMENT_GATEWAY`
 * tokenization.
 *
 * @value #DIRECT_TOKENIZATION_PUBLIC_KEY
 */
constvalDIRECT_TOKENIZATION_PUBLIC_KEY="REPLACE_ME"
/**
 * Parameters required for `DIRECT` tokenization.
 * Only used for `DIRECT` tokenization. Can be removed when using `PAYMENT_GATEWAY`
 * tokenization.
 *
 * @value #DIRECT_TOKENIZATION_PARAMETERS
 */
valDIRECT_TOKENIZATION_PARAMETERS=mapOf(
"protocolVersion"to"ECv2",
"publicKey"toDIRECT_TOKENIZATION_PUBLIC_KEY
)
/**
 * A coefficient to calculate tax rates.
 *
 * @value #TAX_RATE The rate at which you want to calculate tax.
 */
constvalTAX_RATE=0.35
/**
 * The default price for the product.
 *
 * @value #BASE_PRICE
 */
constvalBASE_PRICE="50.20"
/**
 * The name of the merchant.
 *
 * @value #MERCHANT_NAME
 */
constvalMERCHANT_NAME="Example Merchant"
}

Java

Activity

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.activity;
importandroid.app.Activity;
importandroid.content.Intent;
importandroid.os.Bundle;
importandroid.util.Log;
importandroid.view.View;
importandroid.widget.Toast;
importandroidx.activity.result.ActivityResultLauncher;
importandroidx.annotation.Nullable;
importandroidx.appcompat.app.AppCompatActivity;
importandroidx.lifecycle.ViewModelProvider;
importcom.google.android.gms.common.api.CommonStatusCodes;
importcom.google.android.gms.samples.pay.Constants;
importcom.google.android.gms.samples.pay.R;
importcom.google.android.gms.samples.pay.databinding.ActivityCheckoutBinding;
importcom.google.android.gms.samples.pay.util.PaymentsUtil;
importcom.google.android.gms.samples.pay.viewmodel.CheckoutViewModel;
importcom.google.android.gms.tasks.Task;
importcom.google.android.gms.wallet.PaymentData;
importcom.google.android.gms.wallet.button.ButtonOptions;
importcom.google.android.gms.wallet.button.PayButton;
importcom.google.android.gms.wallet.contract.TaskResultContracts.GetPaymentDataResult;
importjava.util.Locale;
importorg.json.JSONException;
importorg.json.JSONObject;
/** Checkout implementation for the app. */
publicclass CheckoutActivityextendsAppCompatActivity{
privateCheckoutViewModelmodel;
privatePayButtongooglePayButton;
privatefinalActivityResultLauncher<Task<PaymentData>>paymentDataLauncher=
registerForActivityResult(
newGetPaymentDataResult(),
result->{
intstatusCode=result.getStatus().getStatusCode();
switch(statusCode){
caseCommonStatusCodes.SUCCESS:
handlePaymentSuccess(result.getResult());
break;
// case CommonStatusCodes.CANCELED: The user canceled
caseCommonStatusCodes.DEVELOPER_ERROR:
handleError(statusCode,result.getStatus().getStatusMessage());
break;
default:
handleError(
statusCode,
"Unexpected non API"
+" exception when trying to deliver the task result to an activity!");
break;
}
});
/**
 * Initialize the Google Pay API on creation of the activity.
 *
 * @see Activity#onCreate(android.os.Bundle)
 */
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
initializeUi();
// Check Google Pay availability
model=newViewModelProvider(this).get(CheckoutViewModel.class);
model.canUseGooglePay.observe(this,this::setGooglePayAvailable);
}
privatevoidinitializeUi(){
// Use view binding to access the UI elements
ActivityCheckoutBindinglayoutBinding=ActivityCheckoutBinding.inflate(getLayoutInflater());
setContentView(layoutBinding.getRoot());
// Set the price label from the constant
layoutBinding.detailPrice.setText(getString(R.string.price_format,Constants.BASE_PRICE));
// The Google Pay button is a layout file – take the root view
googlePayButton=layoutBinding.googlePayButton;
try{
googlePayButton.initialize(
ButtonOptions.newBuilder()
.setAllowedPaymentMethods(PaymentsUtil.getAllowedPaymentMethods().toString())
.build());
googlePayButton.setOnClickListener(this::requestPayment);
}catch(JSONExceptione){
Log.e("initializeUi","Error initializing Google Pay button",e);
}
}
/**
 * If isReadyToPay returned {@code true}, show the button and hide the "checking" text. Otherwise,
 * notify the user that Google Pay is not available. Please adjust to fit in with your current
 * user flow. You are not required to explicitly let the user know if isReadyToPay returns {@code
 * false}.
 *
 * @param available isReadyToPay API response.
 */
privatevoidsetGooglePayAvailable(booleanavailable){
if(available){
googlePayButton.setVisibility(View.VISIBLE);
}else{
Toast.makeText(this,R.string.google_pay_status_unavailable,Toast.LENGTH_LONG).show();
}
}
/**
 * Handles the request to start a payment.
 *
 * @param view The view that triggered the request.
 */
publicvoidrequestPayment(Viewview){
// The price provided to the API should include taxes and shipping.
try{
// provide the default starting price here.
finalTask<PaymentData>task=model.getLoadPaymentDataTask(Constants.BASE_PRICE);
task.addOnCompleteListener(paymentDataLauncher::launch);
}catch(JSONExceptione){
handleError(CommonStatusCodes.INTERNAL_ERROR,"The payment data task couldn't be created.");
}
}
/**
 * PaymentData response object contains the payment information, as well as any additional
 * requested information, such as billing and shipping address.
 *
 * @param paymentData A response object returned by Google after a payer approves payment.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#PaymentData">PaymentData</a>
 */
privatevoidhandlePaymentSuccess(@NullablePaymentDatapaymentData){
if(paymentData==null){
return;
}
finalStringpaymentInfo=paymentData.toJson();
try{
JSONObjectpaymentMethodData=newJSONObject(paymentInfo).getJSONObject("paymentMethodData");
// If the gateway is set to "example", no payment information is returned - instead, the
// token will only consist of "examplePaymentMethodToken".
finalJSONObjectinfo=paymentMethodData.getJSONObject("info");
finalStringbillingName=info.getJSONObject("billingAddress").getString("name");
Toast.makeText(this,getString(R.string.payments_show_name,billingName),Toast.LENGTH_LONG)
.show();
// Logging token string.
Log.d(
"Google Pay token",
paymentMethodData.getJSONObject("tokenizationData").getString("token"));
startActivity(newIntent(this,CheckoutSuccessActivity.class));
}catch(JSONExceptione){
Log.e("handlePaymentSuccess","Error: "+e);
}
}
/**
 * At this stage, the user has already seen a popup informing them an error occurred. Normally,
 * only logging is required.
 *
 * @param statusCode holds the value of any constant from CommonStatusCode or one of the
 * WalletConstants.ERROR_CODE_* constants.
 * @param message An optional error message.
 * @see <a
 * href="https://developers.google.com/android/reference/com/google/android/gms/wallet/WalletConstants#constant-summary">Wallet
 * Constants Library</a>
 */
privatevoidhandleError(intstatusCode,@NullableStringmessage){
Log.e(
"loadPaymentData failed",
String.format(Locale.getDefault(),"Error code: %d, Message: %s",statusCode,message));
}
}

Success activity

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.activity;
importandroid.os.Bundle;
importandroidx.appcompat.app.AppCompatActivity;
importcom.google.android.gms.samples.pay.databinding.ActivityCheckoutSuccessBinding;
/** An activity that is displayed when a payment completes successfully. */
publicclass CheckoutSuccessActivityextendsAppCompatActivity{
/**
 * Initializes the activity.
 *
 * @param savedInstanceState If the activity is being re-initialized after previously being shut
 * down then this Bundle contains the data it most recently supplied in {@link
 * #onSaveInstanceState}. <b><i>Note: Otherwise it is null.</i></b>
 */
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
ActivityCheckoutSuccessBindinglayoutBinding=
ActivityCheckoutSuccessBinding.inflate(getLayoutInflater());
setContentView(layoutBinding.getRoot());
}
}

Util

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.util;
import staticcom.google.android.gms.samples.pay.Constants.TAX_RATE;
importandroid.content.Context;
importcom.google.android.gms.samples.pay.Constants;
importcom.google.android.gms.wallet.PaymentsClient;
importcom.google.android.gms.wallet.Wallet;
importjava.math.BigDecimal;
importjava.util.Locale;
importorg.json.JSONArray;
importorg.json.JSONException;
importorg.json.JSONObject;
/**
 * Contains helper static methods for dealing with the Payments API.
 *
 * <p>Many of the parameters used in the code are optional and are set here merely to call out their
 * existence. Please consult the documentation to learn more and feel free to remove ones not
 * relevant to your implementation.
 */
publicclass PaymentsUtil{
privatePaymentsUtil(){}
/**
 * Encapsulated shipping option parameters (set of options) definition.
 *
 * @return A {@link JSONObject} containing shipping options and the default selected option.
 * @throws JSONException If the JSON object is malformed.
 */
publicstaticJSONObjectgetShippingOptionParameters()throwsJSONException{
JSONObjectshippingOptionParameters=newJSONObject();
JSONArrayshippingOptions=newJSONArray();
shippingOptions.put(
createShippingOption(
"shipping-001","0ドル.00: Free shipping label","Free Shipping example text"));
shippingOptions.put(
createShippingOption(
"shipping-002","1ドル.99: Standard shipping label","Standard shipping example text."));
shippingOptions.put(
createShippingOption(
"shipping-003","1000ドル: Express shipping label","Express shipping example text."));
shippingOptions.put(
createShippingOption(
"shipping-004","2000ドル: Same-day shipping label","Same-day shipping example text."));
shippingOptionParameters.put("shippingOptions",shippingOptions);
shippingOptionParameters.put("defaultSelectedOptionId","shipping-001");
returnshippingOptionParameters;
}
/**
 * Defines an encapsulated shipping option.
 *
 * @param id The unique identifier for the shipping option.
 * @param label The label to display for the shipping option.
 * @param description A brief description of the shipping option.
 * @return A {@link JSONObject} representing the shipping option.
 * @throws JSONException If the JSON object is malformed.
 */
privatestaticJSONObjectcreateShippingOption(Stringid,Stringlabel,Stringdescription)
throwsJSONException{
returnnewJSONObject().put("id",id).put("label",label).put("description",description);
}
/**
 * Encapsulated definition for a display item.
 *
 * @param label The label to display for the item.
 * @param type The type of the display item (e.g., LINE_ITEM, SUBTOTAL).
 * @param price The price of the item.
 * @return A {@link JSONObject} representing the display item.
 * @throws JSONException If the JSON object is malformed.
 */
publicstaticJSONObjectcreateDisplayItem(Stringlabel,Stringtype,Stringprice)
throwsJSONException{
returnnewJSONObject().put("label",label).put("type",type).put("price",price);
}
/**
 * Create a Google Pay API base request object with properties used in all requests.
 *
 * @return Google Pay API base request object.
 * @throws JSONException if the object is malformed.
 */
privatestaticJSONObjectgetBaseRequest()throwsJSONException{
returnnewJSONObject().put("apiVersion",2).put("apiVersionMinor",0);
}
/**
 * Creates an instance of {@link PaymentsClient} for use in an {@link Context} using the
 * environment and theme set in {@link Constants}.
 *
 * @param context is the caller's context.
 * @return An instance of {@link PaymentsClient}.
 */
publicstaticPaymentsClientcreatePaymentsClient(Contextcontext){
Wallet.WalletOptionswalletOptions=
newWallet.WalletOptions.Builder().setEnvironment(Constants.PAYMENTS_ENVIRONMENT).build();
returnWallet.getPaymentsClient(context,walletOptions);
}
/**
 * Gateway Integration: Identify your gateway and your app's gateway merchant identifier.
 *
 * <p>The Google Pay API response will return an encrypted payment method capable of being charged
 * by a supported gateway after payer authorization.
 *
 * <p>TODO: Check with your gateway on the parameters to pass and modify them in Constants.java.
 *
 * @return Payment data tokenization for the CARD payment method.
 * @throws JSONException if the object is malformed.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#PaymentMethodTokenizationSpecification">PaymentMethodTokenizationSpecification</a>
 */
privatestaticJSONObjectgetGatewayTokenizationSpecification()throwsJSONException{
returnnewJSONObject()
.put("type","PAYMENT_GATEWAY")
.put(
"parameters",
newJSONObject()
.put("gateway","example")
.put("gatewayMerchantId","exampleGatewayMerchantId"));
}
/**
 * {@code DIRECT} Integration: Decrypt a response directly on your servers. This configuration has
 * additional data security requirements from Google and additional PCI DSS compliance complexity.
 *
 * <p>Please refer to the documentation for more information about {@code DIRECT} integration. The
 * type of integration you use depends on your payment processor.
 *
 * @return Payment data tokenization for the CARD payment method.
 * @throws JSONException if the object is malformed.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#PaymentMethodTokenizationSpecification">PaymentMethodTokenizationSpecification</a>
 */
privatestaticJSONObjectgetDirectTokenizationSpecification()
throwsJSONException,RuntimeException{
returnnewJSONObject()
.put("type","DIRECT")
.put("parameters",newJSONObject(Constants.DIRECT_TOKENIZATION_PARAMETERS));
}
/**
 * Card networks supported by your app and your gateway.
 *
 * <p>TODO: Confirm card networks supported by your app and gateway & update in Constants.java.
 *
 * @return Allowed card networks.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#CardParameters">CardParameters</a>
 */
privatestaticJSONArraygetAllowedCardNetworks(){
returnnewJSONArray(Constants.SUPPORTED_NETWORKS);
}
/**
 * Card authentication methods supported by your app and your gateway.
 *
 * <p>TODO: Confirm your processor supports Android device tokens on your supported card networks
 * and make updates in Constants.java.
 *
 * @return Allowed card authentication methods.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#CardParameters">CardParameters</a>
 */
privatestaticJSONArraygetAllowedCardAuthMethods(){
returnnewJSONArray(Constants.SUPPORTED_METHODS);
}
/**
 * Describe your app's support for the CARD payment method.
 *
 * <p>The provided properties are applicable to both an IsReadyToPayRequest and a
 * PaymentDataRequest.
 *
 * @return A CARD PaymentMethod object describing accepted cards.
 * @throws JSONException if the object is malformed.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#PaymentMethod">PaymentMethod</a>
 */
privatestaticJSONObjectgetBaseCardPaymentMethod()throwsJSONException{
returnnewJSONObject()
.put("type","CARD")
.put(
"parameters",
newJSONObject()
.put("allowedAuthMethods",getAllowedCardAuthMethods())
.put("allowedCardNetworks",getAllowedCardNetworks())
.put("billingAddressRequired",true)
.put("billingAddressParameters",newJSONObject().put("format","FULL")));
}
/**
 * Describe the expected returned payment data for the CARD payment method.
 *
 * @return A CARD PaymentMethod describing accepted cards and optional fields.
 * @throws JSONException if the object is malformed.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#PaymentMethod">PaymentMethod</a>
 */
privatestaticJSONObjectgetCardPaymentMethod()throwsJSONException{
returngetBaseCardPaymentMethod()
.put("tokenizationSpecification",getGatewayTokenizationSpecification());
}
/**
 * Return a collection of payment methods allowed to complete the operation with Google Pay.
 *
 * @return A JSONArray object with the list of payment methods.
 * @throws JSONException if the JSON object is malformed.
 */
publicstaticJSONArraygetAllowedPaymentMethods()throwsJSONException{
returnnewJSONArray().put(getCardPaymentMethod());
}
/**
 * An object describing accepted forms of payment by your app, used to determine a viewer's
 * readiness to pay.
 *
 * @return API version and payment methods supported by the app.
 * @throws JSONException if the object is malformed.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#IsReadyToPayRequest">IsReadyToPayRequest</a>
 */
publicstaticJSONObjectgetIsReadyToPayRequest()throwsJSONException{
returngetBaseRequest()
.put("allowedPaymentMethods",newJSONArray().put(getBaseCardPaymentMethod()));
}
/**
 * Provide Google Pay API with a payment amount, currency, and amount status.
 *
 * @param price The price of the product.
 * @return information about the requested payment.
 * @throws JSONException if the object is malformed.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#TransactionInfo">TransactionInfo</a>
 */
publicstaticJSONObjectgetTransactionInfo(Stringprice)throwsJSONException{
returnnewJSONObject()
.put("totalPrice",price)
.put("totalPriceLabel","Total")
.put("totalPriceStatus","FINAL")
.put("countryCode",Constants.COUNTRY_CODE)
.put("currencyCode",Constants.CURRENCY_CODE)
.put("checkoutOption","COMPLETE_IMMEDIATE_PURCHASE")
.put("displayItems",getDisplayItems(price));
}
/**
 * Provide Google Pay API with a payment amount, currency, and amount status.
 *
 * @param price The price of the product.
 * @return information about the requested payment.
 * @throws JSONException if the object is malformed.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#TransactionInfo">TransactionInfo</a>
 */
publicstaticJSONArraygetDisplayItems(Stringprice)throwsJSONException{
JSONArraydisplayItems=newJSONArray();
Stringtax=
String.format(
Locale.getDefault(),"%.2f",newBigDecimal(price).multiply(newBigDecimal(TAX_RATE)));
displayItems.put(createDisplayItem("Total","SUBTOTAL",price));
displayItems.put(createDisplayItem("Tax","TAX",tax));
returndisplayItems;
}
/**
 * An object describing information to be requested via the Google Pay payment sheet.
 *
 * @param priceLabel the price of the product
 * @return Payment data expected by your app.
 * @throws JSONException If the object is malformed.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#PaymentDataRequest">PaymentDataRequest</a>
 */
publicstaticJSONObjectgetPaymentDataRequest(StringpriceLabel)throwsJSONException{
returngetBaseRequest()
.put("allowedPaymentMethods",getAllowedPaymentMethods())
.put("transactionInfo",getTransactionInfo(priceLabel))
.put("merchantInfo",newJSONObject().put("merchantName",Constants.MERCHANT_NAME))
.put("shippingAddressRequired",true)
.put("shippingOptionRequired",true)
.put("shippingOptionParameters",getShippingOptionParameters())
.put(
"shippingAddressParameters",
newJSONObject()
.put("phoneNumberRequired",false)
.put("allowedCountryCodes",newJSONArray(Constants.SHIPPING_SUPPORTED_COUNTRIES)))
.put(
"callbackIntents",
newJSONArray()
.put("PAYMENT_AUTHORIZATION")
.put("SHIPPING_ADDRESS")
.put("SHIPPING_OPTION"));
}
/**
 * An object describing information to be updated via the Google Pay payment sheet.
 *
 * @param intermediatePaymentData the intermediate payment data containing user selections.
 * @param priceLabel the price of the product.
 * @return Payment data expected by your app.
 * @throws JSONException If the object is malformed.
 * @see <a
 * href="https://developers.google.com/pay/api/android/reference/object#PaymentDataRequest">PaymentDataRequest</a>
 */
publicstaticJSONObjectgetPaymentDataRequestUpdate(
JSONObjectintermediatePaymentData,StringpriceLabel)throwsJSONException{
// Populate the payment request with default data
JSONObjectpaymentDataRequestUpdate=newJSONObject();
paymentDataRequestUpdate.put("newTransactionInfo",getTransactionInfo(priceLabel));
JSONObjectshippingOptionParameters=getShippingOptionParameters();
paymentDataRequestUpdate.put("newShippingOptionParameters",shippingOptionParameters);
// Update the selected shippingOption based on the user selection
StringshippingOptionId="shipping-001";
if(intermediatePaymentData.has("shippingOptionData")
 && intermediatePaymentData.getJSONObject("shippingOptionData").has("id")){
shippingOptionId=
intermediatePaymentData.getJSONObject("shippingOptionData").getString("id");
paymentDataRequestUpdate
.getJSONObject("newShippingOptionParameters")
.put("defaultSelectedOptionId",shippingOptionId);
}
// Get display item for the selected shipping method and add it to paymentDataRequestUpdate
JSONObjectshippingDisplayItem=getShippingDisplayItem(shippingOptionId);
paymentDataRequestUpdate
.getJSONObject("newTransactionInfo")
.getJSONArray("displayItems")
.put(shippingDisplayItem);
// define shipping price
if(shippingDisplayItem.has("price")){
// Update displayItems with the new price.
StringtotalPrice=
paymentDataRequestUpdate.getJSONObject("newTransactionInfo").getString("totalPrice");
StringshippingPrice=shippingDisplayItem.getString("price");
BigDecimalnewTotalPriceValue=newBigDecimal(totalPrice).add(newBigDecimal(shippingPrice));
paymentDataRequestUpdate
.getJSONObject("newTransactionInfo")
.put("totalPrice",String.format(Locale.getDefault(),"%.2f",newTotalPriceValue));
}
returnpaymentDataRequestUpdate;
}
/**
 * Get a display item object for the selected shipping option.
 *
 * @param shippingOptionId the ID of the selected shipping option.
 * @return a JSONObject containing the display item for the shipping option.
 * @throws JSONException if the shipping option is invalid.
 */
privatestaticJSONObjectgetShippingDisplayItem(StringshippingOptionId)throwsJSONException{
if(shippingOptionId==null){
returnnewJSONObject();
}
switch(shippingOptionId){
case"shipping-001":
returncreateDisplayItem("Shipping","LINE_ITEM","0");
case"shipping-002":
returncreateDisplayItem("Shipping","LINE_ITEM","1.99");
case"shipping-003":
returncreateDisplayItem("Shipping","LINE_ITEM","1000");
case"shipping-004":
returncreateDisplayItem("Shipping","LINE_ITEM","2000");
case"shipping_option_unselected":
returnnewJSONObject();
default:
thrownewJSONException("This shipping option is invalid for the given address");
}
}
}

View model

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay.viewmodel;
importandroid.app.Application;
importandroid.util.Log;
importandroidx.annotation.NonNull;
importandroidx.lifecycle.AndroidViewModel;
importandroidx.lifecycle.LiveData;
importandroidx.lifecycle.MutableLiveData;
importcom.google.android.gms.samples.pay.util.PaymentsUtil;
importcom.google.android.gms.tasks.Task;
importcom.google.android.gms.wallet.IsReadyToPayRequest;
importcom.google.android.gms.wallet.PaymentData;
importcom.google.android.gms.wallet.PaymentDataRequest;
importcom.google.android.gms.wallet.PaymentsClient;
importorg.json.JSONException;
importorg.json.JSONObject;
/** ViewModel for the {@link com.google.android.gms.samples.pay.activity.CheckoutActivity}. */
publicclass CheckoutViewModelextendsAndroidViewModel{
// A client for interacting with the Google Pay API.
privatefinalPaymentsClientpaymentsClient;
// LiveData with the result of whether the user can pay using Google Pay
privatefinalMutableLiveData<Boolean>canUseGooglePayInternal=newMutableLiveData<>();
publicfinalLiveData<Boolean>canUseGooglePay=canUseGooglePayInternal;
/**
 * Initializes the ViewModel.
 *
 * @param application The application context.
 */
publicCheckoutViewModel(@NonNullApplicationapplication){
super(application);
paymentsClient=PaymentsUtil.createPaymentsClient(application);
fetchCanUseGooglePay();
}
/**
 * Determine the user's ability to pay with a payment method supported by your app and display a
 * Google Pay payment button.
 */
privatevoidfetchCanUseGooglePay(){
try{
finalJSONObjectisReadyToPayJson=PaymentsUtil.getIsReadyToPayRequest();
if(isReadyToPayJson==null){
canUseGooglePayInternal.setValue(false);
return;
}
// The call to isReadyToPay is asynchronous and returns a Task. We need to provide an
// OnCompleteListener to be triggered when the result of the call is known.
IsReadyToPayRequestrequest=IsReadyToPayRequest.fromJson(isReadyToPayJson.toString());
Task<Boolean>task=paymentsClient.isReadyToPay(request);
task.addOnCompleteListener(
completedTask->{
if(completedTask.isSuccessful()){
canUseGooglePayInternal.setValue(completedTask.getResult());
}else{
Log.w("isReadyToPay failed",completedTask.getException());
canUseGooglePayInternal.setValue(false);
}
});
}catch(JSONExceptione){
Log.w("isReadyToPay failed",e);
canUseGooglePayInternal.setValue(false);
}
}
/**
 * Creates a Task that starts the payment process with the transaction details included.
 *
 * @param price the price to show on the payment sheet.
 * @return a Task with the payment information.
 * @throws JSONException If the JSON request is malformed.
 */
publicTask<PaymentData>getLoadPaymentDataTask(Stringprice)throwsJSONException{
JSONObjectpaymentDataRequestJson=PaymentsUtil.getPaymentDataRequest(price);
PaymentDataRequestrequest=PaymentDataRequest.fromJson(paymentDataRequestJson.toString());
returnpaymentsClient.loadPaymentData(request);
}
}

Constants

/*
 * Copyright 2024 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
packagecom.google.android.gms.samples.pay;
importcom.google.android.gms.wallet.WalletConstants;
importjava.util.Arrays;
importjava.util.HashMap;
importjava.util.List;
/**
 * This file contains several constants you must edit before proceeding.
 * Please take a look at PaymentsUtil.java to see where the constants are used and to potentially
 * remove ones not relevant to your integration.
 *
 * <p>Required changes:
 * <ol>
 * <li> Update SUPPORTED_NETWORKS and SUPPORTED_METHODS if required (consult your processor if
 * unsure)
 * <li> Update CURRENCY_CODE to the currency you use.
 * <li> Update SHIPPING_SUPPORTED_COUNTRIES to list the countries where you currently ship. If this
 * is not applicable to your app, remove the relevant bits from PaymentsUtil.java.
 * <li> If you're integrating with your {@code PAYMENT_GATEWAY}, update
 * PAYMENT_GATEWAY_TOKENIZATION_NAME and PAYMENT_GATEWAY_TOKENIZATION_PARAMETERS per the
 * instructions they provided. You don't need to update DIRECT_TOKENIZATION_PUBLIC_KEY.
 * <li> If you're using {@code DIRECT} integration, please edit protocol version and public key as
 * per the instructions.
 */
publicclass Constants{
/**
 * Changing this to ENVIRONMENT_PRODUCTION will make the API return chargeable card information.
 * Please refer to the documentation to read about the required steps needed to enable
 * ENVIRONMENT_PRODUCTION.
 *
 * @value #PAYMENTS_ENVIRONMENT
 */
publicstaticfinalintPAYMENTS_ENVIRONMENT=WalletConstants.ENVIRONMENT_TEST;
/**
 * The allowed networks to be requested from the API. If the user has cards from networks not
 * specified here in their account, these will not be offered for them to choose in the popup.
 *
 * @value #SUPPORTED_NETWORKS
 */
publicstaticfinalList<String>SUPPORTED_NETWORKS=Arrays.asList(
"AMEX",
"DISCOVER",
"JCB",
"MASTERCARD",
"VISA");
/**
 * The Google Pay API may return cards on file on Google.com (PAN_ONLY) and/or a device token on
 * an Android device authenticated with a 3-D Secure cryptogram (CRYPTOGRAM_3DS).
 *
 * @value #SUPPORTED_METHODS
 */
publicstaticfinalList<String>SUPPORTED_METHODS=Arrays.asList(
"PAN_ONLY",
"CRYPTOGRAM_3DS");
/**
 * Required by the API, but not visible to the user.
 *
 * @value #COUNTRY_CODE Your local country
 */
publicstaticfinalStringCOUNTRY_CODE="US";
/**
 * Required by the API, but not visible to the user.
 *
 * @value #CURRENCY_CODE Your local currency
 */
publicstaticfinalStringCURRENCY_CODE="USD";
/**
 * Supported countries for shipping (use ISO 3166-1 alpha-2 country codes). Relevant only when
 * requesting a shipping address.
 *
 * @value #SHIPPING_SUPPORTED_COUNTRIES
 */
publicstaticfinalList<String>SHIPPING_SUPPORTED_COUNTRIES=Arrays.asList("US","GB");
/**
 * The name of your payment processor/gateway. Please refer to their documentation for more
 * information.
 *
 * @value #PAYMENT_GATEWAY_TOKENIZATION_NAME
 */
publicstaticfinalStringPAYMENT_GATEWAY_TOKENIZATION_NAME="example";
/**
 * Custom parameters required by the processor/gateway.
 * In many cases, your processor / gateway will only require a gatewayMerchantId.
 * Please refer to your processor's documentation for more information. The number of parameters
 * required and their names vary depending on the processor.
 *
 * @value #PAYMENT_GATEWAY_TOKENIZATION_PARAMETERS
 */
publicstaticfinalHashMap<String,String>PAYMENT_GATEWAY_TOKENIZATION_PARAMETERS=
newHashMap<String,String>(){{
 put("gateway", PAYMENT_GATEWAY_TOKENIZATION_NAME);
 put("gatewayMerchantId", "exampleGatewayMerchantId");
 // Your processor may require additional parameters.
 }};
/**
 * Only used for {@code DIRECT} tokenization. Can be removed when using {@code PAYMENT_GATEWAY}
 * tokenization.
 *
 * @value #DIRECT_TOKENIZATION_PUBLIC_KEY
 */
publicstaticfinalStringDIRECT_TOKENIZATION_PUBLIC_KEY="REPLACE_ME";
/**
 * Parameters required for {@code DIRECT} tokenization.
 * Only used for {@code DIRECT} tokenization. Can be removed when using {@code PAYMENT_GATEWAY}
 * tokenization.
 *
 * @value #DIRECT_TOKENIZATION_PARAMETERS
 */
publicstaticfinalHashMap<String,String>DIRECT_TOKENIZATION_PARAMETERS=
newHashMap<String,String>(){{
 put("protocolVersion", "ECv2");
 put("publicKey", DIRECT_TOKENIZATION_PUBLIC_KEY);
 }};
/**
 * A coefficient to calculate tax rates.
 *
 * @value #TAX_RATE The rate at which you want to calculate tax.
 */
publicstaticfinalDoubleTAX_RATE=0.35;
/**
 * The default price for the product.
 *
 * @value #BASE_PRICE
 */
publicstaticfinalStringBASE_PRICE="50.20";
/**
 * The name of the merchant.
 *
 * @value #MERCHANT_NAME
 */
publicstaticfinalStringMERCHANT_NAME="Example Merchant";
}

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2026年09月01日 UTC.