Configurer "Envoyer la commande"

Après l'appel de règlement, l'utilisateur examine le panier mis à jour avec les taxes, les frais de livraison, les remises et les autres frais que vous renvoyez. L'utilisateur confirme et envoie la commande, et Google envoie à votre point de terminaison de traitement une requête JSON contenant les informations de la commande. Votre service Web doit recevoir cette commande, la traiter et répondre à Google en indiquant son état.

Cette section décrit le format du message de requête de commande envoyé par Google, appelé SubmitOrderRequestMessage, et le format du message de réponse que vous devez fournir, appelé SubmitOrderResponseMessage. Pour en savoir plus sur le cycle de vie du traitement des commandes, consultez la section Présentation du traitement des commandes.

Implémentation du traitement des commandes

Le service Web de commande de bout en bout que vous créez pour fonctionner avec la commande de bout en bout doit inclure un point de terminaison d'URL pour recevoir des messages de commande de Google. Pour le traitement des commandes, votre service Web reçoit un SubmitOrderRequestMessage au format JSON sous la forme d'une requête POST de Google. Cette requête contient une commande client, y compris les taxes, les frais et les informations de paiement. Lorsqu'il reçoit une requête d'envoi de commande, votre service Web doit effectuer les opérations suivantes:

  • Vérifier l'éligibilité des transactions (validation de la carte ou détection de fraude, par exemple)
  • Créez une commande dans votre système.
  • Autorisez le mode de paiement et appelez l'API de débit de votre société de traitement des paiements, le cas échéant.
  • Répondez avec l'état approprié de la commande: CREATED, CONFIRMED ou REJECTED.

Une fois la commande traitée, votre code de traitement doit renvoyer à Google une réponse sous la forme d'un message JSON SubmitOrderResponseMessage.

Pour en savoir plus sur les exigences d'implémentation du service Web de traitement de bout en bout de la commande, consultez la présentation du traitement.

Message de demande de commande

Lorsqu'un client choisit de passer une commande lors du parcours de commande de bout en bout, Google envoie une requête à votre service Web avec un message JSON appelé SubmitOrderRequestMessage contenant les données suivantes:

  1. Intent:le champ inputs[0].intent de chaque corps de requête d'envoi de commande contient la valeur de chaîne actions.intent.TRANSACTION_DECISION.
  2. Commande:le champ inputs[0].arguments[0].transactionDecisionValue d'une requête de soumission de commande contient un objet Order qui représente la commande du client à passer, ainsi que les détails de paiement.
  3. Indicateur de bac à sable:le champ isInSandbox d'une requête d'envoi de commande indique si la transaction utilise des paiements dans un bac à sable.

Exemple de demande de commande

Voici une exemple de SubmitOrderRequestMessage :

JSON
{
    "user": {},
    "conversation": {
        "conversationId": "CTKbKfUlHCyDEdcz_5PBJTtf"
    },
    "inputs": [
        {
            "intent": "actions.intent.TRANSACTION_DECISION",
            "arguments": [
                {
                    "transactionDecisionValue": {
                        "order": {
                            "finalOrder": {
                                "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"
                                                ]
                                            }
                                        },
                                        "contact": {
                                            "displayName": "Hab Sy",
                                            "email": "hab9878.sy@gmail.com",
                                            "phoneNumber": "+61000000000",
                                            "firstName": "Hab",
                                            "lastName": "Sy"
                                        }
                                    }
                                },
                                "otherItems": [
                                    {
                                        "name": "Delivery fee",
                                        "type": "DELIVERY",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "3",
                                                "nanos": 500000000
                                            }
                                        }
                                    },
                                    {
                                        "name": "Subtotal",
                                        "type": "SUBTOTAL",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "39",
                                                "nanos": 600000000
                                            }
                                        }
                                    }
                                ],
                                "totalPrice": {
                                    "type": "ESTIMATE",
                                    "amount": {
                                        "currencyCode": "AUD",
                                        "units": "43",
                                        "nanos": 100000000
                                    }
                                },
                                "extension": {
                                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension"
                                }
                            },
                            "googleOrderId": "01412971004192156198",
                            "orderDate": "2020-10-22T09:02:06.173Z",
                            "paymentInfo": {
                                "displayName": "Pay when you get your food",
                                "paymentType": "ON_FULFILLMENT"
                            }
                        }
                    }
                }
            ]
        }
    ],
    "directActionOnly": true,
    "isInSandbox": true
}
    

Message de réponse à la commande

Une fois qu'il a reçu une requête, votre service Web de bout en bout pour la commande la traite et renvoie un SubmitOrderResponseMessage qui inclut les données suivantes:

  • OrderUpdate: objet contenant l'état de la commande et toutes les actions post-commande disponibles pour l'utilisateur, telles que contacter l'assistance et afficher les détails de la commande, que vous définissez dans le champ finalResponse.richResponse.items[0].structuredResponse.orderUpdate de la réponse.

Champ "Informations sur la commande"

Lorsque votre service Web envoie un SubmitOrderResponseMessage, il contient un champ OrderUpdate qui inclut les champs suivants:

  • actionOrderId: identifiant unique de la commande, qui permet de l'identifier de manière unique dans votre système et de vous y référer lorsque vous envoyez des mises à jour ultérieures.
  • orderState: objet OrderState représentant l'état de la commande.
  • orderManagementActions: actions post-commande disponibles pour l'utilisateur, telles que contacter le service client et consulter les détails de la commande.
  • totalPrice: prix total de la commande. Cette opération est facultative. N'envoyez ce message que si le prix total de la commande a changé après son envoi.

Une commande peut avoir l'un des états suivants:

  • CREATED: votre point de terminaison de traitement des commandes a bien traité la commande, mais le fournisseur ne l'a pas encore confirmée.
  • CONFIRMED: votre point de terminaison de traitement a bien traité la commande, et le fournisseur l'a confirmée.
  • REJECTED: un problème est survenu et votre point de terminaison de traitement des commandes n'a pas pu créer ni confirmer la commande, ce qui peut inclure des problèmes de paiement.

Si vous définissez un état REJECTED pour une commande, spécifiez le motif dans le champ rejectionInfo de OrderUpdate. Utilisez des valeurs FoodOrderUpdateExtension.FoodOrderErrors avec rejectionInfo de type UNKNOWN et fournissez une description.

Exemple de réponse à une commande

Voici une exemple de SubmitOrderResponseMessage :

JSON
{
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "1603357328160",
              "orderState": {
                "state": "CONFIRMED",
                "label": "Pending"
              },
              "updateTime": "2020-10-22T02:02:08-07:00",
              "orderManagementActions": [
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Call customer service",
                    "openUrlAction": {
                      "url": "tel:+61234561000"
                    }
                  }
                },
                {
                  "type": "VIEW_DETAILS",
                  "button": {
                    "title": "View order details",
                    "openUrlAction": {
                      "url": "https://partner.com/view/orderstatus"
                    }
                  }
                }
              ],
              "receipt": {
                "userVisibleOrderId": "BXZ-1603357328"
              }
            }
          }
        }
      ]
    }
  }
}

Échec de la requête

Si une requête d'envoi échoue, SubmitOrderResponseMessage doit définir OrderState.state sur REJECTED. La réponse doit également inclure RejectionInfo, qui contient un objet RejectionType pour décrire le type d'erreur.

Exemple de réponse non réussie

JSON
{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "sample_action_order_id",
              "orderState": {
                "state": "REJECTED",
                "label": "Order rejected"
              },
              "updateTime": "2017-05-10T02:30:00.000Z",
              "rejectionInfo": {
                "type": "PAYMENT_DECLINED",
                "reason": "Insufficient funds"
              },
              "orderManagementActions": [
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Contact customer service",
                    "openUrlAction": {
                      "url": "mailto:support@example.com"
                    }
                  }
                },
                {
                  "type": "EMAIL",
                  "button": {
                    "title": "Email restaurant",
                    "openUrlAction": {
                      "url": "mailto:person@example.com"
                    }
                  }
                },
                {
                  "type": "CALL",
                  "button": {
                    "title": "Call restaurant",
                    "openUrlAction": {
                      "url": "tel:+16505554679"
                    }
                  }
                },
                {
                  "type": "VIEW_DETAILS",
                  "button": {
                    "title": "View order",
                    "openUrlAction": {
                      "url": "https://orderview.partner.com?orderid=sample_action_order_id"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
    

Implémentation de l'envoi de la commande

Suivez les étapes ci-dessous pour implémenter l'API SendOrder.

Validation

  1. Effectuez les validations du service, du panier et de la promotion comme indiqué dans la section Configurer le règlement.
  2. Renvoyez RejectionInfo avec l'un des types suivants si nécessaire:
RejectionInfoType Cas d'utilisation
UNAVAILABLE_SLOT Le délai de traitement n'est plus valide.
PROMO_USER_INELIGIBLE Utilisez l'adresse e-mail dans l'objet Contact de la requête pour valider l'éligibilité de l'utilisateur à la promotion. Consultez l'exemple dans Implémenter l'envoi de commandes avec des promotions.
INELIGIBLE
  • Les informations utilisateur, telles que le numéro de téléphone ou l'adresse e-mail, ne sont pas valides.
  • Votre moteur de gestion des risques détecte une fraude.
PAYMENT_DECLINED Le paiement ne peut pas être traité. Cela peut être dû, par exemple, à des fonds insuffisants.
UNKNOWN Pour toute autre erreur de validation.

Définissez OrderState.state sur REJECTED en cas d'erreurs de validation. Vous pouvez éventuellement indiquer un motif de refus spécifique à l'aide de FoodOrderUpdateExtension.foodOrderErrors. Consultez des exemples dans la section Envoyer la validation de la commande.

Traiter le paiement

  1. Calculez le totalPrice en ajoutant le prix du panier, les frais, la remise, les taxes et les pourboires. totalPrice doit être identique à totalPrice renvoyé dans CheckoutResponseMessage, plus la modification du montant du pourboire si celui-ci peut être modifié par l'utilisateur. Pour en savoir plus, consultez Changements de prix lors de l'envoi de la commande.
  2. Traitez la commande et le paiement si vous renvoyez une réponse avec un état de commande CREATED ou CONFIRMED.
  3. Assurez-vous qu'un format de réponse valide est renvoyé à l'aide de types générés à partir du schéma, comme décrit dans la section Générer des bibliothèques clientes.
  4. Utilisez GoogleProvidedPaymentInstrument.instrumentToken pour traiter le paiement. Renvoyez RejectionInfo avec le type PAYMENT_DECLINED si le paiement ne peut pas être traité. Pour en savoir plus, consultez la section Traiter les paiements.
  5. Informez l'utilisateur immédiatement après le traitement de la commande par e-mail et/ou SMS.

Renvoyer la réponse

  1. Définissez OrderState.state sur CREATED ou CONFIRMED en l'absence d'erreurs.
  2. Définissez OrderState.state sur REJECTED en cas d'erreurs et incluez l'objet RejectionInfo avec le RejectionInfoType correspondant.
  3. Définissez OrderUpdate.orderManagementActions.