Configura Enviar pedido

Después de la llamada de confirmación de la compra, el usuario revisa el carrito actualizado con los impuestos, los gastos de envío, los descuentos y otros cargos que devuelvas. El usuario confirma y envía el pedido, y Google le envía a tu extremo de entrega una solicitud JSON que contiene la información del pedido. Tu servicio web debe recibir este pedido, procesarlo y responder 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, denominado 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 Orden de extremo a extremo que compiles para trabajar con Ordenar de extremo a extremo debe incluir un extremo de URL para recibir mensajes de pedido de Google. Para el procesamiento de pedidos, tu servicio web recibe un SubmitOrderRequestMessage en formato JSON como una solicitud POST de Google. Esta solicitud contiene el pedido de un cliente, lo que incluye información de pago, impuestos y tarifas. Cuando recibas una solicitud de envío de pedido, tu servicio web deberá hacer lo siguiente:

  • Comprobar 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 Charge de tu procesador de pagos cuando corresponda.
  • Responde con el estado adecuado del pedido: CREATED, CONFIRMED o REJECTED.

Después de procesar el pedido, tu código de entrega debe proporcionar una respuesta en forma de un mensaje JSON SubmitOrderResponseMessage a Google.

Para obtener más información sobre los requisitos de implementación del servicio web de entrega de extremo a extremo, 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:

  1. Intent: El campo inputs[0].intent de cada cuerpo de solicitud de pedido contiene el valor de cadena actions.intent.TRANSACTION_DECISION.
  2. Order: El campo inputs[0].arguments[0].transactionDecisionValue de una solicitud de envío de pedido contiene un objeto Order que representa el pedido del cliente que se realizará, junto con los detalles del pago.
  3. Marca de zona de pruebas: El campo isInSandbox de una solicitud de envío de pedido indica si la transacción usa pagos de 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 extremo a extremo de pedidos procesa la solicitud y devuelve una SubmitOrderResponseMessage que incluye los siguientes datos:

  • OrderUpdate: Es un objeto que contiene el estado del pedido y cualquier acción posterior al pedido disponible para el usuario, como comunicarse con el equipo de asistencia y ver los detalles del pedido, que defines en el campo finalResponse.richResponse.items[0].structuredResponse.orderUpdate de la respuesta.

Campo de actualización del pedido

Cuando tu servicio web envía un SubmitOrderResponseMessage, contiene un campo OrderUpdate que incluye los siguientes campos:

  • actionOrderId: Es el ID único del pedido, que se usa para identificar de forma única el pedido en tu sistema y hacer referencia a él cuando se envían actualizaciones de pedidos posteriores.
  • orderState: Es un objeto OrderState que representa el estado del pedido.
  • orderManagementActions: Son las acciones posteriores al pedido disponibles para el usuario, como comunicarse con el equipo de asistencia al cliente y ver los detalles del pedido.
  • totalPrice: Es el precio total del pedido. Esto es opcional. Enviar solo si el precio total del pedido cambió después de que se envió

Los pedidos pueden tener uno de los siguientes estados:

  • CREATED: El extremo de entrega procesó el pedido correctamente, pero el proveedor aún no lo confirmó.
  • CONFIRMED: El extremo de entrega procesó el pedido correctamente y el proveedor lo confirmó.
  • REJECTED: Hubo un problema y tu extremo de entrega no pudo crear ni 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 de 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"
              }
            }
          }
        }
      ]
    }
  }
}

Solicitud incorrecta

Si una solicitud de envío no se realiza correctamente, SubmitOrderResponseMessage debe establecer OrderState.state como REJECTED. La respuesta también debe incluir RejectionInfo, que contiene un objeto 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

Se deben seguir los siguientes pasos para implementar la API de Enviar pedido.

Validación

  1. Realiza validaciones de servicios, carritos y promociones como se hace en Configura la confirmación de la compra.
  2. Muestra RejectionInfo con uno de los siguientes tipos si es necesario:
RejectionInfoType Caso de uso
UNAVAILABLE_SLOT El tiempo de entrega ya no es válido.
PROMO_USER_INELIGIBLE Utiliza el correo electrónico del objeto Contact en la solicitud para validar la elegibilidad de la promoción del usuario. Consulta el ejemplo para implementar el pedido de envío con promociones.
INELIGIBLE
  • La información del usuario, como el número de teléfono o el correo electrónico, no es válida.
  • Tu motor de riesgos detecta fraudes.
PAYMENT_DECLINED No se pudo procesar el pago. Por ejemplo, esto podría deberse a fondos insuficientes.
UNKNOWN Para cualquier otro error de validación.

Establece OrderState.state en REJECTED si se encontraron errores de validación. De manera opcional, puedes proporcionar un motivo de rechazo específico con FoodOrderUpdateExtension.foodOrderErrors. Consulta ejemplos en Validación de envío de pedido.

Cómo procesar el pago

  1. Para calcular el totalPrice, agrega el precio del carrito, las tarifas, el descuento, los impuestos y la propina. El totalPrice debe ser el mismo que el totalPrice que se muestra en CheckoutResponseMessage, además del cambio en el importe de la propina, si el usuario puede modificar la propina. Consulta Cambios de precio durante el envío de una orden para obtener más detalles.
  2. Procesa el pedido y el pago si devuelves una respuesta con un estado de pedido de CREATED o CONFIRMED.
  3. Asegúrate de que se muestre un formato de respuesta válido mediante los tipos generados creados a partir del esquema como se describe en Genera bibliotecas cliente.
  4. Usa GoogleProvidedPaymentInstrument.instrumentToken para procesar el pago. Muestra RejectionInfo con el tipo PAYMENT_DECLINED si no se puede procesar el pago. Consulta Cómo procesar pagos para obtener más detalles.
  5. Notifica al usuario inmediatamente después de que se procese el pedido por correo electrónico o SMS.

Devuelve la respuesta

  1. Establece OrderState.state en CREATED o CONFIRMED si no hay errores.
  2. Establece OrderState.state en REJECTED si se encuentran errores y, luego, incluye el objeto RejectionInfo con el objeto RejectionInfoType correspondiente.
  3. Configura OrderUpdate.orderManagementActions.