Tutorial  |  Google Pay API for Android  |  Google for Developers Skip to main content Google Pay Overview Payments Android Web Wallet API Status India Android iOS Web Omnichannel Merchant SDK PSP APIs Chrome Autofill Card metadata BNPL (US only) VCN (US only) eWallet (Southeast Asia only) Get support Payment Card Recognition Universal Commerce Protocol (UCP) Spot Platform / English Deutsch Español Español – América Latina Français Indonesia Italiano Polski Português – Brasil Română Tiếng Việt Türkçe Русский עברית العربيّة فارسی हिंदी বাংলা ภาษาไทย 中文 – 简体 中文 – 繁體 日本語 한국어 Sign in Google Pay for Payments Android Manage integrations in console Home Guides Reference Samples Support Community GitHub X (Twitter) Discord StackOverflow Google Pay Overview Payments More Home Guides Reference Samples Support Community More Wallet API Status India More Chrome Autofill More Payment Card Recognition Universal Commerce Protocol (UCP) Spot Platform Overview Get started Setup Tutorial Quickstart Flutter Java Kotlin (Jetpack Compose) React Native Codelabs Flutter Kotlin (Jetpack Compose) React Native Developer MCP server What's new API release notes Documentation change log Using the API Android WebView Pay from a notification Payment data cryptography Product features Buy now, pay later Shift liability to issuer Strong customer authentication Merchant initiated transactions Token lifecycle management Best practices Brand guidelines UX best practices Test and troubleshoot Integration checklist Test with sample credit cards Test with sample tokens Troubleshooting Publish Prepare for Google Play data disclosure requirements Publish your integration Android Web Android iOS Web Omnichannel Merchant SDK PSP APIs Card metadata BNPL (US only) VCN (US only) eWallet (Southeast Asia only) Get support GitHub X (Twitter) Discord StackOverflow Home Products Google Pay Google Pay for Payments Android Tutorial Stay organized with collections Save and categorize content based on your preferences. Page Summary outlined_flag 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 private val baseRequest = JSONObject() .put("apiVersion", 2) .put("apiVersionMinor", 0) PaymentsUtil.kt Java private static JSONObject getBaseRequest() throws JSONException { return new JSONObject() .put("apiVersion", 2) .put("apiVersionMinor", 0); } PaymentsUtil.java 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 private fun gatewayTokenizationSpecification(): JSONObject { return JSONObject().apply { put("type", "PAYMENT_GATEWAY") put("parameters", JSONObject(mapOf( "gateway" to "example", "gatewayMerchantId" to "exampleGatewayMerchantId"))) } } Java private static JSONObject getGatewayTokenizationSpecification() throws JSONException { return new JSONObject() .put("type", "PAYMENT_GATEWAY") .put("parameters", new JSONObject() .put("gateway", "example") .put("gatewayMerchantId", "exampleGatewayMerchantId") ); } PaymentsUtil.java Tip: example is a valid gateway name in the TEST environment. If you want to try out the API, you can leave the code sample as-is. When you use the example gateway, the API doesn't return card data capable of a transaction, but the user flow looks the same. 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 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 Bank 131 "gateway": "bank131" "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 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 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 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 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 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 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 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 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 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 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 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 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 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 Revolut "gateway": "revolut" "gatewayMerchantId": "YOUR_REVOLUT_ORDER_TOKEN" Developer docs RocketGate "gateway": "rocketgate" "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 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 private val allowedCardNetworks = JSONArray(listOf( "AMEX", "DISCOVER", "INTERAC", "JCB", "MASTERCARD", "VISA")) Java private static JSONArray getAllowedCardNetworks() { return new JSONArray() .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 private val allowedCardAuthMethods = JSONArray(listOf( "PAN_ONLY", "CRYPTOGRAM_3DS")) Java private static JSONArray getAllowedCardAuthMethods() { return new JSONArray() .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. Important: Make sure that you also apply your existing risk checks and controls to Google Pay transactions. Google Pay validation and fraud checks aren't intended to replace your risk management processes. If you support PAN_ONLY, ensure that you trigger 3-D Secure (step-up authentication) for Google Pay PAN PAN_ONLY transactions in the same way that you trigger 3-D Secure for other card transactions. 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 private fun baseCardPaymentMethod(): JSONObject = JSONObject() .put("type", "CARD") .put("parameters", JSONObject() .put("allowedAuthMethods", allowedCardAuthMethods) .put("allowedCardNetworks", allowedCardNetworks) .put("billingAddressRequired", true) .put("billingAddressParameters", JSONObject() .put("format", "FULL") ) ) PaymentsUtil.kt Java private static JSONObject getBaseCardPaymentMethod() throws JSONException { return new JSONObject() .put("type", "CARD") .put("parameters", new JSONObject() .put("allowedAuthMethods", getAllowedCardAuthMethods()) .put("allowedCardNetworks", getAllowedCardNetworks()) .put("billingAddressRequired", true) .put("billingAddressParameters", new JSONObject() .put("format", "FULL") ) ); } PaymentsUtil.java Note: CARD is the only supported payment method. Extend your configuration with information about how to tokenize the payment method. Kotlin private val cardPaymentMethod: JSONObject = baseCardPaymentMethod() .put("tokenizationSpecification", gatewayTokenizationSpecification) PaymentsUtil.kt Java private static JSONObject getCardPaymentMethod() throws JSONException { return getBaseCardPaymentMethod() .put("tokenizationSpecification", getGatewayTokenizationSpecification()); } PaymentsUtil.java 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 fun createPaymentsClient(context: Context): PaymentsClient { val walletOptions = Wallet.WalletOptions.Builder() .setEnvironment(Constants.PAYMENTS_ENVIRONMENT) .build() return Wallet.getPaymentsClient(context, walletOptions) } PaymentsUtil.kt Java public static PaymentsClient createPaymentsClient(Context context) { Wallet.WalletOptions walletOptions = new Wallet.WalletOptions.Builder().setEnvironment(Constants.PAYMENTS_ENVIRONMENT).build(); return Wallet.getPaymentsClient(context, walletOptions); } PaymentsUtil.java 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 fun isReadyToPayRequest(): JSONObject? = try { baseRequest .put("allowedPaymentMethods", JSONArray().put(baseCardPaymentMethod())) } catch (e: JSONException) { null } PaymentsUtil.kt Java public static JSONObject getIsReadyToPayRequest() { try { return getBaseRequest() .put("allowedPaymentMethods", new JSONArray().put(getBaseCardPaymentMethod())); } catch (JSONException e) { return null; } } PaymentsUtil.java 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 private fun possiblyShowGooglePayButton() { val isReadyToPayJson = PaymentsUtil.isReadyToPayRequest() ?: return val request = 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. val task = paymentsClient.isReadyToPay(request) task.addOnCompleteListener { completedTask -> try { completedTask.getResult(ApiException::class.java)?.let(::setGooglePayAvailable) } catch (exception: ApiException) { // Process error Log.w("isReadyToPay failed", exception) } } } CheckoutActivity.kt Kotlin (coroutines) private suspend fun fetchCanUseGooglePay(): Boolean { val request = IsReadyToPayRequest.fromJson(PaymentsUtil.isReadyToPayRequest().toString()) return paymentsClient.isReadyToPay(request).await() } CheckoutViewModel.kt Java private void possiblyShowGooglePayButton() { final Optional<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. IsReadyToPayRequest request = IsReadyToPayRequest.fromJson(isReadyToPayJson.get().toString()); Task<Boolean> task = paymentsClient.isReadyToPay(request); task.addOnCompleteListener(this, new OnCompleteListener<Boolean>() { @Override public void onComplete(@NonNull Task<Boolean> task) { if (task.isSuccessful()) { setGooglePayAvailable(task.getResult()); } else { Log.w("isReadyToPay failed", task.getException()); } } }); } CheckoutActivity.java Note: The Tasks API lets you resolve task operations using coroutines. Learn more. 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() CheckoutLayout.kt 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"/> "activity_checkout.xml Note: To use the Jetpack Compose element, add the com.google.pay.button:compose-pay-button library to the list of dependencies in your Gradle build file. For more information, see compose-pay-button. 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 override fun onCreate(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 private void initializeUi() { // Use view binding to access the UI elements ActivityCheckoutBinding layoutBinding = 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 (JSONException e) { // Keep Google Pay button hidden (consider logging this to your app analytics service) } } CheckoutActivity.java 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. Important: Merchants that process transactions in the European Economic Area (EEA) or any other countries that are subject to Strong Customer Authentication (SCA) must include the countryCode, totalPrice, and merchantName parameters to meet SCA requirements. Kotlin private fun getTransactionInfo(price: String): JSONObject = JSONObject() .put("totalPrice", price) .put("totalPriceStatus", "FINAL") .put("countryCode", Constants.COUNTRY_CODE) .put("currencyCode", Constants.CURRENCY_CODE) PaymentsUtil.kt Java private static JSONObject getTransactionInfo(String price) throws JSONException { return new JSONObject() .put("totalPrice", price) .put("totalPriceStatus", "FINAL") .put("countryCode", Constants.COUNTRY_CODE) .put("currencyCode", Constants.CURRENCY_CODE) .put("checkoutOption", "COMPLETE_IMMEDIATE_PURCHASE"); } PaymentsUtil.java Kotlin private val merchantInfo: JSONObject = JSONObject().put("merchantName", "Example Merchant") PaymentsUtil.kt Java private static JSONObject getMerchantInfo() throws JSONException { return new JSONObject().put("merchantName", "Example Merchant"); } PaymentsUtil.java Important: Provide a user-visible merchant name. For more information, see the MerchantInfo JSON object documentation. 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 fun getPaymentDataRequest(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"))) ) PaymentsUtil.kt Java public static JSONObject getPaymentDataRequest(String priceLabel) { try { return PaymentsUtil.getBaseRequest() .put("allowedPaymentMethods", getAllowedPaymentMethods()) .put("transactionInfo", getTransactionInfo(priceLabel)) .put("merchantInfo", getMerchantInfo()) .put("shippingAddressRequired", true) .put("shippingAddressParameters", new JSONObject() .put("phoneNumberRequired", false) .put("allowedCountryCodes", new JSONArray(Constants.SHIPPING_SUPPORTED_COUNTRIES)) ); } catch (JSONException e) { return null; } } PaymentsUtil.java 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 fun getLoadPaymentDataTask(priceLabel: String): Task<PaymentData> { val paymentDataRequestJson = PaymentsUtil.getPaymentDataRequest(priceLabel) val request = PaymentDataRequest.fromJson(paymentDataRequestJson.toString()) return paymentsClient.loadPaymentData(request) } CheckoutViewModel.kt Java public Task<PaymentData> getLoadPaymentDataTask(String priceLabel) { JSONObject paymentDataRequestJson = PaymentsUtil.getPaymentDataRequest(priceLabel); if (paymentDataRequestJson == null) { return null; } PaymentDataRequest request = PaymentDataRequest.fromJson(paymentDataRequestJson.toString()); return paymentsClient.loadPaymentData(request); } getLoadPaymentDataTask"CheckoutViewModel.java 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 private val paymentDataLauncher = 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 } } CheckoutActivity.kt Java private final ActivityResultLauncher<Task<PaymentData>> paymentDataLauncher = registerForActivityResult(new GetPaymentDataResult(), result -> { int statusCode = result.getStatus().getStatusCode(); switch (statusCode) { case CommonStatusCodes.SUCCESS: handlePaymentSuccess(result.getResult()); break; //case CommonStatusCodes.CANCELED: The user canceled case CommonStatusCodes.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; } }); paymentDataLauncher"CheckoutActivity.java 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 private fun requestPayment() { val task = model.getLoadPaymentDataTask(priceLabel = "50.2") task.addOnCompleteListener(paymentDataLauncher::launch) } CheckoutActivity.kt Kotlin (coroutines) private fun requestPayment() { lifecycleScope.launch { val task = model.getLoadPaymentDataTask(priceLabel = "50.2") paymentDataLauncher.launch(task.awaitTask()) } } CheckoutActivity.kt Java public void requestPayment(View view) { // The price provided to the API should include taxes and shipping. final Task<PaymentData> task = model.getLoadPaymentDataTask("50.2"); task.addOnCompleteListener(paymentDataLauncher::launch); } CheckoutActivity.java Note: The coroutine sample uses an extension function (awaitTask()) that executes and returns the task without any handling errors. Step 7: Enable Callbacks using Dynamic Price Updates Note: This API is only available from version 20.0.0 of the Google Pay library for Android (com.google.android.gms:play-services-wallet). For the latest version, see setup documentation. First, update your PaymentDataRequest object to enable callbacks. Kotlin fun getPaymentDataRequest(price: String): JSONObject { return getBaseRequest() .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") ) } PaymentsUtil.kt Java public static JSONObject getPaymentDataRequest(String priceLabel) throws JSONException { return getBaseRequest() .put("allowedPaymentMethods", getAllowedPaymentMethods()) .put("transactionInfo", getTransactionInfo(priceLabel)) .put("merchantInfo", new JSONObject().put("merchantName", Constants.MERCHANT_NAME)) .put("shippingAddressRequired", true) .put("shippingOptionRequired", true) .put("shippingOptionParameters", getShippingOptionParameters()) .put( "shippingAddressParameters", new JSONObject() .put("phoneNumberRequired", false) .put("allowedCountryCodes", new JSONArray(Constants.SHIPPING_SUPPORTED_COUNTRIES))) .put( "callbackIntents", new JSONArray() .put("PAYMENT_AUTHORIZATION") .put("SHIPPING_ADDRESS") .put("SHIPPING_OPTION")); } PaymentsUtil.java 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. */ package com.google.android.gms.samples.pay.activity import android.os.Bundle import android.util.Log import com.google.android.gms.samples.pay.Constants import com.google.android.gms.samples.pay.util.PaymentsUtil import com.google.android.gms.wallet.PaymentData import com.google.android.gms.wallet.callback.BasePaymentDataCallbacks import com.google.android.gms.wallet.callback.IntermediatePaymentData import com.google.android.gms.wallet.callback.OnCompleteListener import com.google.android.gms.wallet.callback.PaymentAuthorizationResult import com.google.android.gms.wallet.callback.PaymentDataRequestUpdate import org.json.JSONException import org.json.JSONObject /** * Implementation of [BasePaymentDataCallbacks] that handles callbacks from the Google Pay * payment sheet. */ class MerchantPaymentDataCallbacks : BasePaymentDataCallbacks() { /** * onPaymentDataChanged callback - Handles payment data changes in the payment sheet such as * shipping address and shipping options. */ override fun onPaymentDataChanged( request: IntermediatePaymentData?, onCompleteListener: OnCompleteListener<PaymentDataRequestUpdate>, ) { val newSavedState = Bundle() try { val intermediatePaymentDataJson = JSONObject(request?.toJson() ?: "{}") val paymentDataRequestUpdateJson = 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. */ override fun onPaymentAuthorized( request: PaymentData?, onCompleteListener: OnCompleteListener<PaymentAuthorizationResult>, ) { Log.i("Invocation", "onPaymentAuthorized invoked") val savedState = Bundle() val paymentAuthorizationResultJson = JSONObject() try { val paymentDataJson = JSONObject(request?.toJson() ?: "{}") val info = paymentDataJson.getJSONObject("paymentMethodData").getJSONObject("info") // example of how to check for a card network val cardNetwork = info.getString("cardNetwork") if (cardNetwork == "VISA") { paymentAuthorizationResultJson.put("transactionState", "SUCCESS") } else { paymentAuthorizationResultJson.put("transactionState", "ERROR") val error = 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) } } } MerchantPaymentDataCallbacks.kt 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. */ package com.google.android.gms.samples.pay.activity; import android.os.Bundle; import android.util.Log; import androidx.annotation.NonNull; import com.google.android.gms.samples.pay.Constants; import com.google.android.gms.samples.pay.util.PaymentsUtil; import com.google.android.gms.wallet.PaymentData; import com.google.android.gms.wallet.callback.BasePaymentDataCallbacks; import com.google.android.gms.wallet.callback.IntermediatePaymentData; import com.google.android.gms.wallet.callback.OnCompleteListener; import com.google.android.gms.wallet.callback.PaymentAuthorizationResult; import com.google.android.gms.wallet.callback.PaymentDataRequestUpdate; import java.util.Objects; import org.json.JSONException; import org.json.JSONObject; /** * Implementation of {@link BasePaymentDataCallbacks} that handles callbacks from the Google Pay * payment sheet. */ public class MerchantPaymentDataCallbacks extends BasePaymentDataCallbacks { /** * 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 public void onPaymentDataChanged( IntermediatePaymentData request, @NonNull OnCompleteListener<PaymentDataRequestUpdate> onCompleteListener) { // define prices and variables JSONObject paymentDataRequestUpdate; Bundle newSavedState = new Bundle(); try { assert request != null; JSONObject intermediatePaymentData = new JSONObject(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 (JSONException e) { Log.e("SampleMerchantPaymentDataCallbacksService", e.getMessage(), e); throw new RuntimeException(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 public void onPaymentAuthorized( PaymentData request, @NonNull OnCompleteListener<PaymentAuthorizationResult> onCompleteListener) { Log.i("Invocation", "onPaymentAuthorized invoked"); Bundle savedState = new Bundle(); JSONObject paymentAuthorizationResultJson = new JSONObject(); try { assert request != null; JSONObject paymentDataJson = new JSONObject(request.toJson()); JSONObject info = paymentDataJson.getJSONObject("paymentMethodData").getJSONObject("info"); // example of how to check for a card network String cardNetwork = info.getString("cardNetwork"); if (cardNetwork.equals("VISA")) { paymentAuthorizationResultJson.put("transactionState", "SUCCESS"); } else { paymentAuthorizationResultJson.put("transactionState", "ERROR"); JSONObject error = new JSONObject() .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 (JSONException e) { Log.e("SampleMerchantPaymentDataCallbacksService", Objects.requireNonNull(e.getMessage())); throw new RuntimeException(e); } } } MerchantPaymentDataCallbacks.java MerchantPaymentDataCallbacksService Kotlin package com.google.android.gms.samples.pay.service import com.google.android.gms.wallet.callback.BasePaymentDataCallbacks import com.google.android.gms.samples.pay.activity.MerchantPaymentDataCallbacks import com.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()}. */ class MerchantPaymentDataCallbacksService : BasePaymentDataCallbacksService() { override fun createPaymentDataCallbacks(): BasePaymentDataCallbacks { return MerchantPaymentDataCallbacks() } } MerchantPaymentDataCallbacksService.kt 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. */ package com.google.android.gms.samples.pay.service; import androidx.annotation.NonNull; import com.google.android.gms.samples.pay.activity.MerchantPaymentDataCallbacks; import com.google.android.gms.wallet.callback.BasePaymentDataCallbacks; import com.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()}. */ public class MerchantPaymentDataCallbacksService extends BasePaymentDataCallbacksService { @NonNull @Override protected BasePaymentDataCallbacks createPaymentDataCallbacks() { return new MerchantPaymentDataCallbacks(); } } MerchantPaymentDataCallbacksService.java 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> <action android:name="com.google.android.gms.wallet.callback.PAYMENT_DATA_CALLBACKS"/> </intent-filter> </service> AndroidManifest.xml 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> <action android:name="com.google.android.gms.wallet.callback.PAYMENT_DATA_CALLBACKS" /> </intent-filter> </service> AndroidManifest.xml 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. */ package com.google.android.gms.samples.pay.activity import android.os.Bundle import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.activity.viewModels import androidx.compose.runtime.getValue import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.google.android.gms.common.api.CommonStatusCodes import com.google.android.gms.samples.pay.Constants import com.google.android.gms.samples.pay.R import com.google.android.gms.samples.pay.ui.ProductScreen import com.google.android.gms.samples.pay.viewmodel.CheckoutViewModel import com.google.android.gms.samples.pay.viewmodel.PaymentUiState import com.google.android.gms.tasks.Task import com.google.android.gms.wallet.PaymentData import com.google.android.gms.wallet.contract.TaskResultContracts.GetPaymentDataResult class CheckoutActivity : ComponentActivity() { private val model: CheckoutViewModel by viewModels() private val paymentDataLauncher = 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}") } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { val payState: PaymentUiState by model.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, ) } } private fun requestPayment() { val task = model.getLoadPaymentDataTask(Constants.BASE_PRICE) task.addOnCompleteListener(paymentDataLauncher::launch) } } CheckoutActivity.kt 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. */ package com.google.android.gms.samples.pay.util import android.content.Context import com.google.android.gms.samples.pay.Constants import com.google.android.gms.wallet.PaymentsClient import com.google.android.gms.wallet.Wallet import java.math.BigDecimal import java.util.Locale import org.json.JSONArray import org.json.JSONException import org.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. */ object PaymentsUtil { /** * 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) fun getShippingOptionParameters(): JSONObject { val shippingOptionParameters = JSONObject() val shippingOptions = 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") return shippingOptionParameters } /** * 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) private fun createShippingOption(id: String, label: String, description: String): JSONObject { return JSONObject().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) fun createDisplayItem(label: String, type: String, price: String): JSONObject { return JSONObject().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) private fun getBaseRequest(): JSONObject { return JSONObject().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]. */ fun createPaymentsClient(context: Context): PaymentsClient { val walletOptions = Wallet.WalletOptions.Builder() .setEnvironment(Constants.PAYMENTS_ENVIRONMENT) .build() return Wallet.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) private fun getGatewayTokenizationSpecification(): JSONObject { return JSONObject() .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) private fun getDirectTokenizationSpecification(): JSONObject { return JSONObject() .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) */ private fun getAllowedCardNetworks(): JSONArray { return JSONArray(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) */ private fun getAllowedCardAuthMethods(): JSONArray { return JSONArray(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) private fun getBaseCardPaymentMethod(): JSONObject { return JSONObject() .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) private fun getCardPaymentMethod(): JSONObject { return getBaseCardPaymentMethod() .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) fun getAllowedPaymentMethods(): JSONArray { return JSONArray().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) fun getIsReadyToPayRequest(): JSONObject { return getBaseRequest() .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) fun getTransactionInfo(price: String): JSONObject { return JSONObject() .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) fun getDisplayItems(price: String): JSONArray { val displayItems = JSONArray() val tax = 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)) return displayItems } /** * 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) fun getPaymentDataRequest(price: String): JSONObject { return getBaseRequest() .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) fun getPaymentDataRequestUpdate( intermediatePaymentData: JSONObject, price: String ): JSONObject { // Populate the payment request with default data val paymentDataRequestUpdate = JSONObject() paymentDataRequestUpdate.put("newTransactionInfo", getTransactionInfo(price)) val shippingOptionParameters = getShippingOptionParameters() paymentDataRequestUpdate.put("newShippingOptionParameters", shippingOptionParameters) // Update the selected shippingOption based on the user selection var shippingOptionId = "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 val shippingDisplayItem = getShippingDisplayItem(shippingOptionId) paymentDataRequestUpdate .getJSONObject("newTransactionInfo") .getJSONArray("displayItems") .put(shippingDisplayItem) // define shipping price if (shippingDisplayItem.has("price")) { // Update displayItems with the new price. val totalPrice = paymentDataRequestUpdate.getJSONObject("newTransactionInfo").getString("totalPrice") val shippingPrice = shippingDisplayItem.getString("price") val newTotalPriceValue = BigDecimal(totalPrice).add(BigDecimal(shippingPrice)) paymentDataRequestUpdate .getJSONObject("newTransactionInfo") .put("totalPrice", String.format(Locale.getDefault(), "%.2f", newTotalPriceValue)) } return paymentDataRequestUpdate } /** * 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) private fun getShippingDisplayItem(shippingOptionId: String?): JSONObject { if (shippingOptionId == null) { return JSONObject() } return when (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 -> throw JSONException("This shipping option is invalid for the given address") } } } PaymentsUtil.kt 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. */ package com.google.android.gms.samples.pay.viewmodel import android.app.Application import android.util.Log import androidx.lifecycle.AndroidViewModel import androidx.lifecycle.viewModelScope import com.google.android.gms.common.api.ApiException import com.google.android.gms.common.api.CommonStatusCodes import com.google.android.gms.samples.pay.util.PaymentsUtil import com.google.android.gms.tasks.CancellationTokenSource import com.google.android.gms.tasks.Task import com.google.android.gms.wallet.IsReadyToPayRequest import com.google.android.gms.wallet.PaymentData import com.google.android.gms.wallet.PaymentDataRequest import com.google.android.gms.wallet.PaymentsClient import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.tasks.await import org.json.JSONException import org.json.JSONObject import java.util.concurrent.Executor import kotlin.coroutines.resume class CheckoutViewModel(application: Application) : AndroidViewModel(application) { private val _paymentUiState: MutableStateFlow<PaymentUiState> = MutableStateFlow(PaymentUiState.NotStarted) val paymentUiState: StateFlow<PaymentUiState> = _paymentUiState.asStateFlow() // A client for interacting with the Google Pay API. private val paymentsClient: 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. */ private suspend fun verifyGooglePayReadiness() { val newUiState: 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. */ private suspend fun fetchCanUseGooglePay(): Boolean { val request = IsReadyToPayRequest.fromJson(PaymentsUtil.getIsReadyToPayRequest().toString()) return paymentsClient.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)) */ fun getLoadPaymentDataTask(price: String): Task<PaymentData> { val paymentDataRequestJson = PaymentsUtil.getPaymentDataRequest(price) val request = PaymentDataRequest.fromJson(paymentDataRequestJson.toString()) return paymentsClient.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) */ private fun handleError(statusCode: Int, message: String?) { Log.e("Google Pay API error", "Error code: $statusCode, Message: $message") } fun setPaymentData(paymentData: PaymentData) { val payState = extractPaymentBillingName(paymentData)?.let { PaymentUiState.PaymentCompleted(payerName = it) } ?: PaymentUiState.Error(CommonStatusCodes.INTERNAL_ERROR) _paymentUiState.update { payState } } private fun extractPaymentBillingName(paymentData: PaymentData): String? { val paymentInformation = paymentData.toJson() try { // Token will be null if PaymentDataRequest was not constructed using fromJson(String). val paymentMethodData = JSONObject(paymentInformation).getJSONObject("paymentMethodData") val billingName = paymentMethodData.getJSONObject("info") .getJSONObject("billingAddress").getString("name") Log.d("BillingName", billingName) // Logging token string. Log.d( "Google Pay token", paymentMethodData .getJSONObject("tokenizationData") .getString("token") ) return billingName } catch (error: JSONException) { Log.e("handlePaymentSuccess", "Error: $error") } return null } } abstract class PaymentUiState internal constructor() { object NotStarted : PaymentUiState() object Available : PaymentUiState() class PaymentCompleted(val payerName: String) : PaymentUiState() class Error(val code: Int, val message: String? = null) : PaymentUiState() } suspend fun <T> Task<T>.awaitTask(cancellationTokenSource: CancellationTokenSource? = null): Task<T> { return if (isComplete) this else suspendCancellableCoroutine { 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]. */ private object DirectExecutor : Executor { override fun execute(r: Runnable) { r.run() } } CheckoutViewModel.kt 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. */ package com.google.android.gms.samples.pay import com.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. */ object 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 */ const val PAYMENTS_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 */ val SUPPORTED_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 */ val SUPPORTED_METHODS = listOf( "PAN_ONLY", "CRYPTOGRAM_3DS" ) /** * Required by the API, but not visible to the user. * * @value #COUNTRY_CODE Your local country */ const val COUNTRY_CODE = "US" /** * Required by the API, but not visible to the user. * * @value #CURRENCY_CODE Your local currency */ const val CURRENCY_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 */ val SHIPPING_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 */ const val PAYMENT_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 */ val PAYMENT_GATEWAY_TOKENIZATION_PARAMETERS = mapOf( "gateway" to PAYMENT_GATEWAY_TOKENIZATION_NAME, "gatewayMerchantId" to "exampleGatewayMerchantId" ) /** * Only used for `DIRECT` tokenization. Can be removed when using `PAYMENT_GATEWAY` * tokenization. * * @value #DIRECT_TOKENIZATION_PUBLIC_KEY */ const val DIRECT_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 */ val DIRECT_TOKENIZATION_PARAMETERS = mapOf( "protocolVersion" to "ECv2", "publicKey" to DIRECT_TOKENIZATION_PUBLIC_KEY ) /** * A coefficient to calculate tax rates. * * @value #TAX_RATE The rate at which you want to calculate tax. */ const val TAX_RATE = 0.35 /** * The default price for the product. * * @value #BASE_PRICE */ const val BASE_PRICE = "50.20" /** * The name of the merchant. * * @value #MERCHANT_NAME */ const val MERCHANT_NAME = "Example Merchant" } Constants.kt 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. */ package com.google.android.gms.samples.pay.activity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Toast; import androidx.activity.result.ActivityResultLauncher; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.lifecycle.ViewModelProvider; import com.google.android.gms.common.api.CommonStatusCodes; import com.google.android.gms.samples.pay.Constants; import com.google.android.gms.samples.pay.R; import com.google.android.gms.samples.pay.databinding.ActivityCheckoutBinding; import com.google.android.gms.samples.pay.util.PaymentsUtil; import com.google.android.gms.samples.pay.viewmodel.CheckoutViewModel; import com.google.android.gms.tasks.Task; import com.google.android.gms.wallet.PaymentData; import com.google.android.gms.wallet.button.ButtonOptions; import com.google.android.gms.wallet.button.PayButton; import com.google.android.gms.wallet.contract.TaskResultContracts.GetPaymentDataResult; import java.util.Locale; import org.json.JSONException; import org.json.JSONObject; /** Checkout implementation for the app. */ public class CheckoutActivity extends AppCompatActivity { private CheckoutViewModel model; private PayButton googlePayButton; private final ActivityResultLauncher<Task<PaymentData>> paymentDataLauncher = registerForActivityResult( new GetPaymentDataResult(), result -> { int statusCode = result.getStatus().getStatusCode(); switch (statusCode) { case CommonStatusCodes.SUCCESS: handlePaymentSuccess(result.getResult()); break; // case CommonStatusCodes.CANCELED: The user canceled case CommonStatusCodes.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 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initializeUi(); // Check Google Pay availability model = new ViewModelProvider(this).get(CheckoutViewModel.class); model.canUseGooglePay.observe(this, this::setGooglePayAvailable); } private void initializeUi() { // Use view binding to access the UI elements ActivityCheckoutBinding layoutBinding = 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 (JSONException e) { 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. */ private void setGooglePayAvailable(boolean available) { 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. */ public void requestPayment(View view) { // The price provided to the API should include taxes and shipping. try { // provide the default starting price here. final Task<PaymentData> task = model.getLoadPaymentDataTask(Constants.BASE_PRICE); task.addOnCompleteListener(paymentDataLauncher::launch); } catch (JSONException e) { 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> */ private void handlePaymentSuccess(@Nullable PaymentData paymentData) { if (paymentData == null) { return; } final String paymentInfo = paymentData.toJson(); try { JSONObject paymentMethodData = new JSONObject(paymentInfo).getJSONObject("paymentMethodData"); // If the gateway is set to "example", no payment information is returned - instead, the // token will only consist of "examplePaymentMethodToken". final JSONObject info = paymentMethodData.getJSONObject("info"); final String billingName = 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(new Intent(this, CheckoutSuccessActivity.class)); } catch (JSONException e) { 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> */ private void handleError(int statusCode, @Nullable String message) { Log.e( "loadPaymentData failed", String.format(Locale.getDefault(), "Error code: %d, Message: %s", statusCode, message)); } } CheckoutActivity.java 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. */ package com.google.android.gms.samples.pay.activity; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import com.google.android.gms.samples.pay.databinding.ActivityCheckoutSuccessBinding; /** An activity that is displayed when a payment completes successfully. */ public class CheckoutSuccessActivity extends AppCompatActivity { /** * 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 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityCheckoutSuccessBinding layoutBinding = ActivityCheckoutSuccessBinding.inflate(getLayoutInflater()); setContentView(layoutBinding.getRoot()); } } CheckoutSuccessActivity.java 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. */ package com.google.android.gms.samples.pay.util; import static com.google.android.gms.samples.pay.Constants.TAX_RATE; import android.content.Context; import com.google.android.gms.samples.pay.Constants; import com.google.android.gms.wallet.PaymentsClient; import com.google.android.gms.wallet.Wallet; import java.math.BigDecimal; import java.util.Locale; import org.json.JSONArray; import org.json.JSONException; import org.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. */ public class PaymentsUtil { private PaymentsUtil() {} /** * 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. */ public static JSONObject getShippingOptionParameters() throws JSONException { JSONObject shippingOptionParameters = new JSONObject(); JSONArray shippingOptions = new 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"); return shippingOptionParameters; } /** * 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. */ private static JSONObject createShippingOption(String id, String label, String description) throws JSONException { return new JSONObject().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. */ public static JSONObject createDisplayItem(String label, String type, String price) throws JSONException { return new JSONObject().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. */ private static JSONObject getBaseRequest() throws JSONException { return new JSONObject().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}. */ public static PaymentsClient createPaymentsClient(Context context) { Wallet.WalletOptions walletOptions = new Wallet.WalletOptions.Builder().setEnvironment(Constants.PAYMENTS_ENVIRONMENT).build(); return Wallet.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> */ private static JSONObject getGatewayTokenizationSpecification() throws JSONException { return new JSONObject() .put("type", "PAYMENT_GATEWAY") .put( "parameters", new JSONObject() .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> */ private static JSONObject getDirectTokenizationSpecification() throws JSONException, RuntimeException { return new JSONObject() .put("type", "DIRECT") .put("parameters", new JSONObject(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> */ private static JSONArray getAllowedCardNetworks() { return new JSONArray(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> */ private static JSONArray getAllowedCardAuthMethods() { return new JSONArray(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> */ private static JSONObject getBaseCardPaymentMethod() throws JSONException { return new JSONObject() .put("type", "CARD") .put( "parameters", new JSONObject() .put("allowedAuthMethods", getAllowedCardAuthMethods()) .put("allowedCardNetworks", getAllowedCardNetworks()) .put("billingAddressRequired", true) .put("billingAddressParameters", new 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 <a * href="https://developers.google.com/pay/api/android/reference/object#PaymentMethod">PaymentMethod</a> */ private static JSONObject getCardPaymentMethod() throws JSONException { return getBaseCardPaymentMethod() .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. */ public static JSONArray getAllowedPaymentMethods() throws JSONException { return new JSONArray().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> */ public static JSONObject getIsReadyToPayRequest() throws JSONException { return getBaseRequest() .put("allowedPaymentMethods", new 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 <a * href="https://developers.google.com/pay/api/android/reference/object#TransactionInfo">TransactionInfo</a> */ public static JSONObject getTransactionInfo(String price) throws JSONException { return new JSONObject() .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> */ public static JSONArray getDisplayItems(String price) throws JSONException { JSONArray displayItems = new JSONArray(); String tax = String.format( Locale.getDefault(), "%.2f", new BigDecimal(price).multiply(new BigDecimal(TAX_RATE))); displayItems.put(createDisplayItem("Total", "SUBTOTAL", price)); displayItems.put(createDisplayItem("Tax", "TAX", tax)); return displayItems; } /** * 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> */ public static JSONObject getPaymentDataRequest(String priceLabel) throws JSONException { return getBaseRequest() .put("allowedPaymentMethods", getAllowedPaymentMethods()) .put("transactionInfo", getTransactionInfo(priceLabel)) .put("merchantInfo", new JSONObject().put("merchantName", Constants.MERCHANT_NAME)) .put("shippingAddressRequired", true) .put("shippingOptionRequired", true) .put("shippingOptionParameters", getShippingOptionParameters()) .put( "shippingAddressParameters", new JSONObject() .put("phoneNumberRequired", false) .put("allowedCountryCodes", new JSONArray(Constants.SHIPPING_SUPPORTED_COUNTRIES))) .put( "callbackIntents", new 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 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> */ public static JSONObject getPaymentDataRequestUpdate( JSONObject intermediatePaymentData, String priceLabel) throws JSONException { // Populate the payment request with default data JSONObject paymentDataRequestUpdate = new JSONObject(); paymentDataRequestUpdate.put("newTransactionInfo", getTransactionInfo(priceLabel)); JSONObject shippingOptionParameters = getShippingOptionParameters(); paymentDataRequestUpdate.put("newShippingOptionParameters", shippingOptionParameters); // Update the selected shippingOption based on the user selection String shippingOptionId = "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 JSONObject shippingDisplayItem = getShippingDisplayItem(shippingOptionId); paymentDataRequestUpdate .getJSONObject("newTransactionInfo") .getJSONArray("displayItems") .put(shippingDisplayItem); // define shipping price if (shippingDisplayItem.has("price")) { // Update displayItems with the new price. String totalPrice = paymentDataRequestUpdate.getJSONObject("newTransactionInfo").getString("totalPrice"); String shippingPrice = shippingDisplayItem.getString("price"); BigDecimal newTotalPriceValue = new BigDecimal(totalPrice).add(new BigDecimal(shippingPrice)); paymentDataRequestUpdate .getJSONObject("newTransactionInfo") .put("totalPrice", String.format(Locale.getDefault(), "%.2f", newTotalPriceValue)); } return paymentDataRequestUpdate; } /** * 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. */ private static JSONObject getShippingDisplayItem(String shippingOptionId) throws JSONException { if (shippingOptionId == null) { return new JSONObject(); } switch (shippingOptionId) { case "shipping-001": return createDisplayItem("Shipping", "LINE_ITEM", "0"); case "shipping-002": return createDisplayItem("Shipping", "LINE_ITEM", "1.99"); case "shipping-003": return createDisplayItem("Shipping", "LINE_ITEM", "1000"); case "shipping-004": return createDisplayItem("Shipping", "LINE_ITEM", "2000"); case "shipping_option_unselected": return new JSONObject(); default: throw new JSONException("This shipping option is invalid for the given address"); } } } PaymentsUtil.java 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. */ package com.google.android.gms.samples.pay.viewmodel; import android.app.Application; import android.util.Log; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import com.google.android.gms.samples.pay.util.PaymentsUtil; import com.google.android.gms.tasks.Task; import com.google.android.gms.wallet.IsReadyToPayRequest; import com.google.android.gms.wallet.PaymentData; import com.google.android.gms.wallet.PaymentDataRequest; import com.google.android.gms.wallet.PaymentsClient; import org.json.JSONException; import org.json.JSONObject; /** ViewModel for the {@link com.google.android.gms.samples.pay.activity.CheckoutActivity}. */ public class CheckoutViewModel extends AndroidViewModel { // A client for interacting with the Google Pay API. private final PaymentsClient paymentsClient; // LiveData with the result of whether the user can pay using Google Pay private final MutableLiveData<Boolean> canUseGooglePayInternal = new MutableLiveData<>(); public final LiveData<Boolean> canUseGooglePay = canUseGooglePayInternal; /** * Initializes the ViewModel. * * @param application The application context. */ public CheckoutViewModel(@NonNull Application application) { 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. */ private void fetchCanUseGooglePay() { try { final JSONObject isReadyToPayJson = 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. IsReadyToPayRequest request = 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 (JSONException e) { 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. */ public Task<PaymentData> getLoadPaymentDataTask(String price) throws JSONException { JSONObject paymentDataRequestJson = PaymentsUtil.getPaymentDataRequest(price); PaymentDataRequest request = PaymentDataRequest.fromJson(paymentDataRequestJson.toString()); return paymentsClient.loadPaymentData(request); } } CheckoutViewModel.java 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. */ package com.google.android.gms.samples.pay; import com.google.android.gms.wallet.WalletConstants; import java.util.Arrays; import java.util.HashMap; import java.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. */ public class 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 */ public static final int PAYMENTS_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 */ public static final List<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 */ public static final List<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 */ public static final String COUNTRY_CODE = "US"; /** * Required by the API, but not visible to the user. * * @value #CURRENCY_CODE Your local currency */ public static final String CURRENCY_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 */ public static final List<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 */ public static final String PAYMENT_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 */ public static final HashMap<String, String> PAYMENT_GATEWAY_TOKENIZATION_PARAMETERS = new HashMap<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 */ public static final String DIRECT_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 */ public static final HashMap<String, String> DIRECT_TOKENIZATION_PARAMETERS = new HashMap<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. */ public static final Double TAX_RATE = 0.35; /** * The default price for the product. * * @value #BASE_PRICE */ public static final String BASE_PRICE = "50.20"; /** * The name of the merchant. * * @value #MERCHANT_NAME */ public static final String MERCHANT_NAME = "Example Merchant"; } Constants.java Objective: Checkout the Integration checklist to validate your integration and request production access. 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-07-15 UTC. [[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2026-07-15 UTC."],[],[]] Product Info Acceptable Use Policy Terms of Service Google Play Developer Policy - Payments Support How to get help with the Google Pay API Related Links Save to Google Pay Gmail order markup Android Chrome Firebase Google Cloud Platform Google AI All products Terms Privacy Manage cookies English Deutsch Español Español – América Latina Français Indonesia Italiano Polski Português – Brasil Română Tiếng Việt Türkçe Русский עברית العربيّة فارسی हिंदी বাংলা ภาษาไทย 中文 – 简体 中文 – 繁體 日本語 한국어