Dopo il pagamento chiama, l'utente esamina il carrello aggiornato con tasse, spese di spedizione, sconti e gli altri addebiti che restituisci. L'utente conferma e invia l'ordine e Google invia al tuo endpoint di fulfillment una richiesta JSON contenente le informazioni relative all'ordine. Il servizio web deve ricevere questo ordine, elaborarlo e rispondere a Google indicando lo stato dell'ingiunzione.
Questa sezione descrive il formato del messaggio di richiesta di ordine inviato da Google.
chiamato SubmitOrderRequestMessage
, e il formato del messaggio di risposta
da fornire, denominato
SubmitOrderResponseMessage
Per ulteriori informazioni sul ciclo di vita dell'evasione degli ordini, consulta
Panoramica dell'evasione degli ordini.
Implementazione dell'evasione degli ordini
Il servizio web end-to-end per l'ordine creato per funzionare con l'ordine end-to-end deve
Includere un endpoint URL per la ricezione di messaggi con gli ordini da parte di Google. Per l'ordine
l'elaborazione, il tuo web service riceve un SubmitOrderRequestMessage
in JSON
come richiesta POST di Google. Questa richiesta contiene un ordine del cliente,
incluse tasse, commissioni e dati di pagamento. Dopo aver ricevuto un ordine di invio
richiesta, il servizio web deve:
- Controllare l'idoneità delle transazioni, ad esempio la verifica della carta o il rilevamento di attività fraudolente.
- Crea un ordine nel tuo sistema.
- Autorizza il metodo di pagamento e chiama l'API Charge dell'elaboratore dei pagamenti, se applicabile.
- Rispondi indicando lo stato appropriato dell'ingiunzione:
CREATED
.CONFIRMED
oREJECTED
.
Dopo aver elaborato l'ordine, il tuo codice di evasione deve fornire una risposta
sotto forma di messaggio JSON SubmitOrderResponseMessage
a Google.
Per ulteriori informazioni sul servizio web di evasione degli ordini end-to-end requisiti di implementazione, consulta la panoramica sull'evasione degli ordini.
Messaggio di richiesta dell'ordine
Quando un cliente sceglie di effettuare un ordine durante il flusso end-to-end dell'ordine,
Google invia una richiesta al tuo servizio web con un messaggio JSON chiamato
SubmitOrderRequestMessage
che contiene i seguenti dati:
- Intent:il campo
inputs[0].intent
del corpo di ogni richiesta di invio dell'ordine contiene il valore della stringaactions.intent.TRANSACTION_DECISION
. - Ordine: il campo
inputs[0].arguments[0].transactionDecisionValue
di un invia richiesta di ordine contiene un oggettoOrder
che rappresenta dell'ordine del cliente, insieme ai dati di pagamento. - Flag sandbox: il campo
isInSandbox
di una richiesta di invio di un ordine indica se la transazione utilizza pagamenti sandbox.
Esempio di richiesta di ordine
Di seguito è riportato un esempio di 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 }
Messaggio di risposta all'ordine
Dopo aver ricevuto una richiesta, il servizio web end-to-end dell'utente elabora la
e invia un SubmitOrderResponseMessage
che include
i seguenti dati:
OrderUpdate
: un oggetto contenente lo stato dell'ordine e qualsiasi le azioni successive all'ordine a disposizione dell'utente, ad esempio contattare l'assistenza e visualizzare i dettagli dell'ordine, che definisci CampofinalResponse.richResponse.items[0].structuredResponse.orderUpdate
di la risposta.
Campo di aggiornamento dell'ordine
Quando il tuo servizio web invia un SubmitOrderResponseMessage
, contiene un
Campo OrderUpdate
che include i seguenti campi:
actionOrderId
: l'ID univoco dell'ordine, utilizzato per indicare in modo univoco identificare l'ordine nel sistema e farvi riferimento quando invii aggiornamenti sugli ordini.orderState
: un oggettoOrderState
che rappresenta lo stato dell'ordine.orderManagementActions
: azioni di post-ordine a disposizione dell'utente, ad esempio come contattare l'assistenza clienti e visualizzare i dettagli degli ordini.totalPrice
: il prezzo totale dell'ordine. Questa opzione è facoltativa. Solo invio se il prezzo totale dell'ordine è cambiato dopo l'invio dell'ordine.
Un ordine può trovarsi in uno dei seguenti stati:
CREATED
: l'endpoint di evasione degli ordini ha elaborato l'ordine. ma il fornitore non ha ancora confermato l'ordine.CONFIRMED
: l'endpoint di evasione degli ordini ha elaborato l'ordine. e il fornitore ha confermato l'ordine.REJECTED
: si è verificato un problema e non è stato possibile completare l'endpoint Creare o confermare l'ordine, ma potrebbero verificarsi problemi con il pagamento.
Se imposti lo stato di un ordine REJECTED
, specifica il motivo nel
Campo rejectionInfo
di OrderUpdate
. Utilizza le funzionalità di
FoodOrderUpdateExtension.FoodOrderErrors
valori insieme a
rejectionInfo
di tipo UNKNOWN
e fornisci una descrizione.
Esempio di risposta all'ordine
Di seguito è riportato un esempio di 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" } } } } ] } } }
Richiesta non riuscita
Se la richiesta di invio non va a buon fine, è necessario impostare SubmitOrderResponseMessage
OrderState.state
a REJECTED
. La risposta deve inoltre
includi RejectionInfo, che contiene un parametro RejectionType
per descrivere il tipo di errore.
Esempio di risposta non riuscita
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" } } } ] } } } ] } } }
Implementazione dell'invio dell'ordine
Quando implementi l'API di invio dell'ordine, segui questi passaggi.
Convalida
- Esegui convalide del servizio, del carrello e delle promozioni come descritto in Configurare Pagamento.
- Restituisci RejectionInfo con uno dei seguenti tipi se necessario:
RejectionInfoType | Caso d'uso |
---|---|
UNAVAILABLE_SLOT |
L'ora di evasione non è più valida. |
PROMO_USER_INELIGIBLE |
Utilizza l'indirizzo email nell'oggetto Contact della richiesta per convalidare l'idoneità alla promozione per l'utente. Vedi l'esempio in Implementare l'invio dell'ordine con le promozioni. |
INELIGIBLE |
|
PAYMENT_DECLINED |
Impossibile elaborare il pagamento. Ad esempio, la causa potrebbe essere una disponibilità insufficiente. |
UNKNOWN |
Per qualsiasi altro errore di convalida. |
Imposta OrderState.state
su REJECTED
in caso di convalida
si sono verificati errori. Facoltativamente, puoi fornire un motivo di rifiuto specifico.
utilizzando l'estensione FoodOrderUpdateExtension.foodOrderErrors
. Vedi esempi in
Invia convalida ordine.
Elabora il pagamento
- Calcola
totalPrice
aggiungendo prezzo del carrello, commissioni, sconto, tasse e mancia. Il valoretotalPrice
deve essere uguale al valoretotalPrice
restituito nel CheckoutResponseMessage e la modifica se la mancia può essere modificata dall'utente, Vedi Prezzo modifiche durante l'invio dell'ordine per ulteriori dettagli. - Elabora l'ordine e il pagamento se restituisci una risposta con uno stato dell'ordine
di
CREATED
oCONFIRMED
. - Assicurati che venga restituito un formato di risposta valido utilizzando i tipi generati creato dallo schema come descritto in generare librerie client.
- Utilizza la
GoogleProvidedPaymentInstrument.
instrumentToken
per elaborare il pagamento. Restituisci RejectionInfo con il tipoPAYMENT_DECLINED
se il pagamento non può essere elaborato. Vedi Procedura pagamenti per ulteriori dettagli. - Inviare una notifica all'utente subito dopo l'elaborazione dell'ordine via email e/o SMS.
Restituisci la risposta
- Imposta OrderState.
state
suCREATED
oCONFIRMED
se non ci siano errori. - Imposta OrderState.
state
suREJECTED
in caso di errori incontrato e includi l'oggetto RejectionInfo con il il valore RejectionInfoType corrispondente. - Imposta OrderUpdate.
orderManagementActions
.