Sandbox-Zahlungen einrichten

Bei der Bestellung von End-to-End-Projekten kann der Sandbox-Zahlungsmodus konfiguriert werden, wenn entweder der Schnelltest oder die Sandbox-Umgebung verwendet wird. Während Sie Ihren Datenfeed testen, können Sie zwischen den Modi „Sandbox“ und „Produktion“ wechseln. Wenn du die Zahlungen für dein Bestell-End-to-End-Projekt testen möchtest, ohne die Karten zu belasten, verwende Sandbox als Zahlungsmodus. Die Produktionsumgebung unterstützt den Sandbox-Zahlungsmodus nicht.

Konfiguration

So aktivieren Sie den Sandbox-Zahlungsmodus in der Sandbox-Umgebung:

  1. Gehen Sie im Actions Center zu Konfiguration > Funktionen.
  2. Suchen Sie auf der Karte Kontofunktionen das Optionsfeld Zahlungsmodus.
  3. Wählen Sie die Option Sandbox aus und klicken Sie auf Änderungen speichern.

Karte „Kontofunktionen“ mit ausgewähltem Sandbox-Modus

So aktivieren Sie den Sandbox-Zahlungsmodus in der Schnelltestumgebung:

  1. Klicken Sie im Actions Center auf Feeds > Schnelltest.
  2. Wählen Sie das Optionsfeld Sandbox für GPay verwenden aus.

Schnelltest mit ausgewähltem Sandbox-Modus

Bei Auswahl der Zahlungsart Sandbox:

  • Durch End-to-End-Bestellungen wird Google Pay so konfiguriert, dass Zahlungsmitteltokens zurückgegeben werden, die Testkartendaten anstelle der tatsächlichen Kartendetails enthalten.
  • Das Feld isInSandbox ist in CheckoutRequestMessage und SubmitOrderRequestMessage auf true gesetzt.

Die verschiedenen Kombinationen aus Umgebung, Zahlungsart und isInSandbox sind:

Umgebung Zahlungsart isInSandbox
Kurztest Sandbox true
Kurztest Produktion false
Sandbox Sandbox true
Sandbox Produktion false
Produktion Produktion false

Antwortnachricht für den Bezahlvorgang

Die CheckoutResponseMessage, die von deinem Food Ordering-Webdienst gesendet wird, enthält PaymentOptions. Wenn Sie den Kaufvorgang einrichten, geben Sie Platzhalter für Zahlungsoptionen an. Verwenden Sie dazu ein Beispiel für ein Zahlungsgateway.

  • Aktualisieren Sie den von Ihrem Webdienst gesendeten CheckoutResponseMessage mit der entsprechenden Tokenisierungskonfiguration.

Beispiele für Zahlungsoptionen

Im Folgenden finden Sie Beispiele für JSON-PaymentOptions-Objekte aus einem CheckoutResponseMessage für verschiedene Zahlungsgateways mit Sandbox-Schlüsseln:

JSON

"paymentOptions": {
    "googleProvidedOptions": {
        "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"USD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"31.85\"}} "
    }
}

JSON

"paymentOptions": {
    "googleProvidedOptions": {
        "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gateway\":\"braintree\",\"braintree:apiVersion\":\"v1\",\"braintree:sdkVersion\":\"1.4.0\",\"braintree:merchantId\":\"YOUR_MERCHANT_ID\",\"braintree:clientKey\":\"YOUR_BRAINTREE_SANDVOX_OR_PRODUCTION_KEY\"}}}],\"transactionInfo\":{\"currencyCode\":\"USD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"31.85\"}} "
    }
}

JSON

"paymentOptions": {
    "googleProvidedOptions": {
        "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gateway\":\"stripe\",\"stripe:version\":\"2018-10-31\",\"stripe:publishableKey\":\"YOUR_PRODUCTION_OR_SANDBOX_STRIPE_KEY\"}}}],\"transactionInfo\":{\"currencyCode\":\"USD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"31.85\"}} "
    }
}

JSON

"paymentOptions": {
    "googleProvidedOptions": {
        "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gateway\":\"stripev2\",\"gatewayMerchantId\":\"YOUR_PRODUCTION_OR_SANDBOX_STRIPE_KEY\"}}}],\"transactionInfo\":{\"currencyCode\":\"USD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"31.85\"}} "
    }
}

Sandbox-Transaktionen kennzeichnen

Wenn der Sandbox-Zahlungsmodus aktiviert ist, ist das Feld isInSandbox in der Anfrage enthalten und wird für eingehende Anfragen an Ihren Webdienstendpunkt CheckoutRequestMessage und SubmitOrderRequestMessage auf true gesetzt. Wenn das Feld isInSandbox auf true gesetzt ist, gehen Sie so vor:

  • Verwenden Sie in der Tokenisierungskonfiguration für Ihr Zahlungsgateway Sandbox-Schlüssel anstelle von Produktionsschlüsseln. Die meisten Zahlungsabwickler stellen API-Schlüssel sowohl für die Sandbox als auch für die Produktion zur Verfügung.
  • Lösen Sie keine Kommunikation mit dem Webdienstanbieter (in der Regel einem Restaurant) aus, da dieser nicht über Sandbox-Transaktionen informiert werden muss.

Testkreditkarten werden nicht unterstützt, auch wenn die Transaktions-Sandbox aktiviert ist. Für eine Transaktion müssen Sie eine echte Kreditkarte verwenden. Sandbox-Instrumente-Tokens enthalten jedoch Testkartendetails, die nicht anrechenbar sind.

Zahlungen abwickeln

Wenn ein Kunde seine Bestellung absendet, sendet Ordering End-to-End die SubmitOrderRequestMessage an Ihren Webdienstendpunkt. Das Google Pay-Token ist als base-64-codierter String im Feld instrumentToken SubmitOrderRequestMessage enthalten. Führen Sie je nach Zahlungs-Gateway einen der folgenden Schritte aus, um die Zahlung des Kunden zu verarbeiten:

Zahlungs-Gateway
Stripe oder Braintree Decodieren Sie den base64-codierten Tokenstring und senden Sie die entsprechenden Daten in der decodierten Token-Nutzlast an Ihr Zahlungs-Gateway, um die Zahlung zu verarbeiten.
Alle anderen Zahlungs-Gateways (einschließlich Stripev2) Senden Sie den vollständigen base-64-codierten Tokenstring an Ihre Zahlungs-Gateway-API, um die Zahlung zu verarbeiten. Die Tokenstruktur für die Zahlungsmethode von Google Pay enthält verschlüsselte Felder, die Ihr Zahlungs-Gateway zur Verarbeitung der Zahlung entschlüsseln kann.

Beispiel für decodierte Nutzlast

Die folgenden Beispiele zeigen decodierte Nutzlasten, die im Feld instrumentToken für verschiedene Zahlungsgateways zurückgegeben werden:

JSON

Dieses JSON-Beispiel stellt ein decodiertes Zahlungstoken bei Verwendung von Braintree dar. Extrahieren Sie den Wert des Felds nonce und senden Sie ihn an Braintree, um die Zahlung zu verarbeiten.

{
  "androidPayCards": [{
    "type": "AndroidPayCard",
    "nonce": "aeeb8297-4242...",
    "description": "AndroidPay",
    "consumed": false,
    "details": {
      "cardType": "Visa",
      "lastTwo": "29"
    }
  }]
}

Wenn Google Pay im Braintree-Steuerfeld nicht aktiviert ist, wird das Feld instrumentToken in den folgenden Fehler decodiert:

{
  "error": {
    "message": "Record not found"
  },
  "fieldErrors": []
}

JSON

Dieses JSON-Beispiel stellt ein decodiertes Zahlungstoken bei Verwendung von Stripe dar. Extrahieren Sie den Wert des Felds id und senden Sie ihn an Stripe, um die Zahlung zu verarbeiten.

{
  "id": "tok_abcdefg1234...",
  "object": "token",
  "card": {
    "id": "card_abcde...",
    "object": "card",
    "address_city": null,
    "address_country": null,
    "address_line1": null,
    "address_line1_check": null,
    "address_line2": null,
    "address_state": null,
    "address_zip": null,
    "address_zip_check": null,
    "brand": "Visa",
    "country": "US",
    "cvc_check": null,
    "dynamic_last4": "1234",
    "exp_month": 1,
    "exp_year": 2019,
    "funding": "credit",
    "last4": "1234",
    "metadata": {},
    "name": null,
    "tokenization_method": "android_pay"
  },
  "client_ip": "74.125.177.36",
  "created": 1500483670,
  "livemode": false,
  "type": "card",
  "used": false
}

JSON

Dieses JSON-Beispiel stellt ein decodiertes Zahlungstoken bei Verwendung von Stripev2 dar.

  {
  "protocolVersion":"ECv2",
  "signature":"MEQCIH6Q4OwQ0jAceFEkGF0JID6sJNXxOEi4r+mA7biRxqBQAiAondqoUpU/bdsrAOpZIsrHQS9nwiiNwOrr24RyPeHA0Q\u003d\u003d",
  "intermediateSigningKey":{
    "signedKey": "{\"keyExpiration\":\"1542323393147\",\"keyValue\":\"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE/1+3HBVSbdv+j7NaArdgMyoSAM43yRydzqdg1TxodSzA96Dj4Mc1EiKroxxunavVIvdxGnJeFViTzFvzFRxyCw\\u003d\\u003d\"}",
    "signatures": ["MEYCIQCO2EIi48s8VTH+ilMEpoXLFfkxAwHjfPSCVED/QDSHmQIhALLJmrUlNAY8hDQRV/y1iKZGsWpeNmIP+z+tCQHQxP0v"]
  },
  "signedMessage":"{\"tag\":\"jpGz1F1Bcoi/fCNxI9n7Qrsw7i7KHrGtTf3NrRclt+U\\u003d\",\"ephemeralPublicKey\":\"BJatyFvFPPD21l8/uLP46Ta1hsKHndf8Z+tAgk+DEPQgYTkhHy19cF3h/bXs0tWTmZtnNm+vlVrKbRU9K8+7cZs\\u003d\",\"encryptedMessage\":\"mKOoXwi8OavZ\"}"
}
  

JSON

Dieses JSON-Beispiel stellt ein decodiertes Zahlungstoken bei Verwendung von Square dar.

  {
    "signature": "MEYCIQCMAsWCrY2GfHM/gMAKiK3QCKJJOIkjZeTQGzcdWgvrhwIhAJ3mXwe+wmU9z+Apv1rTDsCVQBzayvWzT4ywxytrSPla",
    "protocolVersion": "ECv1",
    "signedMessage": "{\"encryptedMessage\":\"WkYz21EYxojwTqWh6A3oYXtmctu1PlqF+tNYPA4cq017nqj16Ge7kaVR7MI1XG1OrCmcMwP20u5Zb5E28XYan8UI8M4L120orvE9XU1ivZuO4Myq2O3ue8v0lY1MDx8Mnk+5mkAv1kLmzJc91gEQ2leIwrPuMDYqsQUHzTR3Jikh5/v+iWRkyQPKKxgj5c6Erdu/pkg1xV6fQJcHNdq9Jw11zl95x6eQurxw2Uy8v811azGr+noKJbw0uye72MkhmzMS5QKOzwGT9nBfO+zPLYSEewsdOcPbNZF94zk/KU9nxom/gQ+eYEMIZvOj9lO4gQqDqR6DyWyStk7MjeXQTvXWZBI1JpqvOrlTHL0Ct18RpbfOio7hAtafzb0NnqEKlsun+SSpJmvI7U6n6Cnu1JUMUGfT/Jsi6RJ3N6pRw2BubeR1925Xl3jXQnlz5io6X1YRlAcnshZyf6CjBpKES32aTf1m1IHRhZ2Jj6i/g7Y\\u003d\",\"ephemeralPublicKey\":\"BDQA0Cf//BHPcnB0R/GRrWa2g7T1QF97eOhAYy7l45M+kJnsoeL9OaUQV/KIMLvcgbmKkZIm2FQeL7ftd6S4q4c\\u003d\",\"tag\":\"DHtVyXNo+PDr7Thi/EjBBbsr2k7y1SwGIn0D9mmPTJc\\u003d\"}"
  }
    

Damit die Zahlung mit dem Token verarbeitet werden kann, geben Sie den base64-codierten Tokenstring mit Ihrer Anfrage an die Zahlungs-API von Square im Feld source_id mit dem Präfix gpay: zurück.

  {
    "idempotency_key": "ID",
    "source_id": "gpay:GOOGLE_PAY_BASE64_ENCODED_TOKEN",
    "amount_money": {
        "amount": 50,
        "currency": "USD"
    },
    "location_id": "LOCATION_ID",
    "billing_address": {
        "postal_code": "11111"
    }
  }

Im folgenden Node.js-Beispiel wird die base-64-codierte instrumentToken aus Braintree decodiert:

Node.js

function decodeToken(instrumentToken) {
  let decodedString = new Buffer(instrumentToken, 'base64').toString('ascii')
  if (decodedString.androidPayCards) {
    return decodedString.androidPayCards[0].nonce;
  }
}