Les commandes de projets de bout en bout permettent de configurer le mode de paiement dans l'environnement de bac à sable lorsque vous utilisez l'environnement de test rapide ou le bac à sable. Lorsque vous testez votre flux de données, vous pouvez basculer entre les modes de paiement "Bac à sable" et "Production". Pour tester les paiements de votre projet de commande de bout en bout sans débiter les cartes, utilisez Sandbox comme mode de paiement. L'environnement de production n'est pas compatible avec le mode de paiement Sandbox.
Configuration
Pour activer le mode de paiement du bac à sable dans l'environnement de bac à sable, procédez comme suit:
- Dans le Centre d'actions, accédez à Configuration > Fonctionnalités.
- Sur la fiche Fonctionnalités du compte, recherchez le bouton radio Mode de paiement.
- Sélectionnez l'option Environnement de simulation, puis cliquez sur Enregistrer les modifications.
Pour activer le mode de paiement dans l'environnement de test rapide, procédez comme suit:
- Dans le Centre des actions, accédez à Flux > Test rapide.
- Cochez la case d'option Utiliser un bac à sable pour GPay.
Lorsque le mode de paiement Environnement de test est sélectionné:
- La commande de bout en bout configure Google Pay pour qu'il renvoie des jetons d'instrument contenant des données de carte de test au lieu des informations de carte réelles.
- Le champ
isInSandbox
est défini surtrue
dans les éléments CheckoutRequestMessage et SubmitOrderRequestMessage.
Les différentes combinaisons d'environnement, de mode de paiement et de isInSandbox sont les suivantes:
Environnement | Mode de paiement | isInSandbox |
---|---|---|
Test rapide | Bac à sable | true |
Test rapide | Production | faux |
Bac à sable | Bac à sable | true |
Bac à sable | Production | faux |
Production | Production | faux |
Message de réponse au règlement
Le CheckoutResponseMessage
envoyé par votre service Web de commande de repas contient PaymentOptions
. Lorsque vous configurez votre page de paiement, vous fournissez des options de paiement d'espace réservé à l'aide d'un exemple de passerelle de paiement.
- Veillez à mettre à jour le
CheckoutResponseMessage
envoyé par votre service Web avec la configuration de tokenisation appropriée.
Exemples d'options de paiement
Voici des exemples d'objets JSON PaymentOptions
à partir d'un CheckoutResponseMessage
pour différentes passerelles de paiement utilisant des clés de bac à sable:
"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\"}} " } }
"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\"}} " } }
"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\"}} " } }
"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\"}} " } }
Signaler des transactions de bac à sable
Lorsque le mode de paiement Sandbox est activé, le champ isInSandbox
est inclus dans la requête et défini sur true
pour les requêtes entrantes vers votre point de terminaison de service Web (CheckoutRequestMessage
et SubmitOrderRequestMessage
). Procédez comme suit lorsque le champ isInSandbox
est défini sur true
:
- Utilisez des clés de bac à sable au lieu de clés de production dans la configuration de tokenisation de votre passerelle de paiement. La plupart des sociétés de traitement des paiements fournissent des clés d'API pour le bac à sable et la production.
- Ne déclenchez aucune communication avec le fournisseur de services Web, généralement un restaurant, car il n'a pas besoin d'être informé des transactions dans l'environnement bac à sable.
Les cartes de crédit de test ne sont pas acceptées, même lorsque l'environnement de test des transactions est activé. Vous devez utiliser une véritable carte de crédit pour effectuer une transaction. Toutefois, les jetons d'instrumentation du bac à sable contiennent des informations sur la carte de test qui ne sont pas facturables.
Traiter les paiements
Lorsqu'un client envoie sa commande, Ordering End-to-End envoie le message SubmitOrderRequestMessage à votre point de terminaison de service Web. Le jeton Google Pay est inclus sous la forme d'une chaîne encodée en base64 dans le champ SubmitOrderRequestMessage
instrumentToken. Pour traiter le paiement du client, effectuez l'une des opérations suivantes, en fonction de votre passerelle de paiement:
Passerelle de paiement | |
---|---|
Stripe ou Braintree | Décodez la chaîne de jeton encodée en base64 et envoyez les données appropriées contenues dans la charge utile du jeton décodé à votre passerelle de paiement pour traiter le paiement. |
Toutes les autres passerelles de paiement (y compris stripev2) | Envoyez la chaîne de jetons complète encodée en base64 à l'API de votre passerelle de paiement pour traiter le paiement. La structure de jeton de mode de paiement Google Pay contient des champs chiffrés que votre passerelle de paiement peut déchiffrer pour traiter le paiement. |
Exemple de charge utile décodée
Les exemples suivants montrent les charges utiles décodées renvoyées dans le champ instrumentToken
pour différentes passerelles de paiement:
Cet exemple JSON représente un jeton de paiement décodé lorsque vous utilisez Braintree. Extrayez la valeur du champ nonce
et envoyez-la à Braintree pour traiter le paiement.
{ "androidPayCards": [{ "type": "AndroidPayCard", "nonce": "aeeb8297-4242...", "description": "AndroidPay", "consumed": false, "details": { "cardType": "Visa", "lastTwo": "29" } }] }
Si Google Pay n'est pas activé dans le panneau de configuration Braintree, le champ instrumentToken
génère l'erreur suivante:
{ "error": { "message": "Record not found" }, "fieldErrors": [] }
Cet exemple de code JSON représente un jeton de paiement décodé lorsque vous utilisez Stripe.
Extrayez la valeur du champ id
et envoyez-la à Stripe pour traiter le paiement.
{ "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 }
Cet exemple de code JSON représente un jeton de paiement décodé lorsque vous utilisez stripev2.
{ "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\"}" }
Cet exemple de code JSON représente un jeton de paiement décodé lorsque vous utilisez Square.
{ "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\"}" }
Pour traiter le paiement à l'aide du jeton, renvoyez la chaîne de jeton encodée en base64 avec votre requête à l'API de paiement de Square dans le champ source_id
, précédée du préfixe gpay: :
{ "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" } }
Voici un exemple Node.js qui décode le instrumentToken
encodé en base64 de Braintree:
function decodeToken(instrumentToken) { let decodedString = new Buffer(instrumentToken, 'base64').toString('ascii') if (decodedString.androidPayCards) { return decodedString.androidPayCards[0].nonce; } }