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
ouREJECTED
.
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:
- Intent:champ
inputs[0].intent
de chaque corps de requête d'envoi de commande contient la valeur de chaîneactions.intent.TRANSACTION_DECISION
. - Order (Ordre) : le champ
inputs[0].arguments[0].transactionDecisionValue
d'un d'envoi de commande contient un objetOrder
qui représente la commande du client, ainsi que les détails du paiement. - 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 ChampfinalResponse.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
: objetOrderState
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
- Effectuez les validations des services, des paniers et des promotions comme vous le faites dans la section Configurer Règlement.
- 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 |
|
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
- Calculez la
totalPrice
en ajoutant le prix du panier, les frais, la remise, les taxes et les pourboires. La valeurtotalPrice
doit être identique à la valeurtotalPrice
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. - Traiter la commande et le paiement si vous renvoyez une réponse indiquant l'état de la commande
de
CREATED
ouCONFIRMED
. - 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.
- Utilisez les
GoogleProvidedPaymentInstrument.
instrumentToken
pour traiter le paiement. Renvoyer une information de rejet : RejectionInfo avec le typePAYMENT_DECLINED
si le paiement ne peut pas être traité. Voir Procédure paiements pour en savoir plus. - informer l'utilisateur immédiatement après le traitement de la commande par e-mail et/ou SMS.
Renvoyer la réponse
- Définissez OrderState.
state
surCREATED
ouCONFIRMED
si il n'y a aucune erreur. - Définissez OrderState.
state
surREJECTED
en cas d'erreur rencontré et d'inclure l'objet RejectionInfo avec le paramètre l'RejectionInfoType correspondant. - Définissez la valeur OrderUpdate.
orderManagementActions
.