Configura Google Checkout

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.

L'oggetto CheckResponseMessage restituisce il carrello del cliente non modificato oppure
.

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 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.
  • Consegna o ritiro: il campo dell'estensione dell'oggetto Cart contiene una l'oggetto FoodCartExtension 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.
  • 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 oggetto cart identico al carrello fornito in CheckoutRequestMessage. Se uno dei contenuti del carrello deve essere modificata, CheckoutResponseMessage dovrebbe invece includere un FoodErrorExtension con ProposedOrder 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: un FoodOrderExtension 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 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 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.

  1. Leggi la proprietà FulfillmentOptionInfo nella per determinare se il tipo di evasione è per delivery o pickup.
  2. 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.
    Tieni presente che le finestre speciali hanno la precedenza sulle finestre normali. Consulta gli esempi in convalida della finestra di ordine e rimuovere temporaneamente le entità di servizio.
    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

  1. 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.
    AVAILABILITY_CHANGED L'importo richiesto per gli elementi pubblicitari o una qualsiasi delle opzioni non è disponibile.
    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
  2. 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 o SUBTOTAL.

Guarda gli esempi nella convalida degli elementi del carrello.

Calcolare le commissioni di servizio

  1. Trova l'entità Fee corretta per il servizio in base al eligibleRegion, validFrom, validThrough e priority.
  2. Calcola l'importo della commissione in base al fatto che l'entità sia stata definita con un price, percentageOfCart o pricePerMeter.
  3. Restituisci la commissione di servizio di consegna o estrazione come LineItem con LineItemType DELIVERY o FEE rispettivamente. Aggiungi la commissione all'elenco Carrello.otherItems.

Applica promozioni

  1. Trova l'entità Deal in base alla corrispondenza con la Valore della promozione.coupon con l'offerta.dealCode.
  2. 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.
  3. Calcola l'importo del prezzo del deal in base al valore Deal.discount oppure Offerta.discountPercentage.

  4. Applica l'importo del prezzo della promozione utilizzando il totale del carrello o il totale della tariffa, a seconda del Offerta.dealType.

  5. Restituisci il carrello.promotions con la promozione applicata.

  6. Restituisci la promozione come LineItem con LineItemType DISCOUNT. Aggiungi lo sconto al Carrello.otherItems elenco con un prezzo negativo.

Restituisci la risposta

  1. Crea il campo ProposedOrder.cart, il carrello delle risposte è uguale al carrello delle richieste se non si verificano errori durante la convalida.
  2. 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.
  3. Includi il valore ProposedOrder.totalPrice aggiungendo il carrello prezzo, commissioni, sconto, tasse e mancia.
  4. Restituisci il FoodOrderExtension.availableFulfillmentOptions con la rispettiva FulfillmentOption. Aggiorna il valore ritiro o consegna nei tempi previsti.
  5. 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.
  6. Se non sono presenti errori di convalida, restituisci proposedOrder, paymentOptions nell'oggetto CheckoutResponse. (Facoltativo) Includi additionalPaymentOptions se sono presenti altri le opzioni di pagamento disponibili.