Configurer "Envoyer la commande"

Après l'appel de paiement, l'utilisateur consulte 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 l'état de la commande.

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

Mise en œuvre du traitement des commandes

Le service Web de commande de bout en bout que vous créez pour fonctionner avec le service de commande de bout en bout doit inclure un point de terminaison d'URL pour recevoir les messages d'ordre de Google. Pour le traitement des commandes, votre service Web reçoit un SubmitOrderRequestMessage au format JSON en tant que requête POST de Google. Cette requête contient une commande client, y compris les taxes, les frais et les informations de paiement. À la réception d'une demande d'envoi de commande, votre service Web doit procéder comme suit:

  • Vérifier l'éligibilité des transactions, comme la validation de la carte ou la détection des fraudes
  • Créez une commande dans votre système.
  • Autorisez le mode de paiement et appelez l'API de facturation de votre société de traitement des paiements, le cas échéant.
  • Répondez en indiquant 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 de mise en œuvre du service Web de traitement de commande de bout en bout, consultez la présentation du traitement.

Message de demande de commande

Lorsqu'un client choisit de passer une commande au cours du flux 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 la requête d'envoi contient la valeur de la chaîne actions.intent.TRANSACTION_DECISION.
  2. Commande:le champ inputs[0].arguments[0].transactionDecisionValue d'une requête d'envoi de commande contient un objet Order qui représente la commande à passer du client, ainsi que les détails du paiement.
  3. Indicateur sandbox:le champ isInSandbox d'une requête d'envoi de commande indique si la transaction utilise les paiements en 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

Après avoir reçu une requête, votre service Web de commande de bout en bout la traite et renvoie un SubmitOrderResponseMessage contenant les données suivantes:

  • OrderUpdate: objet contenant l'état de la commande et toutes les actions post-commande disponibles pour l'utilisateur, comme 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 de mise à jour de la commande

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

  • actionOrderId: ID unique de la commande, permettant d'identifier la commande de manière unique dans votre système et de s'y référer lors de l'envoi de 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 afficher 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 l'envoi de la commande.

Une commande peut être associée à l'un des états suivants:

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

Si vous définissez une commande sur l'état REJECTED, indiquez le motif dans le champ rejectionInfo de OrderUpdate. Utilisez des valeurs FoodOrderUpdateExtension.FoodOrderErrors conjointement avec des 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 demande

Si l'envoi d'une requête é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 indiquant un échec

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

Lors de l'implémentation de l'API d'envoi de commande, procédez comme suit :

Validation

  1. Effectuez les validations de service, de panier et de promotion comme indiqué dans la section Configurer le paiement.
  2. Renvoyez RejectionInfo avec l'un des types suivants si nécessaire:
RejectionInfoType Cas d'utilisation
UNAVAILABLE_SLOT L'heure de traitement n'est plus valide.
PROMO_USER_INELIGIBLE Utilisez l'adresse e-mail dans l'objet Contact de la demande pour valider l'éligibilité de l'utilisateur à la promotion. Consultez l'exemple dans la section Intégrer l'envoi d'une commande avec des promotions.
INELIGIBLE
  • Les informations sur l'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 Impossible de traiter le paiement. Cela peut être dû, par exemple, à des fonds insuffisants.
UNKNOWN Pour toute autre erreur de validation.

Définissez OrderState.state sur REJECTED si des erreurs de validation se produisent. Vous pouvez éventuellement indiquer un motif de refus spécifique à l'aide de FoodOrderUpdateExtension.foodOrderErrors. Consultez des exemples dans la section Valider une commande.

Traiter le paiement

  1. Calculez la valeur totalPrice en ajoutant le prix du panier, les frais, la remise, les taxes et les frais. La valeur totalPrice doit être identique à la valeur totalPrice renvoyée dans CheckoutResponseMessage, plus la modification du montant des pourboires s'ils peuvent être modifiés par l'utilisateur. Pour en savoir plus, consultez Changements de prix lors de l'envoi de la commande.
  2. traiter la commande et le paiement si vous renvoyez une réponse avec l'état de la commande CREATED ou CONFIRMED ;
  3. Assurez-vous qu'un format de réponse valide est renvoyé en utilisant les 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 de type PAYMENT_DECLINED si le paiement ne peut pas être traité. Pour en savoir plus, consultez Traiter les paiements.
  5. Informez l'utilisateur immédiatement après le traitement de sa commande par e-mail et/ou SMS.

Renvoyer la réponse

  1. Définissez OrderState.state sur CREATED ou CONFIRMED s'il n'y a pas d'erreur.
  2. Définissez OrderState.state sur REJECTED en cas d'erreurs, et incluez l'objet RejectionInfo avec l'RejectionInfoType correspondant.
  3. Définissez OrderUpdate.orderManagementActions.