O processo de checkout é invocado quando um usuário cria um carrinho. O conteúdo do carrinho do usuário e os detalhes sobre o pedido são enviados ao serviço da Web do Pedir com o Google. Essas informações são validadas pelo seu serviço da Web e você pode prosseguir ou fazer ajustes no carrinho conforme necessário.
O manipulador de checkout do seu serviço da web deve responder a solicitações POST. Quando um
cliente opta por finalizar a compra, o Google envia ao serviço da Web do Pedido com o
Google um corpo de solicitação JSON na forma de um CheckoutRequestMessage
, que contém os
detalhes de Cart
de um cliente. Seu serviço da Web responde com um CheckoutResponseMessage
. No diagrama a seguir, ilustramos o processo.
Ao receber uma solicitação de finalização da compra, o serviço da Web do Pedir com o Google precisa:
- Verifique a validade do carrinho com base nos preços, na disponibilidade e no serviço do provedor do item atual.
- Calcule o preço total (incluindo descontos, impostos e taxas de entrega).
- Se conseguir, responda com um carrinho não modificado.
- Em caso de falha, responda com uma mensagem de erro e um novo pedido proposto.
Antes de começar a implementar a finalização da compra, recomendamos consultar a documentação em Visão geral do fulfillment.
Mensagem de solicitação de finalização de compra
Para validar o carrinho do cliente, quando um cliente opta por finalizar a compra,
o Google envia uma solicitação ao seu serviço da Web com um corpo JSON na forma de um
CheckoutRequestMessage
. O pedido do cliente só é enviado no fluxo do Pedido com o Google.
Os dados contidos em
CheckoutRequestMessage
incluem:
- Intent: o campo
inputs[0].intent
de cada corpo de solicitação de finalização de compra contém o valor de stringactions.foodordering.intent.CHECKOUT
. - Carrinho: o campo
inputs[0].arguments[0].extension
de uma solicitação de finalização de compra contém um objetoCart
que representa o carrinho do cliente. - Entrega ou retirada: o campo de extensão do objeto
Cart
contém um objetoFoodCartExtension
que especifica propriedades para entrega ou retirada:- Para pedidos de entrega, o objeto
FoodCartExtension
inclui o endereço de entrega. - Para pedidos de retirada ou retirada, o objeto
FoodCartExtension
não contém informações de local.
- Para pedidos de entrega, o objeto
- Sandbox: o campo
isInSandbox
de uma solicitação de finalização de compra contém um valor booleano que indica se a transação usa pagamentos de sandbox.
Exemplo de solicitação de finalização de compra
Veja abaixo um exemplo de 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
}
Mensagem de resposta de finalização de compra
Depois de receber uma solicitação do serviço Pedir com o Google, seu serviço da Web de finalização da compra precisa processá-la e responder com um CheckoutResponseMessage
. O CheckoutResponseMessage
precisa cobrir uma solicitação bem-sucedida ou não.
Solicitação bem-sucedida
Se uma solicitação de check-out for bem-sucedida, CheckoutResponseMessage
precisará incluir
ProposedOrder
e
PaymentOptions
:
ProposedOrder
cart
: um objetocart
idêntico ao carrinho fornecido noCheckoutRequestMessage
. Se algum conteúdo do carrinho precisar ser alterado, oCheckoutResponseMessage
precisará incluir umFoodErrorExtension
com umProposedOrder
corrigido.otherItems
: itens adicionados pelo provedor, como taxas de entrega, tributos e outras taxas. Também pode conter gorjetas adicionadas pelo usuário.totalPrice
: o preço total do pedido.extension
: umFoodOrderExtension
que define informações de fulfillment para o pedido, como tempo de entrega.
PaymentOptions
- A configuração do processamento de pagamentos é abordada posteriormente em Configurar o Google Pay.
Você pode usar o marcador de posição JSON em
CheckoutResponseMessage
até que esteja pronto para implementar o processamento de pagamento. - Para adicionar opções de pagamento de marcador na sua
CheckoutResponseMessage
, consulte o exemplo abaixo, que usa um gateway de pagamento de exemplo paraPaymentOptions
.
- A configuração do processamento de pagamentos é abordada posteriormente em Configurar o Google Pay.
Você pode usar o marcador de posição JSON em
Exemplo de resposta bem-sucedida
{
"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": []
}
}
}
]
}
}
}
]
}
}
}
Solicitação malsucedida
Se uma solicitação de finalização de compra não for bem-sucedida, CheckoutResponseMessage
precisará
incluir FoodErrorExtension
, que contém uma lista de
itens FoodOrderError
que descrevem os erros que ocorreram. Se houver erros recuperáveis no pedido, como uma mudança de preço de um item no carrinho, o FoodErrorExtension
precisará incluir o correctedProposedOrder
.
Exemplo de resposta com falha
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "CLOSED",
"description": "The restaurant is closed."
}
]
}
}
}
]
}
}
}