La procedura di pagamento viene richiamata quando un utente crea un carrello. I contenuti il carrello dell'utente e i dettagli dell'ordine vengono inviati al tuo sito web end-to-end per l'ordine completamente gestito di Google Cloud. Queste informazioni vengono convalidate dal servizio web e poi puoi procedere o apportare modifiche al carrello, se necessario.
Il gestore del pagamento per il tuo servizio web deve rispondere alle richieste POST. Quando
che il cliente sceglie di pagare, Google invia al servizio web end-to-end per l'ordine un
Corpo della richiesta JSON sotto forma di CheckoutRequestMessage
, che contiene il
dettagli dei Cart
di un cliente. Il servizio web risponde quindi con un
CheckoutResponseMessage
. Il seguente diagramma illustra la procedura.
Alla ricezione di una richiesta di pagamento, il servizio web end-to-end per l'ordine deve: le seguenti:
- Controlla la validità del carrello in base ai prezzi, alla disponibilità e e il servizio del fornitore.
- Calcola il prezzo totale (inclusi eventuali sconti, tasse e consegne di tariffe).
- In caso di esito positivo, rispondi con un carrello non modificato.
- Se non va a buon fine, rispondi con un messaggio di errore e un nuovo ordine proposto.
Prima di iniziare a implementare la procedura di pagamento, ti consigliamo di consultare la sezione Fulfillment panoramica documentazione.
Messaggio di richiesta di pagamento
Per convalidare il carrello del cliente, nel momento in cui un cliente sceglie di procedere con il pagamento,
Google invia una richiesta al tuo servizio web con un corpo JSON sotto forma di
CheckoutRequestMessage
. L'ordine del cliente viene inviato solo in una fase successiva della
Flusso end-to-end dell'ordine.
I dati contenuti in un
CheckoutRequestMessage
include:
- Intenzione:
inputs[0].intent
di ogni corpo della richiesta di pagamento contiene 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. - Consegna o ritiro: il campo dell'estensione dell'oggetto
Cart
contiene una l'oggettoFoodCartExtension
che specifica le proprietà di pubblicazione asporto:- .
- Per gli ordini di consegna, l'oggetto
FoodCartExtension
include il campo l'indirizzo di consegna. - Per gli ordini con ritiro o asporto, l'oggetto
FoodCartExtension
non contenere informazioni sulla posizione.
- Per gli ordini di consegna, l'oggetto
- Sandbox: il campo
isInSandbox
di una richiesta di pagamento contiene un valore booleano valore 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 end-to-end per l'ordine, il tuo sito web di pagamento
il servizio deve elaborarlo e rispondere con un CheckoutResponseMessage
. La
CheckoutResponseMessage
deve coprire una richiesta riuscita o meno
richiesta.
Richiesta riuscita
Se la richiesta di pagamento ha esito positivo, CheckoutResponseMessage
deve includere
ProposedOrder
e
PaymentOptions
:
ProposedOrder
cart
: un oggettocart
identico al carrello fornito inCheckoutRequestMessage
. Se uno dei contenuti del carrello deve essere modificata,CheckoutResponseMessage
dovrebbe invece includere unFoodErrorExtension
conProposedOrder
corretto.otherItems
: articoli aggiunti dal fornitore, ad esempio spese di spedizione, tasse e altre commissioni. Possono anche includere la mancia aggiunta dall'utente.totalPrice
: il prezzo totale dell'ordine.extension
: unFoodOrderExtension
che definisce le informazioni di evasione ad esempio i tempi di consegna.
PaymentOptions
- La configurazione dell'elaborazione dei pagamenti verrà trattata più avanti nella sezione Configurare Google
Paga.
Puoi utilizzare JSON segnaposto in
CheckoutResponseMessage
finché pronto a implementare l'elaborazione dei pagamenti. - Per aggiungere opzioni di pagamento segnaposto nel tuo
CheckoutResponseMessage
, fai riferimento all'esempio riportato di seguito, che utilizza un gateway per i pagamenti di esempio perPaymentOptions
.
- La configurazione dell'elaborazione dei pagamenti verrà trattata più avanti nella sezione Configurare Google
Paga.
Puoi utilizzare JSON segnaposto in
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
includi FoodErrorExtension
, che contiene un elenco di
FoodOrderError
:
che descrivono gli eventuali errori che si sono verificati. Se sono presenti elementi recuperabili
errori per l'ordine, come una variazione di prezzo di un articolo nel carrello,
FoodErrorExtension
deve includere i 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."
}
]
}
}
}
]
}
}
}
Implementazione di Google Pay
Al momento di implementare il pagamento, è necessario seguire questi passaggi.
Convalida il servizio
Restituisci un errore FoodOrderError per la prima condizione di errore del servizio. trovato. Questi errori non sono recuperabili, pertanto il primo errore riscontrato dovrebbe essere restituito. Consulta la sezione Gestione degli errori per una descrizione della recuperabili.
- Leggi la proprietà FulfillmentOptionInfo nella
per determinare se il tipo di evasione è per
delivery
opickup
. Se necessario, restituisci i seguenti tipi di errore:
Tipo di errore Caso d'uso NON VALIDO Il tipo di completamento non è valido. NOT_FOUND Tipo di completamento non trovato. CHIUSO - Non ci sono finestre OperationHours per l'ordine.
- Si tratta di un ordine "Appena possibile" e non sono presenti ServiceHours disponibili "Appena possibile" per l'ora corrente.
- C'è una chiusura di emergenza o il servizio
isDisabled
è true.
UNAVAILABLE_SLOT L'ordine in anticipo non può essere evaso. NO_CAPACITY Il ristorante è affollato e al momento non accetta ordini. OUT_OF_SERVICE_AREA L'ordine non può essere consegnato all'indirizzo dell'utente. Per un esempio, consulta la sezione Convalida dell'indirizzo di consegna. NO_COURIER_AVAILABLE Impossibile consegnare l'ordine a causa del personale addetto alla consegna limitato.
Convalida e determina il prezzo del carrello
Cerca ogni carrello.
lineItems
ed esegui la convalida con i dati attuali in nel tuo sistema o in quello del commerciante. La È incluso il valore MenuItemOffer.sku
dell'entità del feed come LineItem.offerId
. Crea un FoodOrderError per ogni voce, se necessario. Crea un al massimo un errore per ogni articolo. Restituisce i seguenti tipi di errore se necessario:Tipo di errore Caso d'uso Recuperabile NON VALIDO I dati dell'articolo o i dati delle opzioni non sono validi. No NOT_FOUND Impossibile trovare l'elemento o una delle opzioni. No PRICE_CHANGED Il prezzo di un articolo o di una combinazione di contenuti aggiuntivi è cambiato. Questo errore può essere considerato recuperabile. Sì AVAILABILITY_CHANGED L'importo richiesto per gli elementi pubblicitari o una qualsiasi delle opzioni non è disponibile. Sì REQUIREMENTS_NOT_MET Non viene raggiunto il valore minimo o massimo dell'ordine. Questo può essere determinato controllando se il prezzo del carrello è inferiore alla tariffa. eligibleTransactionVolumeMin
o superiore alla tariffa.eligibleTransactionVolumeMax
. Vedi l'esempio in convalida del valore minimo dell'ordine.No Restituisci l'elenco convalidato di elementi pubblicitari con LineItemType.
REGULAR
. La somma di tutti i prezzi degli elementi pubblicitari del carrello è il prezzo del carrello oSUBTOTAL
.
Guarda gli esempi nella convalida degli elementi del carrello.
Calcolare le commissioni di servizio
- Trova l'entità Fee corretta per il servizio in base al
eligibleRegion
,validFrom
,validThrough
epriority
. - Calcola l'importo della commissione in base al fatto che l'entità sia stata definita con un
price
,percentageOfCart
opricePerMeter
. - Restituisci la commissione di servizio di consegna o estrazione come LineItem con
LineItemType
DELIVERY
oFEE
rispettivamente. Aggiungi la commissione all'elenco Carrello.otherItems
.
Applica promozioni
- Trova l'entità Deal in base alla corrispondenza con la
Valore della promozione.
coupon
con l'offerta.dealCode
. Convalida l'offerta e, se necessario, restituisci un errore FoodOrderError. Questi errori possono essere trattati come recuperabili. Restituisci i seguenti tipi di errore se necessario:
Tipo di errore Caso d'uso PROMO_NOT_RECOGNIZED Codice coupon non riconosciuto. PROMO_EXPIRED La validità del deal è scaduta. PROMO_ORDER_INELIGIBLE L'ordine non è idoneo per il coupon. PROMO_NOT_APPLICABLE Qualsiasi altro motivo. Calcola l'importo del prezzo del deal in base al valore Deal.
discount
oppure Offerta.discountPercentage
.Applica l'importo del prezzo della promozione utilizzando il totale del carrello o il totale della tariffa, a seconda del Offerta.
dealType
.Restituisci il carrello.
promotions
con la promozione applicata.Restituisci la promozione come LineItem con LineItemType
DISCOUNT
. Aggiungi lo sconto al Carrello.otherItems
elenco con un prezzo negativo.
Restituisci la risposta
- Crea il campo ProposedOrder.
cart
, il carrello delle risposte è uguale al carrello delle richieste se non si verificano errori durante la convalida. - Restituisce l'elenco ProposedOrder.
otherItems
che include i valori tasse, commissioni, mancia e sconto, se applicati. Consulta Gratuity per ulteriori dettagli su come configurare la mancia. - Includi il valore ProposedOrder.
totalPrice
aggiungendo il carrello prezzo, commissioni, sconto, tasse e mancia. - Restituisci il
FoodOrderExtension.
availableFulfillmentOptions
con la rispettiva FulfillmentOption. Aggiorna il valore ritiro o consegna nei tempi previsti. - Se vengono generati FoodOrderError dai controlli di convalida precedenti:
- Includi StructuredResponse.
error
e l'elenco di in FoodErrorExtension.foodOrderErrors
. - Restituisci il valore ProposedOrder nel campo
correctedProposedOrder
se tutti gli errori sono recuperabili. - Restituisci PaymentOptions in
paymentOptions
se tutti gli errori sono recuperabili. - (Facoltativo) Includi
additionalPaymentOptions
se sono presenti altri le opzioni di pagamento disponibili e tutti gli errori sono recuperabili.
- Includi StructuredResponse.
- Se non sono presenti errori di convalida, restituisci
proposedOrder
,paymentOptions
nell'oggetto CheckoutResponse. (Facoltativo) IncludiadditionalPaymentOptions
se sono presenti altri le opzioni di pagamento disponibili.