Folgen Sie der Anleitung in diesem Tutorial, um Google Pay in Ihre Android-App einzubinden und so zu konfigurieren, dass Zahlungskarten akzeptiert werden.
Schritt 1: Zahlungskonfiguration festlegen
Google Pay API-Version konfigurieren
Geben Sie die Version der Google Pay API an, die von Ihrer Anwendung verwendet wird. Die Haupt- und Nebenversionen wirken sich auf die Felder aus, die in jedem übergebenen Objekt erwartet werden, und sind in der Antwort enthalten.
Erstellen Sie ein Basisanfrageobjekt, das Eigenschaften enthält, die in allen anderen Anfrageobjekten vorhanden sind.
Kotlin
private val baseRequest = JSONObject() .put("apiVersion", 2) .put("apiVersionMinor", 0)
Java
private static JSONObject getBaseRequest() throws JSONException { return new JSONObject() .put("apiVersion", 2) .put("apiVersionMinor", 0); }
Zahlungstoken für Ihren Zahlungsdienstleister anfordern
Google verschlüsselt Informationen zur ausgewählten Karte eines Zahlers für die sichere Verarbeitung durch einen Zahlungsanbieter.
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") ); }
Ersetzen Sie example und exampleGatewayMerchantId durch die entsprechenden Werte für Ihren Zahlungsdienstleister. In der folgenden Tabelle finden Sie die spezifischen gateway- und gatewayMerchantId-Werte für Ihren Zahlungsdienstleister:
| Gateway | Parameter und Dokumente |
|---|---|
| 9Pay |
"gateway": "ninepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| 91APP PAYMENTS |
"gateway": "payments91app" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ABA PayWay |
"gateway": "ababank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| accept.blue |
"gateway": "acceptblue" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ACI |
"gateway": "aciworldwide" "gatewayMerchantId": "YOUR_ENTITY_ID" |
| ACpay |
"gateway": "acpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Acquired.com |
"gateway": "acquired" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Adyen |
"gateway": "adyen" "gatewayMerchantId": "YOUR_MERCHANT_ACCOUNT_NAME" |
| AI Fintech |
"gateway": "aifintech" "gatewayMerchantId": "YOUR_MERCHANT_ACCOUNT_NAME" |
| Airba Pay |
"gateway": "airbapay"" "gatewayMerchantId": "YOUR_MERCHANT_ACCOUNT_NAME" |
| Airvend |
"gateway": "airvend" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Airwallex |
"gateway": "airwallex" "gatewayMerchantId": "YOUR_MERCHANT_ACCOUNT_NAME" |
| Akurateco |
"gateway": "akuratecolab" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Alfa-Bank |
"gateway": "alfabank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Algoritma |
"gateway": "algoritma" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Allinpay |
"gateway": "allinpayintl" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| AllPayments |
"gateway": "allpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| alticepay |
"gateway": "alticepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| AMO FINTECH LLC |
"gateway": "amofintech" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Amwal Pay |
"gateway": "amwalalraqamia" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Anedot |
"gateway": "anedot" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ApcoPay |
"gateway": "apcopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| APPEX |
"gateway": "epos" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Armenian Card OJSC |
"gateway": "epgarca" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| AsiaBill |
"gateway": "asiabill" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Assist |
"gateway": "assist" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Assist Belarus |
"gateway": "belassist" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Assist Kazakhstan |
"gateway": "assistkz" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Aurus |
"gateway": "auruspay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Authorize.net |
"gateway": "authorizenet" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Axerve |
"gateway": "gestpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| AXS |
"gateway": "axsasia" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| azericardgpay |
"gateway": "azericardgpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| B2B Soft Pay |
"gateway": "b2bsoftpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Bank 131 |
"gateway": "bank131" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| BANK RBK |
"gateway": "bankrbkkzpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Bank Vostok |
"gateway": "bankvostok" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Barclaycard |
"gateway": "barclayssmartpayadvance" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Barion |
"gateway": "barion" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Basis Theory |
"gateway": "basistheory" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| BCC.KZ |
"gateway": "bccpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| bePaid |
"gateway": "ecomcharge" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Bereke Bank |
"gateway": "berekepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Better Payment Germany GmbH |
"gateway": "betterpayment" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Billing Systems |
"gateway": "billingsystems" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Bindo Labs Limited |
"gateway": "bindo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| bisys.kz |
"gateway": "bisysgpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Bizon.one |
"gateway": "bizonone" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Bizzon |
"gateway": "bizzon" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Blackstone Merchant Services |
"gateway": "blackstone" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Blocks |
"gateway": "blocks" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Bluefin |
"gateway": "bluefin" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Bluefin Europe |
"gateway": "bluefineurope" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Blue Media |
"gateway": "bluemedia" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| BlueSnap |
"gateway": "bluesnap" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Blusky Technology Services |
"gateway": "bluskysvcpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| BORICA |
"gateway": "borica" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| BPC |
"gateway": "bpcpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| BR-DGE |
"gateway": "comcarde" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Braintree |
"gateway": "braintree" "braintree:apiVersion": "v1" "braintree:sdkVersion": "braintree.client.VERSION" "braintree:merchantId": "YOUR_BRAINTREE_MERCHANT_ID" "braintree:clientKey": "YOUR_BRAINTREE_TOKENIZATION_KEY" |
| Braspag |
"gateway": "cielo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| BridgerPay |
"gateway": "bridgerpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Bonum |
"gateway": "bonumpsp" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| BT Pay |
"gateway": "btpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Buckaroo |
"gateway": "buckaroo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Buya |
"gateway": "buya" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CARDAQ |
"gateway": "cardaq" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CardCom |
"gateway": "cardcom" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CardConnect |
"gateway": "cardconnect" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Cardknox |
"gateway": "cardknox" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| cardlink |
"gateway": "cardlink" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Cardstream |
"gateway": "crst" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Cashflows |
"gateway": "cashflowsgateway" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Cathay United Bank |
"gateway": "cathaybk" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CCAvenue UAE |
"gateway": "ccavenueuae" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CCV |
"gateway": "ccv" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Cecabank |
"gateway": "cecabank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Celerispay |
"gateway": "celerispay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CentralPay |
"gateway": "centralpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Centrobill LTD |
"gateway": "centrobill" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Chargehive |
"gateway": "chargehive" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CharityEngine |
"gateway": "charityengine" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Chase Merchant Services |
"gateway": "chase" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Checkout.com |
"gateway": "checkoutltd" "gatewayMerchantId": "YOUR_PUBLIC_KEY" |
| CityPay |
"gateway": "citypay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Cloud9 Payment Gateway (C9PG) |
"gateway": "c9pg" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CloudPayments |
"gateway": "cloudpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CloudWalk |
"gateway": "cloudwalk" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Coinflow |
"gateway": "coinflow" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Computop |
"gateway": "computop" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ConcordPay |
"gateway": "concordpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Conekta |
"gateway": "conektagpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Connectum |
"gateway": "connectum" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ConnexPay |
"gateway": "connexpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CoralPay |
"gateway": "coralpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Corefy |
"gateway": "paycoreio" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Corvus Pay |
"gateway": "corvuspay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Credit2000 |
"gateway": "credit2000" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Credorax |
"gateway": "credorax" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CrossPay |
"gateway": "crosspay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Cross Switch |
"gateway": "crossswitch" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CSG Forte |
"gateway": "csgforte" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CTBC Bank |
"gateway": "ctbcbank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CURO Payments |
"gateway": "curopayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| CYBERBIZ |
"gateway": "cyberbizpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Cybersource |
"gateway": "cybersource" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| danube.pay |
"gateway": "danubepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Datacap Systems, Inc. |
"gateway": "datatrans" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Datatrans |
"gateway": "datatrans" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| DECTA |
"gateway": "decta" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation |
| Dejavoo |
"gateway": "denovosystempay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| DEUNA |
"gateway": "deuna" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Deutsche Bank AG |
"gateway": "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation |
| Deutsche Bank – Merchant Solutions |
"gateway": "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| DG Financial Technology, Inc. |
"gateway": "veritrans" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Digital Commerce Bank |
"gateway": "dcpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Digital Finance |
"gateway": "digitalfinance" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Dintero |
"gateway": "dintero" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| dLocal |
"gateway": "dlocal" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| DNA Payments |
"gateway": "dnapayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Dojo |
"gateway": "dojo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| DOKU |
"gateway": "dokudjakarta" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Dotpay |
"gateway": "dotpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| e-SiTef - Software Express |
"gateway": "softwareexpress" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| easycard |
"gateway": "easycard" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| EasyPay |
"gateway": "easypay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Easypay EU |
"gateway": "easypaypt" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| EBANX |
"gateway": "ebanx" "gatewayMerchantId": "YOUR_PUBLIC_INTEGRATION_KEY" |
| eCard |
"gateway": "ecard" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Ecart Pay |
"gateway": "ecartpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Ecomm Merchant Solutions |
"gateway": "ecommmerchantsolutions" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ECOMMPAY |
"gateway": "ecommpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Ecopaynet |
"gateway": "ecopaynet" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ECPay |
"gateway": "ecpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| EdfaPay |
"gateway": "edfapay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| eftcorporation |
"gateway": "eftcorporation" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| eGHL |
"gateway": "eghl" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Elavon (Converge) |
"gateway": "convergepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Emerchantpay |
"gateway": "emerchantpay" "gatewayMerchantID": "YOUR_GATEWAY_MERCHANT_ID" |
| emspay |
"gateway": "emsonline" "gatewayMerchantID": "YOUR_GATEWAY_MERCHANT_ID" |
| Encoded |
"gateway": "encoded" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| epay |
"gateway": "epay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| EPAYJSC |
"gateway": "epayjsc" "gatewayMerchantID": "YOUR_GATEWAY_MERCHANT_ID" |
| EpicPay |
"gateway": "epicpay" "gatewayMerchantID": "YOUR_GATEWAY_MERCHANT_ID" |
| Espago |
"gateway": "espago" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Etisalat |
"gateway": "etisalatpaymentgateway" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Evertec Placetopay S.A.S |
"gateway": "placetopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Evervault |
"gateway": "evervault" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| EveryPay S.A. |
"gateway": "EveryPay S.A." "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| EVONET |
"gateway": "cardinfolink" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| EVOPAY |
"gateway": "EVOPAY" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Evo Payment Gateway |
"gateway": "evopaymentgateway" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| exactly.com |
"gateway": "exactly" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Exact Payments |
"gateway": "exactpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Fat Zebra |
"gateway": "fatzebra" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Fenige |
"gateway": "fenige" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Fexco payUnite |
"gateway": "fexco" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Fibonatix |
"gateway": "fibonatixparagon" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Financial Line |
"gateway": "finline" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Finanso UA |
"gateway": "finansoua" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| fincode byGMO |
"gateway": "fincode" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| FINEXUS |
"gateway": "finexus" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Finix |
"gateway": "finix" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| FireAntPay |
"gateway": "fireantpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| First American by Deluxe |
"gateway": "firstpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Fiuu (formerly Razer Merchant Services & MOLPay) |
"gateway": "molpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| FIS Biller Solutions |
"gateway": "fisglobalbsp" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Fiserv |
"gateway": "fiserv" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Fiserv |
"gateway": "fiservipg" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Flitt |
"gateway": "flitt" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Flow pagos |
"gateway": "flow_pay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Fluid Pay |
"gateway": "fluidpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Flyway |
"gateway": "flyway" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| FM Finance LTD |
"gateway": "fmfinanceltd" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ForteBank |
"gateway": "fortebank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Forward |
"gateway": "forward" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Fractal |
"gateway": "fractal" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Freedom Finance Bank |
"gateway": "axayscom" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| FreedomPay |
"gateway": "freedompay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| FreedomPay.Money |
"gateway": "payboxmoney" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Freepay |
"gateway": "freepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Frisbii |
"gateway": "Frisbii" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Frontstream |
"gateway": "frontstreampayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Fung Payments |
"gateway": "fungpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| GBPayments |
"gateway": "gbpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| geidea |
"gateway": "geidea" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| GETTRX |
"gateway": "globalelectronictechnology" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Gkash |
"gateway": "gkash" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Global One Pay |
"gateway": "globalonepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Global Payments |
"gateway": "globalpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| globalpaymentsinc |
"gateway": "globalpaymentsinc" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| GMO Payment Gateway |
"gateway": "gmopg" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| GoDaddy Payments |
"gateway": "godaddypayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Good Idea Technologies |
"gateway": "git" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| GoPay |
"gateway": "gopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| GP Webpay |
"gateway": "gpwebpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Gravity Payments |
"gateway": "gravitypayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Gr4vy |
"gateway": "gr4vy" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Halyk Bank |
"gateway": "halykbank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Helcim |
"gateway": "helcim" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| HIPS |
"gateway": "hips" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| HiTrust |
"gateway": "hitrustpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| hutko |
"gateway": "hutko" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Hyp |
"gateway": "hyp" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| icard |
"gateway": "icardwallet" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| iCount |
"gateway": "iCount" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| iCredit |
"gateway": "rivhit" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| IDid Tecnologia Ltda |
"gateway": "idid" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| iKhokha |
"gateway": "ikhokha" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| IMOJE |
"gateway": "imoje" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Impaya |
"gateway": "impayarus" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Infofintech S A S |
"gateway": "infofintech" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Inovio Payments |
"gateway": "inoviopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| InPlat |
"gateway": "inplat" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| InstaMed |
"gateway": "instamed" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| IntaSend Solutions Limited |
"gateway": "intasend" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| IntellectMoney |
"gateway": "intellectmoney" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Interactive Transaction Solutions |
"gateway": "interactivets" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Interpay |
"gateway": "interpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Interswitch Payment Gallery |
"gateway": "interswitch" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Intervale |
"gateway": "intervale" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ioka fintech |
"gateway": "ioka" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| iPay88 |
"gateway": "ipay88" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| IPSI |
"gateway": "ipsi" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| iQmetrix |
"gateway": "iqmetrixpaymentservicesgateway" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| iVeri Payment Technologies |
"gateway": "iveri" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| IXOPAY |
"gateway": "ixopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| JagoLink Limited |
"gateway": "jagolink" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| JetPay |
"gateway": "jetpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| jpmmps |
"gateway": "jpmmps" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| JudoPay |
"gateway": "judopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| JustiFi |
"gateway": "justifi" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| KapitalBank |
"gateway": "eCommerceKapitalBank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Kassa |
"gateway": "kassacom" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| kassa24pay |
"gateway": "kassa24pay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Kazpost JSC |
"gateway": "qazpost" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| KimNganPay |
"gateway": "kimngan" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Kineox |
"gateway": "kineox" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Klix by Citadele |
"gateway": "klix" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Koin |
"gateway": "koin" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| KPay Group |
"gateway": "kpaygroup" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Lapsa Payments |
"gateway": "lapsapayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| LHV Pank |
"gateway": "lhvpank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Liberty |
"gateway": "liberty" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Life Pay |
"gateway": "lifepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Limepay |
"gateway": "limepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Linkly |
"gateway": "linkly" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| LiqPay |
"gateway": "liqpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| LITIQON OÜ |
"gateway": "nuvex" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Littlepay |
"gateway": "littlepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| LogPay |
"gateway": "logpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Loyale |
"gateway": "loyale" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| lynck |
"gateway": "lynck" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Lyra |
"gateway": "lyra" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Magnetiq Bank |
"gateway": "magnetiq" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| maib |
"gateway": "maibecomm" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MakeCommerce (Maksekeskus) |
"gateway": "maksekeskus" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Maksu GMBH |
"gateway": "maksupayeu" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Mandarin |
"gateway": "mandarin" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Market Pay |
"gateway": "marketpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Mastercard Payment Gateway Services |
"gateway": "mpgs" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Mellifera |
"gateway": "mellifera" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MerchantE |
"gateway": "merchante" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Midtrans |
"gateway": "midtrans" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Menahel4uGoCredit |
"gateway": "menahel4ugocredit" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Merchant Warrior |
"gateway": "merchantwarrior" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Minsait Payments Systems |
"gateway": "minsaitpaymentsgateway" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MITEC |
"gateway": "mitecmx" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MIXPLAT |
"gateway": "mixplat" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MOBI.Money |
"gateway": "mobimoney" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Modulbank |
"gateway": "modulbank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Mollie |
"gateway": "mollie" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Mondido |
"gateway": "mondido" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Monei |
"gateway": "monei" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| monek |
"gateway": "monek" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Moneris |
"gateway": "moneris" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Moneta |
"gateway": "moneta" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Monext |
"gateway": "monext" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MoneyHash |
"gateway": "moneyhash" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Money.Mail.Ru |
"gateway": "moneymailru" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| monripayments |
"gateway": "monripayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Moov |
"gateway": "moov" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Moyasar |
"gateway": "moyasar" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MPay |
"gateway": "managepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MSolution |
"gateway": "msolution" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| mstartipg |
"gateway": "mstartipg" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Multicarta |
"gateway": "mulitcarta" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MultiSafepay |
"gateway": "multisafepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Mundipagg |
"gateway": "mundipagg" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MyCheck |
"gateway": "mycheck" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MyChoice2Pay |
"gateway": "mychoice2pay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MyFatoorah |
"gateway": "myfatoorah"
"gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| MyPay |
"gateway": "mypay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| myPOS |
"gateway": "mypos" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| N&TS Group |
"gateway": "netsgroup" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| NCCC |
"gateway": "nccc" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Neolink |
"gateway": "neolinkprocessing" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Neon Pay |
"gateway": "neonpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Netopia |
"gateway": "netopia" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Netvalve |
"gateway": "netvalve" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Network International |
"gateway": "networkintl" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Newebpay (formerly STPath, Pay2Go) |
"gateway": "newebpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Newtech |
"gateway": "newtechmobile" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Nexi |
"gateway": "nexi" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Nexi Easy |
"gateway": "easy" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| NMI |
"gateway": "gatewayservices" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| noon payments |
"gateway": "noonpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Noqoody Pay |
"gateway": "noqoodypay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Novalnet |
"gateway": "novalnet" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Nexi Relay |
"gateway": "nexirelay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| NTT DATA |
"gateway": "nttdatahk" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Nuvei |
"gateway": "nuvei" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Oceanpayment |
"gateway": "oceanpayment" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Omise |
"gateway": "omise" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Omno |
"gateway": "omno" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| One Inc |
"gateway": "oneinc" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Onelya |
"gateway": "onelya" "gatewayMerchantId": "YOUR_GATWAY_MERCHANT_ID" |
| Onerway |
"gateway": "ronghan" "gatewayMerchantId": "YOUR_GATWAY_MERCHANT_ID" |
| OneVision Limited |
"gateway": "onevision" "gatewayMerchantId": "YOUR_GATWAY_MERCHANT_ID" |
| OnPay |
"gateway": "onpayio" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Opayo by Elavon |
"gateway": "opayoelavon" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ONVO |
"gateway": "onvopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| OrkestaPay |
"gateway": "orkestapay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Oschadbank |
"gateway": "oschadbank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Outpayce |
"gateway": "outpayce" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| pagarme |
"gateway": "pagarme" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PagBank |
"gateway": "pagbank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PagBrasil |
"gateway": "pagbrasil" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PagSeguro |
"gateway": "pagsegurointernational" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PAY2M |
"gateway": "pay2m" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payadmit |
"gateway": "payadmit" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payarc |
"gateway": "payarc" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paybis |
"gateway": "paybis" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PAYBOX VERIFONE |
"gateway": "paybox" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Pay.com |
"gateway": "paycom" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PAYCOMET |
"gateway": "paycomet" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paycross Ltd |
"gateway": "paycross" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paydock |
"gateway": "paydock" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayEase |
"gateway": "payeasenet" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayEngine |
"gateway": "payengine" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayerMax |
"gateway": "payermax" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayFabric |
"gateway": "payfabric" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayFacto |
"gateway": "payfacto" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayFast |
"gateway": "gopayfastuat" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| paygent |
"gateway": "paygent" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payhub |
"gateway": "payhub" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayKKa |
"gateway": "paykkaeu" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayLane |
"gateway": "paylane" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payler |
"gateway": "payler" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayLink® |
"gateway": "paylink" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payload |
"gateway": "payload" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paymark |
"gateway": "paymark" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayMaster |
"gateway": "paymaster" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayMe |
"gateway": "payme" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payment Fusion |
"gateway": "paymentfusion" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PaymentIQ |
"gateway": "worldlinedevcode" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paymentvision |
"gateway": "paymentvision" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paymentwall |
"gateway": "paymentwall" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paymo |
"gateway": "paymo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paymob |
"gateway": "gpaymob" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayMongo |
"gateway": "paymongo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paymtech |
"gateway": "paymtech" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayNearMe |
"gateway": "paynearme" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payneteasy |
"gateway": "payneteasy" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayNetWorx |
"gateway": "paynetworx" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayNext Inc |
"gateway": "paynext" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Pay.nl |
"gateway": "paynl" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paynopain |
"gateway": "paynopain" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayOne |
"gateway": "payone" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayOnline |
"gateway": "payonline" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payonomy Limited |
"gateway": "asperato" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Payoo |
"gateway": "payoo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Pay Theory |
"gateway": "paytheory" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayPlus |
"gateway": "payplus" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayPlusLLC |
"gateway": "payplusllc" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayPro Pvt Ltd |
"gateway": "paypro" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Payrails |
"gateway": "payrails" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payrexx |
"gateway": "payrexx" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayRiff |
"gateway": "payriff" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payrix |
"gateway": "payrix" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paysafe |
"gateway": "paysafe" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payscout |
"gateway": "payscout" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paysend Business |
"gateway": "paysend" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paysoft |
"gateway": "paysoft" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Pay360 |
"gateway": "pay360" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| paytech |
"gateway": "paytechsolutions" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayTech Ukraine |
"gateway": "paytech" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payten Payment Gateway |
"gateway": "paytentr" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paythru |
"gateway": "paythru" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payture |
"gateway": "payture" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayU |
"gateway": "payu" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayU LATAM |
"gateway": "payulatam" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PAYUNi |
"gateway": "payuni" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayU Romania |
"gateway": "payuro" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PayU Russia |
"gateway": "payuru" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payway |
"gateway": "payway" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Paywiser |
"gateway": "paywiser" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Payzone Ireland |
"gateway": "payzoneireland" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PBT Gateway Services Ltd |
"gateway": "pbtgateway" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Pelecard |
"gateway": "pelecard" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Pensopay |
"gateway": "pensopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Pikassa |
"gateway": "pikassa" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PingPong |
"gateway": "pingpongx" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Pin Payments |
"gateway": "pinpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Planet |
"gateway": "cccpayment" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PlanetPay |
"gateway": "itcardpaymentservice" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Plategka.com |
"gateway": "plategkacom" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Platon |
"gateway": "platon" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Plexo |
"gateway": "plexouy" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Plexy |
"gateway": "plexy" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Pomelo |
"gateway": "pomelopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Portmone |
"gateway": "portmonecom" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Powerpay |
"gateway": "powerpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Preczn |
"gateway": "preczn" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PrimePay |
"gateway": "primepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Primer |
"gateway": "primer" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Procard |
"gateway": "procard" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ProcessOut |
"gateway": "processout" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Przelewy24 |
"gateway": "przelewy24" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PSCB |
"gateway": "pscbru" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PSiGate Inc. |
"gateway": "psigate" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| PXP Financial |
"gateway": "pxpfinancial" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Qenta Payment CEE |
"gateway": "qenta" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| QIWI |
"gateway": "qiwi" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| QNB |
"gateway": "qnbpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Qualpay |
"gateway": "qualpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| QuickPay |
"gateway": "quickpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Qvalent |
"gateway": "qvalent" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Radial |
"gateway": "radial" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Raiffeisen Processing Centre |
"gateway": "raiffeisenprocessingcentre" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| RapidCents |
"gateway": "rapidcentspay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Rapyd |
"gateway": "rapyd" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| RBK.money |
"gateway": "rbkmoney" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Rebail Capital |
"gateway": "rebailcapital" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Rebilly |
"gateway": "Rebilly" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Recurly |
"gateway": "recurly" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Reddot |
"gateway": "reddotpayment" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Rede |
"gateway": "rede" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Redsys |
"gateway": "redsys" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Reepay |
"gateway": "reepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Revolut |
"gateway": "revolut" "gatewayMerchantId": "YOUR_REVOLUT_ORDER_TOKEN" |
| RocketGate |
"gateway": "rocketgate" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Rootline |
"gateway": "rootline" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Russian Standard Bank |
"gateway": "rsb" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Ryft |
"gateway": "ryft" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| S.C. C SOLUTION S.R.L. |
"gateway": "plationline" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Safepay |
"gateway": "safepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Saferpay |
"gateway": "worldlinesaferpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Safexpay |
"gateway": "safexpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Sberbank |
"gateway": "sberbank" "gatewayMerchantId": "YOUR_ORGANIZATION_NAME" |
| SEB Baltic |
"gateway": "sebbaltic" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SEBES Technology |
"gateway": "sebes" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SecurePay |
"gateway": "securepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Sense Bank |
"gateway": "sensebank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SensePass |
"gateway": "sensepass" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Servicios Digitales Popular S.A. |
"gateway": "pagosazul" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Shift4 |
"gateway": "shift4payments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Shiji Group |
"gateway": "shijipaymentsolutions" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SH Start High |
"gateway": "shstartpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| shvarenapay |
"gateway": "shvarenapay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SIBS Romania |
"gateway": "romcard" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| simbasoft |
"gateway": "simbasoft" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SimplePay Zrt |
"gateway": "simplepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Sipay |
"gateway": "sipay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SmartPay |
"gateway": "smartpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Softbank Payment Service |
"gateway": "sbps" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Softtouch POS and Payments |
"gateway": "softtouch" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Sohar International |
"gateway": "soharinternational" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Sokin |
"gateway": "sokinpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Solid |
"gateway": "solid" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Sony Payment Services |
"gateway": "sonypaymentservices" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Splitit |
"gateway": "splitit" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Spreedly |
"gateway": "spreedly" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Square |
"gateway": "square" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SredaPay |
"gateway": "sredapay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SSLCOMMERZ |
"gateway": "sslcommerz" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Stancer |
"gateway": "stancer" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Stripe |
"gateway": "stripe" "stripe:version": "2018-10-31" "stripe:publishableKey": "YOUR_PUBLIC_STRIPE_KEY" |
| SUMIT |
"gateway": "sumit" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| SUNBAY |
"gateway": "sunbay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Suntech |
"gateway": "esafe" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Surfboard Payments |
"gateway": "surfboard" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Svea Bank |
"gateway": "svea" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Swedbank Baltic |
"gateway": "swedbankbaltic" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Swedbank Pay |
"gateway": "payexswedbankpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TabaPay |
"gateway": "tabapay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TapPay (Cherri Tech) |
"gateway": "tappay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TapPayments |
"gateway": "tappayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| tarlanpayments |
"gateway": "tarlanpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TAS Link |
"gateway": "taslink" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Tatra banka (CardPay) |
"gateway": "tatrabanka" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Technology Partnership PGS |
"gateway": "technologypartnership" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TEKO |
"gateway": "teko" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Telepay |
"gateway": "telerompay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Telr |
"gateway": "telr" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| theMAP |
"gateway": "themap" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Till Payments |
"gateway": "tillpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Time Project LLC |
"gateway": "timeproject" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Tinkoff |
"gateway": "tinkoff" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TIPTOP PAY |
"gateway": "tiptoppay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| TORA |
"gateway": "tora" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TotalPay |
"gateway": "totalpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TPay |
"gateway": "tpaycom" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TPay.com |
"gateway": "tpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Transact Campus |
"gateway": "transactcampus" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Transact Pro |
"gateway": "transactpro" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Transaction Services Network |
"gateway": "tns" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Transpayrent |
"gateway": "transpayrent" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Tranzila |
"gateway": "tranzila" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Tranzzo |
"gateway": "tranzzo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Tribe Payments |
"gateway": "tribepayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Truevo |
"gateway": "truevo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| TrustPay |
"gateway": "trustpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Trust Payments |
"gateway": "trustpayments" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Tuna |
"gateway": "tuna" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Tyler Technologies |
"gateway": "tylertech" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| 2can&ibox |
"gateway": "twocan" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| UAPAY |
"gateway": "uapay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| UBRR |
"gateway": "ubrrpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Ukrcardpay |
"gateway": "ukrcardpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| UkrGasBank Pay |
"gateway": "ukrgasbankpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Unibank OJSC |
"gateway": "unibankcheckout" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| unitedfinancialcorporation |
"gateway": "unitedfinancialcorporation" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Uniteller |
"gateway": "uniteller" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Unitpay |
"gateway": "unitpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Unlimint |
"gateway": "unlimint" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Unzer |
"gateway": "unzer" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Unzer Austria |
"gateway": "unzeraustria" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| UPC |
"gateway": "upc" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Upgate |
"gateway": "upgate" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| USAePay |
"gateway": "usaepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| UseePay |
"gateway": "useepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| USIO, Inc. |
"gateway": "usio" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Valitor |
"gateway": "valitor" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| value.io |
"gateway": "inspirecommerce" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Vanco |
"gateway": "vanco" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| VantagePay |
"gateway": "vantagepay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Vantiv |
"gateway": "vantiv" "vantiv:merchantPayPageId": "YOUR_PAY_PAGE_ID" "vantiv:merchantOrderId": "YOUR_ORDER_ID" "vantiv:merchantTransactionId": "YOUR_TRANSACTION_ID" "vantiv:merchantReportGroup": "*web" |
| Vayapay |
"gateway": "vayapay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| Vendo |
"gateway": "vendoservices" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Verestro |
"gateway": "verestro" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Very Good Security |
"gateway": "verygoodsecurity" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Victoriabank |
"gateway": "victoriabank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Vindicia |
"gateway": "vindicia" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Viva Wallet |
"gateway": "vivawallet" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| VTEX |
"gateway": "vtex" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Waffo |
"gateway": "waffo" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Wallee |
"gateway": "wallee" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Walletdoc |
"gateway": "walletdoc" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Walletto |
"gateway": "walletto" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| WayForPay |
"gateway": "wayforpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| WEAT |
"gateway": "weatpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| WhenThen |
"gateway": "whenthen" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Whitegate |
"gateway": "Whitegate" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| WHITELARK LTD |
"gateway": "whitelark" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Windcave |
"gateway": "windcave" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Wirebank |
"gateway": "wirebank" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Wirecard |
"gateway": "wirecard" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| WOOPPAY |
"gateway": "wooppay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| WooshPay |
"gateway": "swooshtransfer" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Worldline (GlobalCollect) |
"gateway": "globalcollect" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Worldline - Ingenico (WL Online Checkout) |
"gateway": "worldlineingenicoogone" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Worldline Nordics (Worldline Online Checkout) |
"gateway": "worldlineonlinecheckout" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Worldline Sips |
"gateway": "wlsips" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Worldnet |
"gateway": "worldnet" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Worldpay |
"gateway": "worldpay" "gatewayMerchantId": "YOUR_WORLDPAY_MERCHANT_ID" |
| Wpay |
"gateway": "wpayaus" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| WSPay |
"gateway": "wspay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Xendit |
"gateway": "xendit" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| xMoney |
"gateway": "xmoneypay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| XPATE |
"gateway": "xpate" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| xpay |
"gateway": "xpaycomua" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| XPay by PostEx |
"gateway": "xpaybypostex" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| YabandPay B.V. |
"gateway": "yabandpay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Yapstone |
"gateway": "yapstone" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| YIĞIM Payment System |
"gateway": "yigim" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" Keine Entwicklerdokumentation verfügbar |
| ЮKassa (YooKassa) |
"gateway": "yoomoney" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Yuno |
"gateway": "yuno" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Z-credit |
"gateway": "zcredit" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Zalopay |
"gateway": "zalopay" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| ZEN.com |
"gateway": "zen" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Zest |
"gateway": "zestpayment" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
| Zuora |
"gateway": "zuora" "gatewayMerchantId": "YOUR_GATEWAY_MERCHANT_ID" |
Der Tokenisierungstyp PAYMENT_GATEWAY ist die gängigste Händlerimplementierung der Kartenzahlungsmethode in der Google Pay API. Wenn Ihr Zahlungsdienstleister nicht unterstützt wird, können Sie Google Pay möglicherweise über eine DIRECT-Integration akzeptieren. Weitere Informationen finden Sie in der Dokumentation zur direkten Tokenisierung.
Unterstützte Zahlungskartennetzwerke definieren
Definieren Sie die Kartennetzwerke, die von Ihrer Anwendung akzeptiert werden.
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"); }
Die Google Pay API gibt möglicherweise hinterlegte Karten aus Ihrem Konto (PAN_ONLY) oder ein Gerätetoken auf einem Android-Gerät zurück, das mit einem 3‑D Secure-Kryptogramm authentifiziert wurde (CRYPTOGRAM_3DS). Sie können die API so konfigurieren, dass die Methoden zurückgegeben werden, die von Ihrer Anwendung unterstützt werden.
Bevor Sie allowedCardAuthMethods festlegen, müssen Sie bei Ihrem Zahlungsabwickler und Acquirer prüfen, ob Gerätetokens (CRYPTOGRAM_3DS) in Ihrer Region unterstützt werden.
Kotlin
private val allowedCardAuthMethods = JSONArray(listOf( "PAN_ONLY", "CRYPTOGRAM_3DS"))
Java
private static JSONArray getAllowedCardAuthMethods() { return new JSONArray() .put("PAN_ONLY") .put("CRYPTOGRAM_3DS"); }
Weitere Informationen finden Sie in der Referenzdokumentation zum CardParameters-Objekt. Wenn Sie Unterstützung für Android-Gerätetokens benötigen, wenden Sie sich an Ihr Gateway oder Ihren Zahlungsabwickler, um Informationen zu den unterstützten Kartennetzwerken zu erhalten.
Zulässige Zahlungsmethoden beschreiben
Um die Unterstützung der CARD-Zahlungsmethode durch Ihre App zu beschreiben, kombinieren Sie Ihre unterstützten Authentifizierungsmethoden und Kartennetzwerke.
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") ) )
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") ) ); }
Erweitern Sie die Konfiguration um Informationen dazu, wie die Zahlungsmethode tokenisiert werden soll.
Kotlin
private val cardPaymentMethod: JSONObject = baseCardPaymentMethod() .put("tokenizationSpecification", gatewayTokenizationSpecification)
Java
private static JSONObject getCardPaymentMethod() throws JSONException { return getBaseCardPaymentMethod() .put("tokenizationSpecification", getGatewayTokenizationSpecification()); }
Weitere Informationen finden Sie in der Referenzdokumentation zum CardParameters-Objekt.
Schritt 2: PaymentsClient-Instanz erstellen
Erstellen Sie eine PaymentsClient-Instanz, um mit der Google Pay API zu interagieren.
Kotlin
fun createPaymentsClient(context: Context): PaymentsClient { val walletOptions = Wallet.WalletOptions.Builder() .setEnvironment(Constants.PAYMENTS_ENVIRONMENT) .build() return Wallet.getPaymentsClient(context, walletOptions) }
Java
public static PaymentsClient createPaymentsClient(Context context) { Wallet.WalletOptions walletOptions = new Wallet.WalletOptions.Builder().setEnvironment(Constants.PAYMENTS_ENVIRONMENT).build(); return Wallet.getPaymentsClient(context, walletOptions); }
Schritt 3: Mit der Google Pay API prüfen, ob die Zahlung möglich ist
Fügen Sie Ihrem Basisanfrageobjekt mit dem folgenden Code-Snippet Ihre zulässigen Zahlungsmethoden hinzu:
Kotlin
fun isReadyToPayRequest(): JSONObject? = try { baseRequest .put("allowedPaymentMethods", JSONArray().put(baseCardPaymentMethod())) } catch (e: JSONException) { null }
Java
public static JSONObject getIsReadyToPayRequest() { try { return getBaseRequest() .put("allowedPaymentMethods", new JSONArray().put(getBaseCardPaymentMethod())); } catch (JSONException e) { return null; } }
Bevor Sie die Google Pay-Schaltfläche anzeigen, rufen Sie die isReadyToPay API auf, um festzustellen, ob der Nutzer Zahlungen mit der Google Pay API ausführen kann. Eine vollständige Liste der Konfigurationseigenschaften finden Sie in der Dokumentation zum JSON-Objekt IsReadyToPayRequest.
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) } } }
Kotlin
(Coroutines)
private suspend fun fetchCanUseGooglePay(): Boolean { val request = IsReadyToPayRequest.fromJson(PaymentsUtil.isReadyToPayRequest().toString()) return paymentsClient.isReadyToPay(request).await() }
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()); } } }); }
Schritt 4: Google Pay-Zahlungsbutton hinzufügen
Fügen Sie Ihrer App eine Google Pay-Zahlungsschaltfläche hinzu, um Käufer zu ermutigen, mit Zahlungsmethoden zu bezahlen, die von der Google Pay API und Ihrer App unterstützt werden.
Weitere Informationen zu den verfügbaren Schaltflächentypen, Farben und Anzeigeanforderungen finden Sie in der ButtonOptions-Referenz.
Fügen Sie das PayButton-Layout dem Checkout-Layout Ihrer Anwendung hinzu:
Kotlin
(Compose)
PayButton( modifier = Modifier .testTag("payButton") .fillMaxWidth(), onClick = onGooglePayButtonClick, allowedPaymentMethods = PaymentsUtil.allowedPaymentMethods.toString()
XML
<com.google.android.gms.wallet.button.PayButton android:id="@+id/googlePayButton" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginBottom="20dp"/>
Wenn Sie die Google Pay-Schaltfläche mit XML hinzufügen…
Rufen Sie die Android-Aktivität auf und initialisieren Sie die Google Pay-Schaltfläche zusammen mit anderen UI-Elementen:
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) } }
Schritt 5: PaymentDataRequest-Objekt erstellen
Ein PaymentDataRequest-JSON-Objekt beschreibt die Informationen, die Sie von einem Zahlungspflichtigen in einem Google Pay-Zahlungsformular anfordern. Dazu gehören Informationen zum Transaktionspreis und zum Status des angegebenen Preises. Weitere Informationen finden Sie in der Dokumentation zum JSON-Objekt TransactionInfo.
Die folgenden Blöcke fügen dem PaymentDataRequest-Objekt, das zum Starten des Zahlungsvorgangs mit Google Pay erforderlich ist, Informationen zum Händler und zur Transaktion hinzu.
Kotlin
private fun getTransactionInfo(price: String): JSONObject = JSONObject() .put("totalPrice", price) .put("totalPriceStatus", "FINAL") .put("countryCode", Constants.COUNTRY_CODE) .put("currencyCode", Constants.CURRENCY_CODE)
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"); }
Kotlin
private val merchantInfo: JSONObject = JSONObject().put("merchantName", "Example Merchant")
Java
private static JSONObject getMerchantInfo() throws JSONException { return new JSONObject().put("merchantName", "Example Merchant"); }
Weisen Sie Ihr Basis-Anfrageobjekt einem neuen PaymentDataRequest-JSON-Objekt zu.
Fügen Sie dann die von Ihrer Anwendung unterstützten Zahlungsmethoden hinzu, z. B. alle Konfigurationen zusätzlicher Daten, die in der Antwort erwartet werden. Fügen Sie schließlich Informationen zur Transaktion und zum Händler hinzu, der die Anfrage stellt:
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"))) )
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; } }
Das Objekt PaymentDataRequest ist ein Parcelable, das eine Zahlungsdatenanfrage darstellt. Die PaymentDataRequest enthält Informationen, die für die Durchführung einer Zahlung erforderlich sind.
Weitere Informationen finden Sie in der Dokumentation zum JSON-Objekt PaymentDataRequest.
Schritt 6: Zahlungsvorgang mit Google Pay starten
Rufen Sie zum Starten des Zahlungsvorgangs die loadPaymentData-Anfrage mit dem PaymentsClient-Objekt auf. Dieser Aufruf gibt ein Task-Objekt mit dem Ergebnis des Vorgangs zurück.
Erstellen Sie zuerst den loadPaymentData-Task mit der im vorherigen Schritt erstellten Anfrage:
Kotlin
fun getLoadPaymentDataTask(priceLabel: String): Task<PaymentData> { val paymentDataRequestJson = PaymentsUtil.getPaymentDataRequest(priceLabel) val request = PaymentDataRequest.fromJson(paymentDataRequestJson.toString()) return paymentsClient.loadPaymentData(request) }
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); }
Verwenden Sie zum Verarbeiten des Ergebnisses einen der Activity Result Contracts in der API. In diesem Beispiel wird GetPaymentDataResult verwendet. Das Ergebnis ist ein Objekt mit Informationen zum Vorgang zusätzlich zum Ergebnis selbst:
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 } }
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; } });
Bevor Sie dem Nutzer eine Bestätigung seines Kaufs präsentieren, extrahieren Sie das Zahlungstoken aus dem PaymentData-Ergebnisobjekt und verwenden Sie dieses Token, um die Zahlungstransaktion mit Ihrem Gateway zu erstellen.
Weitere Informationen zum Ergebnisobjekt finden Sie in der PaymentData-JSON-Objektreferenz.
Verwenden Sie nun den Launcher für das Aktivitätsergebnis und die Aufgabe, um die Google Pay-Zahlungsauswahl zu präsentieren:
Kotlin
private fun requestPayment() { val task = model.getLoadPaymentDataTask(priceLabel = "50.2") task.addOnCompleteListener(paymentDataLauncher::launch) }
Kotlin
(Coroutines)
private fun requestPayment() { lifecycleScope.launch { val task = model.getLoadPaymentDataTask(priceLabel = "50.2") paymentDataLauncher.launch(task.awaitTask()) } }
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); }
Schritt 7: Callbacks mit dynamischen Preisupdates aktivieren
Aktualisieren Sie zuerst Ihr PaymentDataRequest-Objekt, um Callbacks zu aktivieren.
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") ) }
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")); }
Implementieren Sie als Nächstes die Logik für MerchantPaymentDataCallbacks und MerchantPaymentDataCallbacksService, indem Sie BasePaymentDataCallbacks bzw. BasePaymentDataCallbacksService erweitern, um Callback-Ereignisse zu verarbeiten.
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) } } }
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); } } }
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() } }
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(); } }
Aktualisieren Sie zum Schluss die Datei „AndroidManifest.xml“, um com.google.android.gms.permission.BIND_PAYMENTS_CALLBACK_SERVICE als Berechtigung anzugeben und einen Intent-Filter mit dem Aktionsnamen com.google.android.gms.wallet.callback.PAYMENT_DATA_CALLBACKS einzufügen.
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>
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>
Zusammenfassung
Das folgende Snippet zeigt ein vollständiges Beispiel für ein korrekt konfiguriertes Projekt. Schritte zur Einrichtung auf Projektebene finden Sie unter Projekt konfigurieren.
Kotlin
Aktivität
/* * 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) } }
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") } } }
Modell ansehen
/* * 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() } }
Konstanten
/* * 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" }
Java
Aktivität
/* * 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)); } }
Erfolgsaktivität
/* * 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()); } }
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"); } } }
Modell ansehen
/* * 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); } }
Konstanten
/* * 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"; }