Configura il pagamento

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.

The CheckoutResponseMessage restituisce il carrello non modificato del cliente o un errore.

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 stringa actions.foodordering.intent.CHECKOUT.
  • Carrello: il campo inputs[0].arguments[0].extension di una richiesta di pagamento contiene un oggetto Cart che rappresenta il carrello del cliente.
  • Pubblicazione o estrazione: il campo estensione dell'oggetto Cart contiene un oggetto FoodCartExtension 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.
  • 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 oggetto cart identico al carrello fornito nel CheckoutRequestMessage. Se è necessario modificare uno dei contenuti del carrello, CheckoutResponseMessage deve invece includere un FoodErrorExtension con un ProposedOrder 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: un FoodOrderExtension 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 per PaymentOptions.

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."
                }
              ]
            }
          }
        }
      ]
    }
  }
}