Configura Invia ordine

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 o REJECTED.

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:

  1. Intent:il campo inputs[0].intent del corpo di ogni richiesta di invio dell'ordine contiene il valore della stringa actions.intent.TRANSACTION_DECISION.
  2. Ordine: il campo inputs[0].arguments[0].transactionDecisionValue di un invia richiesta di ordine contiene un oggetto Order che rappresenta dell'ordine del cliente, insieme ai dati di pagamento.
  3. Flag sandbox: il campo isInSandbox di una richiesta di invio di un ordine indica se la transazione utilizza pagamenti sandbox.
di Gemini Advanced.

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 Campo finalResponse.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 oggetto OrderState 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

  1. Esegui convalide del servizio, del carrello e delle promozioni come descritto in Configurare Pagamento.
  2. 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
  • Informazioni utente come numero di telefono o email non valide.
  • Il tuo motore dei rischi rileva le frodi.
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

  1. Calcola totalPrice aggiungendo prezzo del carrello, commissioni, sconto, tasse e mancia. Il valore totalPrice deve essere uguale al valore totalPrice 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.
  2. Elabora l'ordine e il pagamento se restituisci una risposta con uno stato dell'ordine di CREATED o CONFIRMED.
  3. Assicurati che venga restituito un formato di risposta valido utilizzando i tipi generati creato dallo schema come descritto in generare librerie client.
  4. Utilizza la GoogleProvidedPaymentInstrument.instrumentToken per elaborare il pagamento. Restituisci RejectionInfo con il tipo PAYMENT_DECLINED se il pagamento non può essere elaborato. Vedi Procedura pagamenti per ulteriori dettagli.
  5. Inviare una notifica all'utente subito dopo l'elaborazione dell'ordine via email e/o SMS.

Restituisci la risposta

  1. Imposta OrderState.state su CREATED o CONFIRMED se non ci siano errori.
  2. Imposta OrderState.state su REJECTED in caso di errori incontrato e includi l'oggetto RejectionInfo con il il valore RejectionInfoType corrispondente.
  3. Imposta OrderUpdate.orderManagementActions.