La procedura di pagamento viene richiamata quando un utente crea un carrello. I contenuti del carrello dell'utente e i dettagli dell'ordine vengono inviati al servizio web Ordina con Google. Queste informazioni vengono convalidate dal servizio web dell'utente, che può procedere o modificare il carrello in base alle sue esigenze.
Il gestore del pagamento per il servizio web deve rispondere alle richieste POST. Quando un cliente sceglie di pagare, Google invia al servizio web Ordina con Google un corpo della richiesta JSON sotto forma di CheckoutRequestMessage
, che contiene i dettagli di Cart
del cliente. Il tuo servizio web risponderà quindi con un
CheckoutResponseMessage
. Il seguente diagramma illustra la procedura.
Una volta ricevuta la richiesta di pagamento, il servizio web Ordina con Google deve:
- Controlla la validità del carrello in base ai prezzi, alla disponibilità e al servizio attuali degli articoli.
- Calcola il prezzo totale (inclusi eventuali sconti, tasse e spese di spedizione).
- Se l'operazione ha esito positivo, rispondi con un carrello non modificato.
- In caso di esito negativo, rispondi con un messaggio di errore e un nuovo ordine proposto.
Prima di iniziare l'implementazione del pagamento, ti consigliamo di consultare la documentazione relativa alla panoramica dell'evasione ordini.
Messaggio di richiesta di pagamento
Per convalidare il carrello del cliente, quando un cliente sceglie di pagare,
Google invia una richiesta al tuo servizio web con un corpo JSON sotto forma di
CheckoutRequestMessage
. L'ordine dei clienti non viene inviato fino a una fase successiva del flusso Ordine con Google.
I dati contenuti in un
CheckoutRequestMessage
includono quanto segue:
- Intenzione: il campo
inputs[0].intent
di ogni corpo della richiesta di pagamento contiene il valore stringaactions.foodordering.intent.CHECKOUT
. - Carrello: il campo
inputs[0].arguments[0].extension
di una richiesta di pagamento contiene un oggettoCart
che rappresenta il carrello del cliente. - Pubblicazione o estrazione: il campo estensione dell'oggetto
Cart
contiene un oggettoFoodCartExtension
che specifica le proprietà per la consegna o l'estrazione:- Per gli ordini di consegna, l'oggetto
FoodCartExtension
include l'indirizzo di consegna. - Per gli ordini con ritiro o ritiro, l'oggetto
FoodCartExtension
non contiene informazioni sulla posizione.
- Per gli ordini di consegna, l'oggetto
- Sandbox: il campo
isInSandbox
di una richiesta di pagamento contiene un valore booleano che indica se la transazione utilizza i pagamenti sandbox.
Esempio di richiesta di pagamento
Di seguito è riportato un esempio di CheckoutRequestMessage
:
{
"user": {},
"conversation": {
"conversationId": "CTZbZfUlHCybEdcz_5PB3Ttf"
},
"inputs": [
{
"intent": "actions.foodordering.intent.CHECKOUT",
"arguments": [
{
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.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"
]
}
}
}
}
}
]
}
],
"directActionOnly": true,
"isInSandbox": true
}
Messaggio di risposta al pagamento
Dopo aver ricevuto una richiesta dal servizio Ordina con Google, il tuo servizio web per il pagamento deve elaborarla e rispondere con un CheckoutResponseMessage
. CheckoutResponseMessage
deve coprire una richiesta riuscita o non riuscita.
Richiesta eseguita correttamente
Se la richiesta di pagamento ha esito positivo, CheckoutResponseMessage
deve includere
ProposedOrder
e
PaymentOptions
:
ProposedOrder
cart
: un oggettocart
identico al carrello fornito nelCheckoutRequestMessage
. Se è necessario modificare uno dei contenuti del carrello,CheckoutResponseMessage
deve invece includere unFoodErrorExtension
con unProposedOrder
corretto.otherItems
: articoli aggiunti dal fornitore, ad esempio spese di spedizione, tasse e altre commissioni. Possono contenere anche la mancia aggiunta dall'utente.totalPrice
: il prezzo totale dell'ordine.extension
: unFoodOrderExtension
che definisce le informazioni di evasione per l'ordine, come i tempi di consegna.
PaymentOptions
- La configurazione dell'elaborazione dei pagamenti verrà descritta più avanti nella sezione Configurare Google Pay.
Puoi utilizzare il segnaposto JSON nel tuo
CheckoutResponseMessage
finché non è tutto pronto per implementare l'elaborazione dei pagamenti. - Per aggiungere le opzioni di pagamento segnaposto nel tuo
CheckoutResponseMessage
, fai riferimento all'esempio qui sotto, che utilizza un gateway di pagamento di esempio perPaymentOptions
.
- La configurazione dell'elaborazione dei pagamenti verrà descritta più avanti nella sezione Configurare Google Pay.
Puoi utilizzare il segnaposto JSON nel tuo
Esempio di risposta riuscita
{
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"checkoutResponse": {
"proposedOrder": {
"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"
]
}
}
}
},
"totalPrice": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "43",
"nanos": 100000000
}
},
"extension": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
"availableFulfillmentOptions": [
{
"fulfillmentInfo": {
"delivery": {
"deliveryTimeIso8601": "P0M"
}
}
}
]
},
"otherItems": [
{
"name": "Delivery fee",
"price": {
"type": "ESTIMATE",
"amount": {
"currencyCode": "AUD",
"units": "3",
"nanos": 500000000
}
},
"type": "DELIVERY"
}
]
},
"paymentOptions": {
"googleProvidedOptions": {
"facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"AUD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"43.1\"}} "
}
},
"additionalPaymentOptions": [
{
"actionProvidedOptions": {
"paymentType": "ON_FULFILLMENT",
"displayName": "Pay when you get your food.",
"onFulfillmentPaymentData": {
"supportedPaymentOptions": []
}
}
}
]
}
}
}
]
}
}
}
Richiesta non riuscita
Se una richiesta di pagamento non va a buon fine, CheckoutResponseMessage
deve includere FoodErrorExtension
, che contiene un elenco di elementi FoodOrderError
che descrivono gli errori che si sono verificati. Se sono presenti errori recuperabili
dell'ordine, come una modifica di prezzo di un articolo nel carrello, FoodErrorExtension
deve includere l'elemento correctedProposedOrder
.
Esempio di risposta non riuscita
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "CLOSED",
"description": "The restaurant is closed."
}
]
}
}
}
]
}
}
}