Configurar finalização de compra

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.

O CheckoutResponseMessage retorna o carrinho não modificado do cliente ou um erro.

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 string actions.foodordering.intent.CHECKOUT.
  • Carrinho: o campo inputs[0].arguments[0].extension de uma solicitação de finalização de compra contém um objeto Cart que representa o carrinho do cliente.
  • Entrega ou retirada: o campo de extensão do objeto Cart contém um objeto FoodCartExtension 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.
  • 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 objeto cart idêntico ao carrinho fornecido no CheckoutRequestMessage. Se algum conteúdo do carrinho precisar ser alterado, o CheckoutResponseMessage precisará incluir um FoodErrorExtension com um ProposedOrder 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: um FoodOrderExtension 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 para PaymentOptions.

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