Configurer les paiements en mode bac à sable

L'ordonnancement de projets de bout en bout permet de configurer le mode de paiement du bac à sable lorsque vous utilisez l'environnement de test rapide ou de bac à sable. Lorsque vous testez votre flux de données, vous pouvez basculer entre les modes de paiement Sandbox et Production. Afin de tester les paiements pour votre projet de commande de bout en bout sans facturer les cartes, utilisez le bac à sable 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:

  1. Dans le Centre d'actions, accédez à Configuration> Fonctionnalités.
  2. Sur la fiche Fonctionnalités du compte, recherchez la case d'option Mode de paiement.
  3. Sélectionnez l'option Bac à sable, puis cliquez sur Enregistrer les modifications.

Fiche des fonctionnalités du compte avec le mode bac à sable sélectionné

Pour activer le mode de paiement sandbox dans l'environnement de test rapide, procédez comme suit:

  1. Dans le Centre d'actions, accédez à Flux> Test rapide.
  2. Sélectionnez la case d'option Use sandbox for GPay (Utiliser le bac à sable pour GPay).

Test rapide avec le mode bac à sable sélectionné

Lorsque le mode de paiement bac à sable est sélectionné:

  • Le service de commande de bout en bout configure Google Pay pour renvoyer des jetons d'instrument qui contiennent des données de carte de test au lieu des informations de carte réelles.
  • Le champ isInSandbox est défini sur true dans CheckoutRequestMessage et SubmitOrderRequestMessage.

Les différentes combinaisons de l'environnement, du mode de paiement et d'isInSandbox sont les suivantes:

Environnement Mode de paiement isInSandbox
Test rapide Bac à sable true
Test rapide Production false
Bac à sable Bac à sable true
Bac à sable Production false
Production Production false

Message de réponse au règlement

Le CheckoutResponseMessage envoyé par votre service Web de commande de repas contient PaymentOptions. Lorsque vous configurez votre processus 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 de modes 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:

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\"}} "
    }
}

Signaler les transactions de bac à sable

Lorsque le mode de paiement du bac à sable 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 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é d'une transaction en bac à sable.

Les cartes de crédit test ne sont pas acceptées, même lorsque le bac à sable des transactions est activé. Vous devez utiliser une carte de crédit réelle pour effectuer une transaction. Toutefois, les jetons d'instrumentation de bac à sable contiennent des informations de carte de test non facturables.

Traiter les paiements

Lorsqu'un client envoie sa commande, le service de commande de bout en bout envoie le message SubmitOrderRequestMessage au point de terminaison de votre service Web. Le jeton Google Pay est inclus en tant que chaîne encodée en base64 dans le champ instrumentToken SubmitOrderRequestMessage. 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ée à votre passerelle de paiement pour traiter le paiement.
Toutes les autres passerelles de paiement (y compris Stripev2) Envoyez la chaîne complète du jeton encodé en base64 à l'API de votre passerelle de paiement pour traiter le paiement. La structure des jetons du mode de paiement de 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 présentent les charges utiles décodées renvoyées dans le champ instrumentToken pour différentes passerelles de paiement:

JSON

Cet exemple JSON représente un jeton de paiement décodé lors de l'utilisation de 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 est décodé en l'erreur suivante:

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

JSON

Cet exemple 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
}

JSON

Cet exemple JSON représente un jeton de paiement décodé lors de l'utilisation de 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\"}"
}
  

JSON

Cet exemple 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é de 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 l'élément instrumentToken encodé en base64 à partir de Braintree:

Node.js

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