El proceso de confirmación de la compra se invoca cuando un usuario crea un carrito. El contenido del carrito del usuario y los detalles del pedido se envían a tu servicio web de Order with Google. El servicio web valida esta información y, luego, puedes continuar o realizar ajustes en el carrito según sea necesario.
El controlador de confirmación de la compra de tu servicio web debe responder a las solicitudes POST. Cuando un cliente elige la confirmación de la compra, Google envía un cuerpo de solicitud JSON con el servicio web Order with Google en forma de CheckoutRequestMessage
, que contiene los detalles de la Cart
de un cliente. Luego, tu servicio web responde con un CheckoutResponseMessage
. En el siguiente diagrama, se ilustra el proceso.
Cuando recibas una solicitud de confirmación de la compra, tu servicio web de Order with Google debe hacer lo siguiente:
- Comprueba la validez del carrito según los precios actuales de artículos, la disponibilidad y el servicio del proveedor.
- Calcula el precio total (incluidos los descuentos, los impuestos y las tarifas de entrega).
- Si el proceso se realiza correctamente, responde con un carrito sin modificar.
- Si el problema persiste, responde con un mensaje de error y un nuevo pedido propuesto.
Antes de comenzar a implementar la confirmación de la compra, te recomendamos revisar la documentación de descripción general de la entrega.
Mensaje de la solicitud de confirmación de la compra
Para validar el carrito del cliente, cuando este elige la salida, Google envía una solicitud a tu servicio web con un cuerpo JSON en forma de CheckoutRequestMessage
. El pedido del cliente no se envía hasta más adelante en el flujo de Order with Google.
Los datos que se incluyen en un CheckoutRequestMessage
incluyen lo siguiente:
- Intent: el campo
inputs[0].intent
de cada cuerpo de solicitud de confirmación de la compra contiene el valor de stringactions.foodordering.intent.CHECKOUT
. - Carrito: El campo
inputs[0].arguments[0].extension
de una solicitud de confirmación de la compra contiene un objetoCart
que representa el carrito del cliente. - Entrega o para llevar: El campo de extensión del objeto
Cart
contiene un objetoFoodCartExtension
que especifica las propiedades para la entrega o la exportación:- Para los pedidos de entrega, el objeto
FoodCartExtension
incluye la dirección de entrega. - En el caso de los pedidos para llevar o para llevar, el objeto
FoodCartExtension
no contiene información de ubicación.
- Para los pedidos de entrega, el objeto
- Zona de pruebas: El campo
isInSandbox
de una solicitud de confirmación de la compra contiene un valor booleano que indica si la transacción usa pagos de la zona de pruebas.
Ejemplo de una solicitud de confirmación de la compra
A continuación, se muestra un ejemplo de un 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
}
Mensaje de respuesta de confirmación de la compra
Después de recibir una solicitud del servicio de Order with Google, tu servicio web de confirmación de compras debe procesarla y responder con un CheckoutResponseMessage
. El CheckoutResponseMessage
debe cubrir una solicitud correcta o incorrecta.
Solicitud correcta
Si una solicitud de confirmación de la compra se realiza correctamente, CheckoutResponseMessage
debe incluir ProposedOrder
y PaymentOptions
:
ProposedOrder
cart
: Un objetocart
idéntico al carrito proporcionado enCheckoutRequestMessage
. Si se debe cambiar algún contenido del carrito,CheckoutResponseMessage
debe incluir unFoodErrorExtension
con unProposedOrder
corregido.otherItems
: Elementos agregados por el proveedor, como cargos de entrega, impuestos y otras tarifas También puede contener propinas que agregó el usuario.totalPrice
: Es el precio total del pedido.extension
: Es unFoodOrderExtension
que define la información de entrega del pedido, como el tiempo de entrega.
PaymentOptions
- La configuración del procesamiento de pagos se explica más adelante en Cómo configurar Google Pay.
Puedes usar el marcador de posición JSON en tu
CheckoutResponseMessage
hasta que estés listo para implementar el procesamiento de pagos. - Si deseas agregar opciones de pago de marcador de posición en tu
CheckoutResponseMessage
, consulta el ejemplo que se incluye a continuación, en el que se usa una puerta de enlace de pago de ejemplo paraPaymentOptions
.
- La configuración del procesamiento de pagos se explica más adelante en Cómo configurar Google Pay.
Puedes usar el marcador de posición JSON en tu
Ejemplo de respuesta correcta
{
"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": []
}
}
}
]
}
}
}
]
}
}
}
Solicitud incorrecta
Si una solicitud de confirmación de la compra no se realiza correctamente, CheckoutResponseMessage
debe incluir FoodErrorExtension
, que contiene una lista de elementos FoodOrderError
que describen cualquier error que se produjo. Si hay errores recuperables del pedido, como un cambio de precio de un artículo en el carrito, FoodErrorExtension
debe incluir el correctedProposedOrder
.
Ejemplo de respuesta incorrecta
{
"expectUserResponse": false,
"finalResponse": {
"richResponse": {
"items": [
{
"structuredResponse": {
"error": {
"@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
"foodOrderErrors": [
{
"error": "CLOSED",
"description": "The restaurant is closed."
}
]
}
}
}
]
}
}
}