Configurar Checkout

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.

CheckoutResponseMessage muestra el carrito del cliente sin modificar o un error.

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 string actions.foodordering.intent.CHECKOUT.
  • Carrito: El campo inputs[0].arguments[0].extension de una solicitud de confirmación de la compra contiene un objeto Cart que representa el carrito del cliente.
  • Entrega o para llevar: El campo de extensión del objeto Cart contiene un objeto FoodCartExtension 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.
  • 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 objeto cart idéntico al carrito proporcionado en CheckoutRequestMessage. Si se debe cambiar algún contenido del carrito, CheckoutResponseMessage debe incluir un FoodErrorExtension con un ProposedOrder 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 un FoodOrderExtension 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 para PaymentOptions.

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