Después de confirmar la compra llamada, el usuario revisa el carrito actualizado con impuestos, gastos de envío, descuentos y otros cargos que devuelvas. El usuario confirma y envía el pedido. Google le envía a tu extremo de entrega una solicitud JSON que contiene el información del pedido. Tu servicio web debe recibir este pedido, procesarlo y responde a Google con el estado del pedido.
En esta sección, se describe el formato del mensaje de solicitud de pedido que envía Google,
llamado SubmitOrderRequestMessage
y el formato del mensaje de respuesta
que debes proporcionar, llamado
SubmitOrderResponseMessage
Para obtener más información sobre el ciclo de vida de la entrega de pedidos, consulta la
Descripción general de la entrega.
Implementación de entrega de pedidos
El servicio web de Pedidos de extremo a extremo que se haya creado para funcionar con la función de Pedidos de extremo a extremo debe
incluir un extremo de URL para recibir mensajes de pedidos de Google. Para pedidos
procesamiento, tu servicio web recibe un SubmitOrderRequestMessage
en JSON
como una solicitud POST de Google. Esta solicitud contiene el pedido de un cliente,
incluidos los impuestos, las tarifas y la información de pago. Después de recibir un pedido de envío
tu servicio web debe hacer lo siguiente:
- Revisa la elegibilidad de las transacciones, como la verificación de tarjeta o la detección de fraudes.
- Crea un pedido en tu sistema.
- Autoriza la forma de pago y llama a la API de cargos de tu procesador de pagos cuando corresponda.
- Responde con el estado adecuado del pedido:
CREATED
,CONFIRMED
oREJECTED
.
Después de procesar el pedido, tu código de entrega debe proporcionar una respuesta
en el formato de un mensaje JSON SubmitOrderResponseMessage
a Google.
Para obtener más información sobre el servicio web de entrega de extremo a extremo de pedidos de implementación, consulta la Descripción general de la entrega.
Mensaje de solicitud de pedido
Cuando un cliente elige realizar un pedido durante el flujo de pedido de extremo a extremo,
Google envía una solicitud a tu servicio web con un mensaje JSON llamado
SubmitOrderRequestMessage
, que contiene los siguientes datos:
- Intent: El campo
inputs[0].intent
de cada cuerpo de solicitud de envío de pedido contiene el valor de cadenaactions.intent.TRANSACTION_DECISION
. - Order: Es el campo
inputs[0].arguments[0].transactionDecisionValue
de un la solicitud de envío de pedido contiene un objetoOrder
que representa la el pedido de un cliente, junto con los detalles del pago. - Marca de zona de pruebas: El campo
isInSandbox
de una solicitud de envío de pedido indica si la transacción usa pagos en zona de pruebas.
Ejemplo de solicitud de pedido
A continuación, se muestra un ejemplo de SubmitOrderRequestMessage
:
JSON
{ "user": {}, "conversation": { "conversationId": "CTKbKfUlHCyDEdcz_5PBJTtf" }, "inputs": [ { "intent": "actions.intent.TRANSACTION_DECISION", "arguments": [ { "transactionDecisionValue": { "order": { "finalOrder": { "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" ] } }, "contact": { "displayName": "Hab Sy", "email": "hab9878.sy@gmail.com", "phoneNumber": "+61000000000", "firstName": "Hab", "lastName": "Sy" } } }, "otherItems": [ { "name": "Delivery fee", "type": "DELIVERY", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "3", "nanos": 500000000 } } }, { "name": "Subtotal", "type": "SUBTOTAL", "price": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "39", "nanos": 600000000 } } } ], "totalPrice": { "type": "ESTIMATE", "amount": { "currencyCode": "AUD", "units": "43", "nanos": 100000000 } }, "extension": { "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension" } }, "googleOrderId": "01412971004192156198", "orderDate": "2020-10-22T09:02:06.173Z", "paymentInfo": { "displayName": "Pay when you get your food", "paymentType": "ON_FULFILLMENT" } } } } ] } ], "directActionOnly": true, "isInSandbox": true }
Mensaje de respuesta del pedido
Después de recibir una solicitud, tu servicio web de pedidos de extremo a extremo procesa el
solicitud y devuelve un SubmitOrderResponseMessage
que incluye el
los siguientes datos:
OrderUpdate
: Es un objeto que contiene el estado del pedido y cualquier acciones posteriores al pedido disponibles para el usuario, como comunicarse con el equipo de asistencia y de visualización de los detalles del pedido, que defines en CampofinalResponse.richResponse.items[0].structuredResponse.orderUpdate
de la respuesta.
Campo para actualizar el pedido
Cuando tu servicio web envía un SubmitOrderResponseMessage
, contiene un
OrderUpdate
, que incluye los siguientes campos:
actionOrderId
: El ID único del pedido, que se usa para identificar y dar identificar el pedido en tu sistema y hacer referencia a él cuando envíes actualizaciones del pedido.orderState
: Es un objetoOrderState
que representa el estado del pedido.orderManagementActions
: Son acciones posteriores de pedidos disponibles para el usuario, como como comunicarse con asistencia al cliente y ver los detalles de los pedidos.totalPrice
: Es el precio total del pedido. Esto es opcional. Solo enviar si el precio total del pedido cambió después de que este se envió.
Un pedido puede tener uno de los siguientes estados:
CREATED
: El extremo de entrega procesó el pedido correctamente. pero el proveedor aún no confirmó el pedido.CONFIRMED
: El extremo de entrega procesó el pedido correctamente. y el proveedor confirmó el pedido.REJECTED
: Hubo un problema y no se pudo completar el extremo de entrega. crear o confirmar el pedido, lo que puede incluir problemas con el pago.
Si estableces un pedido en un estado REJECTED
, especifica el motivo en el
Campo rejectionInfo
de OrderUpdate
. Usa
Valores FoodOrderUpdateExtension.FoodOrderErrors
junto con
rejectionInfo
de tipo UNKNOWN
y proporciona una descripción.
Ejemplo de respuesta a un pedido
A continuación, se muestra un ejemplo de SubmitOrderResponseMessage
:
JSON
{ "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "1603357328160", "orderState": { "state": "CONFIRMED", "label": "Pending" }, "updateTime": "2020-10-22T02:02:08-07:00", "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Call customer service", "openUrlAction": { "url": "tel:+61234561000" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order details", "openUrlAction": { "url": "https://partner.com/view/orderstatus" } } } ], "receipt": { "userVisibleOrderId": "BXZ-1603357328" } } } } ] } } }
No se pudo completar la solicitud
Si una solicitud de envío no se realiza correctamente, SubmitOrderResponseMessage
debe configurar
OrderState.state
a REJECTED
. La respuesta también debe
incluyen el objeto RejectionInfo, que contiene un RejectionType
para describir el tipo de error.
Ejemplo de respuesta no exitosa
JSON
{ "expectUserResponse": false, "finalResponse": { "richResponse": { "items": [ { "structuredResponse": { "orderUpdate": { "actionOrderId": "sample_action_order_id", "orderState": { "state": "REJECTED", "label": "Order rejected" }, "updateTime": "2017-05-10T02:30:00.000Z", "rejectionInfo": { "type": "PAYMENT_DECLINED", "reason": "Insufficient funds" }, "orderManagementActions": [ { "type": "CUSTOMER_SERVICE", "button": { "title": "Contact customer service", "openUrlAction": { "url": "mailto:support@example.com" } } }, { "type": "EMAIL", "button": { "title": "Email restaurant", "openUrlAction": { "url": "mailto:person@example.com" } } }, { "type": "CALL", "button": { "title": "Call restaurant", "openUrlAction": { "url": "tel:+16505554679" } } }, { "type": "VIEW_DETAILS", "button": { "title": "View order", "openUrlAction": { "url": "https://orderview.partner.com?orderid=sample_action_order_id" } } } ] } } } ] } } }
Cómo enviar la implementación de un pedido
Debes seguir estos pasos cuando implementes la API de Submit order.
Validación
- Realiza validaciones de servicio, carrito y promoción como se hace en Configuración. Confirmación de la compra
- Devuelve RejectionInfo con uno de los siguientes tipos si según sea necesario:
RejectionInfoType | Caso de uso |
---|---|
UNAVAILABLE_SLOT |
El tiempo de entrega ya no es válido. |
PROMO_USER_INELIGIBLE |
Usa el correo electrónico del objeto Contact de la solicitud para validar la elegibilidad de la promoción para el usuario. Consulta el ejemplo que se incluye en el artículo Cómo implementar el envío de pedidos con promociones. |
INELIGIBLE |
|
PAYMENT_DECLINED |
No se pudo procesar el pago. Por ejemplo, esto podría deberse a fondos insuficientes. |
UNKNOWN |
Si se trata de cualquier otro error de validación. |
Establece OrderState.state
en REJECTED
si hay validación.
errores encontrados. También puedes proporcionar un motivo del rechazo específico
con FoodOrderUpdateExtension.foodOrderErrors
Consulta ejemplos en
Envía la validación del pedido.
Procesa el pago
- Calcula
totalPrice
agregando el precio del carrito, las tarifas, el descuento, los impuestos y gratuidad. EltotalPrice
debe ser el mismo que eltotalPrice
que se muestra. en CheckoutResponseMessage además del cambio en la cantidad de propina si el usuario puede modificarla. Ver Precio cambios durante el envío del pedido para obtener más detalles. - Procesar el pedido y el pago si devuelves una respuesta con un estado de pedido
de
CREATED
oCONFIRMED
. - Asegúrate de que se muestre un formato de respuesta válido con los tipos generados crearse a partir del esquema, como se describe en generar bibliotecas cliente.
- Usa el
GoogleProvidedPaymentInstrument.
instrumentToken
para procesar el pago. Devuelve RejectionInfo con el tipo.PAYMENT_DECLINED
si no se puede procesar el pago. Consulta Proceso pagos para obtener más detalles. - Notificar al usuario inmediatamente después de que se procese el pedido por correo electrónico SMS.
Devuelve la respuesta
- Establece OrderState.
state
enCREATED
oCONFIRMED
si que no haya errores. - Configura OrderState.
state
comoREJECTED
si hay errores e incluir el objeto RejectionInfo con el RejectionInfoType correspondiente. - Establece OrderUpdate.
orderManagementActions
.