Configurer "Envoyer la commande"

Après le paiement appel, l'utilisateur vérifie le panier mis à jour avec les taxes, les frais de livraison, les remises et d'autres frais que vous renvoyez. L'utilisateur confirme et envoie la commande et Google envoie à votre point de terminaison de fulfillment une requête JSON contenant les les informations de la commande. Votre service Web doit recevoir cette commande, la traiter et de 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 la Présentation du fulfillment

Implémentation du traitement des commandes

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

  • Vérifier l'éligibilité des transactions, telles que la validation de la carte ou la détection de fraudes
  • Créez une commande dans votre système.
  • Autorisez le mode de paiement et appelez l'API de paiement 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 fulfillment doit fournir une réponse sous la forme d'un message JSON SubmitOrderResponseMessage envoyé à Google.

Pour en savoir plus sur le service Web de traitement des commandes de bout en bout exigences de mise en œuvre, consultez la présentation du fulfillment.

Message de demande de commande

Lorsqu'un client choisit de passer une commande pendant le 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: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. Order (Ordre) : le champ inputs[0].arguments[0].transactionDecisionValue d'un d'envoi de commande contient un objet Order qui représente la commande du client, ainsi que les détails du paiement.
  3. Indicateur de bac à sable:le champ isInSandbox d'une demande d'envoi de commande indique si la transaction utilise les paiements via le bac à sable.

Exemple de requête 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 de commande

Après réception d'une demande, votre service Web de commande de bout en bout traite et renvoie un SubmitOrderResponseMessage qui inclut la les données suivantes:

  • OrderUpdate: objet contenant l'état de la commande actions post-commande dont dispose l'utilisateur, comme contacter l'assistance et d'affichage des détails de la commande, que vous définissez dans Champ finalResponse.richResponse.items[0].structuredResponse.orderUpdate de la réponse.

Champ de mise à jour de la commande

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

  • actionOrderId: identifiant unique de la commande, utilisé pour d'identifier la commande dans votre système et de s'y référer lors de l'envoi des mises à jour de commandes.
  • orderState: objet OrderState représentant l'état de la commande.
  • orderManagementActions: actions après commande disponibles pour l'utilisateur, telles que comme contacter le service client et consulter les détails des commandes.
  • totalPrice: prix total de la commande. Ceci est facultatif. Envoyer uniquement si le prix total de la commande a changé après l'envoi de celle-ci.

Une commande peut présenter l'un des états suivants:

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

Si vous définissez l'état d'une commande sur l'état REJECTED, indiquez le motif dans le champ Champ rejectionInfo de OrderUpdate. Utilisez Valeurs FoodOrderUpdateExtension.FoodOrderErrors associées à rejectionInfo de type UNKNOWN, puis fournissez une description.

Exemple de réponse de 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 une demande d'envoi échoue, SubmitOrderResponseMessage doit définir la valeur OrderState.state sur REJECTED. La réponse doit également incluez l'élément RejectionInfo, qui contient un élément 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"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
    

Envoyer l'implémentation de la commande

Pour implémenter l'API d'envoi de commande, procédez comme suit :

Validation

  1. Effectuez les validations des services, des paniers et des promotions comme vous le faites dans la section Configurer Règlement.
  2. Renvoyez des informations sur un refus (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 requête afin de valider l'éligibilité de la promotion pour l'utilisateur. Consultez l'exemple de la section Implémenter l'envoi d'une commande avec 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 risque détecte une fraude.
PAYMENT_DECLINED Impossible de traiter le paiement. Cela peut être dû, par exemple, à un solde insuffisant.
UNKNOWN Pour toute autre erreur de validation

Définissez OrderState.state sur REJECTED en cas de validation se sont produites. Vous pouvez éventuellement indiquer un motif de refus spécifique à l'aide de FoodOrderUpdateExtension.foodOrderErrors. Voir les exemples en Envoyer la validation de la commande

Traiter le paiement

  1. Calculez la totalPrice en ajoutant le prix du panier, les frais, la remise, les taxes et les pourboires. La valeur totalPrice doit être identique à la valeur totalPrice renvoyée. dans CheckoutResponseMessage, plus la modification de le montant de la pourboire s'il peut être modifié par l'utilisateur. Voir Prix modifications lors de l'envoi de la commande.
  2. Traiter la commande et le paiement si vous renvoyez une réponse indiquant l'état de la commande de CREATED ou CONFIRMED.
  3. S'assurer qu'un format de réponse valide est renvoyé en utilisant les types générés créés à partir du schéma, comme décrit dans générer des bibliothèques clientes.
  4. Utilisez les GoogleProvidedPaymentInstrument.instrumentToken pour traiter le paiement. Renvoyer une information de rejet : RejectionInfo avec le type PAYMENT_DECLINED si le paiement ne peut pas être traité. Voir Procédure paiements pour en savoir plus.
  5. informer 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 si il n'y a aucune erreur.
  2. Définissez OrderState.state sur REJECTED en cas d'erreur rencontré et d'inclure l'objet RejectionInfo avec le paramètre l'RejectionInfoType correspondant.
  3. Définissez la valeur OrderUpdate.orderManagementActions.