Le processus de règlement est invoqué lorsqu'un utilisateur crée un panier. Le contenu du panier de l'utilisateur et les détails de la commande sont envoyés à votre service Web Order with Google. Ces informations sont validées par votre service Web, puis vous pouvez continuer ou modifier leur panier si nécessaire.
Le gestionnaire de règlement de votre service Web doit répondre aux requêtes POST. Lorsqu'un client choisit de payer, Google envoie au service Web Order with Google un corps de requête JSON sous la forme d'un CheckoutRequestMessage
contenant les détails du Cart
d'un client. Votre service Web répond ensuite par une réponse CheckoutResponseMessage
. Le schéma suivant illustre le processus.
À la réception d'une demande de règlement, votre service Web Order with Google doit:
- Vérifiez la validité du panier en fonction du prix, de la disponibilité et du service du fournisseur.
- Calculez le prix total (incluant les remises, les taxes et les frais de livraison).
- Si l'opération réussit, répondez avec un panier non modifié.
- Si l'opération échoue, répondez avec un message d'erreur et une nouvelle proposition de commande.
Avant de commencer à mettre en œuvre le règlement, nous vous recommandons de consulter la documentation de présentation du fulfillment.
Message de demande de règlement
Afin de valider le panier du client, lorsqu'un client choisit de procéder au paiement, Google envoie une requête à votre service Web avec un corps JSON sous la forme d'un CheckoutRequestMessage
. La commande du client n'est envoyée que plus tard dans le flux Order with Google.
Les données contenues dans un CheckoutRequestMessage
incluent les éléments suivants:
- Intent: le champ
inputs[0].intent
du corps de chaque requête de règlement contient la valeur de chaîneactions.foodordering.intent.CHECKOUT
. - Panier: le champ
inputs[0].arguments[0].extension
d'une requête de règlement contient un objetCart
qui représente le panier du client. - Livraison ou vente à emporter: le champ d'extension de l'objet
Cart
contient un objetFoodCartExtension
qui spécifie les propriétés de livraison ou de vente à emporter :- Pour les commandes à livrer, l'objet
FoodCartExtension
inclut l'adresse de livraison. - Pour les commandes à emporter ou à emporter, l'objet
FoodCartExtension
ne contient aucune information sur la localisation.
- Pour les commandes à livrer, l'objet
- Sandbox: le champ
isInSandbox
d'une requête de règlement contient une valeur booléenne indiquant si la transaction utilise des paiements en bac à sable.
Exemple de demande de paiement
Voici un exemple de CheckoutRequestMessage
:
{
"user": {},
"conversation": {
"conversationId": "CTZbZfUlHCybEdcz_5PB3Ttf"
},
"inputs": [
{
"intent": "actions.foodordering.intent.CHECKOUT",
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.Cart",
"merchant": {
"id": "restaurant/Restaurant/QWERTY",
"name": "Tep Tep Chicken Club"
},
"lineItems": [
{
"name": "Spicy Fried Chicken",
"type": "REGULAR",
"id": "299977679",
"quantity": 2,
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "39",
"nanos": 600000000
}
},
"offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
}
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
},
"location": {
"coordinates": {
"latitude": -33.8376441,
"longitude": 151.0868736
},
"formattedAddress": "Killoola St, 1, Concord West NSW 2138",
"zipCode": "2138",
"city": "Concord West",
"postalAddress": {
"regionCode": "AU",
"postalCode": "2138",
"administrativeArea": "NSW",
"locality": "Concord West",
"addressLines": [
"Killoola St",
"1"
]
}
}
}
}
}
]
}
],
"directActionOnly": true,
"isInSandbox": true
}
Message de réponse au règlement
Après avoir reçu une requête du service Order with Google, votre service Web de règlement doit le traiter et répondre avec un CheckoutResponseMessage
. Le champ CheckoutResponseMessage
doit couvrir une requête ayant abouti ou ayant échoué.
Demande acceptée
Si une requête de paiement aboutit, CheckoutResponseMessage
doit inclure ProposedOrder
et PaymentOptions
:
ProposedOrder
cart
: objetcart
identique au panier fourni dansCheckoutRequestMessage
. Si l'un des contenus du panier doit être modifié,CheckoutResponseMessage
doit inclure uneFoodErrorExtension
avec unProposedOrder
corrigé.otherItems
: articles ajoutés par le fournisseur, tels que les frais de livraison, les taxes et autres frais. Peut également contenir des bonus fournis par l'utilisateur.totalPrice
: prix total de la commande.extension
:FoodOrderExtension
qui définit les informations de traitement de la commande, telles que le délai de livraison.
PaymentOptions
- La configuration du traitement des paiements sera décrite plus loin dans Configurer Google Pay.
Vous pouvez utiliser un espace réservé JSON dans votre
CheckoutResponseMessage
jusqu'à ce que vous soyez prêt à implémenter le traitement des paiements. - Pour ajouter des options de paiement d'espace réservé dans votre
CheckoutResponseMessage
, consultez l'exemple ci-dessous, qui utilise un exemple de passerelle de paiement pourPaymentOptions
.
- La configuration du traitement des paiements sera décrite plus loin dans Configurer Google Pay.
Vous pouvez utiliser un espace réservé JSON dans votre
Exemple de réponse réussie
{
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"checkoutResponse": {
"proposedOrder": {
"cart": {
"merchant": {
"id": "restaurant/Restaurant/QWERTY",
"name": "Tep Tep Chicken Club"
},
"lineItems": [
{
"name": "Spicy Fried Chicken",
"type": "REGULAR",
"id": "299977679",
"quantity": 2,
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "39",
"nanos": 600000000
}
},
"offerId": "MenuItemOffer/QWERTY/scheduleId/496/itemId/143",
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodItemExtension"
}
}
],
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodCartExtension",
"fulfillmentPreference": {
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
},
"location": {
"coordinates": {
"latitude": -33.8376441,
"longitude": 151.0868736
},
"formattedAddress": "Killoola St, 1, Concord West NSW 2138",
"zipCode": "2138",
"city": "Concord West",
"postalAddress": {
"regionCode": "AU",
"postalCode": "2138",
"administrativeArea": "NSW",
"locality": "Concord West",
"addressLines": [
"Killoola St",
"1"
]
}
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "43",
"nanos": 100000000
}
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
"availableFulfillmentOptions": [
{
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
}
]
},
"otherItems": [
{
"name": "Delivery fee",
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "3",
"nanos": 500000000
}
},
"type": "DELIVERY"
}
]
},
"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\":\"AUD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"43.1\"}} "
}
},
"additionalPaymentOptions": [
{
"actionProvidedOptions": {
"paymentType": "ON_FULFILLMENT",
"displayName": "Pay when you get your food.",
"onFulfillmentPaymentData": {
"supportedPaymentOptions": []
}
}
}
]
}
}
}
]
}
}
}
Échec de la demande
Si une requête de paiement échoue, CheckoutResponseMessage
doit inclure FoodErrorExtension
, qui contient une liste d'éléments FoodOrderError
décrivant les erreurs qui se sont produites. Si des erreurs peuvent être récupérées dans la commande, comme la modification du prix d'un article dans le panier, l'attribut FoodErrorExtension
doit inclure l'attribut correctedProposedOrder
.
Exemple de réponse infructueuse
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "CLOSED",
"description": "The restaurant is closed."
}
]
}
}
}
]
}
}
}