Configura Enviar pedido

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 o REJECTED.

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:

  1. Intent: El campo inputs[0].intent de cada cuerpo de solicitud de envío de pedido contiene el valor de cadena actions.intent.TRANSACTION_DECISION.
  2. Order: Es el campo inputs[0].arguments[0].transactionDecisionValue de un la solicitud de envío de pedido contiene un objeto Order que representa la el pedido de un cliente, 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 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 Campo finalResponse.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 objeto OrderState 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

  1. Realiza validaciones de servicio, carrito y promoción como se hace en Configuración. Confirmación de la compra
  2. 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
  • No es válida la información del usuario, como el número de teléfono o el correo electrónico.
  • Tu motor de riesgos detecta fraudes.
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

  1. Calcula totalPrice agregando el precio del carrito, las tarifas, el descuento, los impuestos y gratuidad. El totalPrice debe ser el mismo que el totalPrice 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.
  2. Procesar 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 con los tipos generados crearse a partir del esquema, como se describe en generar bibliotecas cliente.
  4. 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.
  5. Notificar al usuario inmediatamente después de que se procese el pedido por correo electrónico SMS.

Devuelve la respuesta

  1. Establece OrderState.state en CREATED o CONFIRMED si que no haya errores.
  2. Configura OrderState.state como REJECTED si hay errores e incluir el objeto RejectionInfo con el RejectionInfoType correspondiente.
  3. Establece OrderUpdate.orderManagementActions.