Configurer Google Checkout

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.

L'élément CheckResponseMessage renvoie le panier non modifié du client ou une erreur.

À 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îne actions.foodordering.intent.CHECKOUT.
  • Panier: le champ inputs[0].arguments[0].extension d'une requête de règlement contient un objet Cart qui représente le panier du client.
  • Livraison ou vente à emporter: le champ d'extension de l'objet Cart contient un objet FoodCartExtension 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.
  • 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: objet cart identique au panier fourni dans CheckoutRequestMessage. Si l'un des contenus du panier doit être modifié, CheckoutResponseMessage doit inclure une FoodErrorExtension avec un ProposedOrder 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 pour PaymentOptions.

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."
                }
              ]
            }
          }
        }
      ]
    }
  }
}