Configurar "Enviar pedido"

Após a compra chamada, o usuário revisa o carrinho atualizado com tributos, taxas de entrega, descontos e outras cobranças que você devolveu. O usuário confirma e envia o pedido. O Google envia ao endpoint de fulfillment uma solicitação JSON que contém o do pedido. Seu serviço da Web precisa receber, processar e processar esse pedido e responder ao Google com o estado do pedido.

Esta seção descreve o formato de mensagem de solicitação de pedido enviado pelo Google, chamado SubmitOrderRequestMessage, e o formato da mensagem de resposta que você precisa fornecer, chamada de SubmitOrderResponseMessage. Para mais informações sobre o ciclo de vida do atendimento do pedido, consulte a Visão geral do fulfillment.

Implementação do atendimento do pedido

O serviço da Web de pedidos de ponta a ponta que você criar para trabalhar com o recurso de pedidos de ponta a ponta precisa incluir um endpoint de URL para receber mensagens de pedidos do Google. Para pedidos processamento, seu serviço da Web recebe uma SubmitOrderRequestMessage em JSON como uma solicitação POST do Google. Essa solicitação contém um pedido de cliente, incluindo tributos, taxas e informações de pagamento. Ao receber um pedido de envio o serviço da Web precisa fazer o seguinte:

  • Conferir a qualificação da transação, como a verificação do cartão ou a detecção de fraudes.
  • Crie um pedido no seu sistema.
  • Autorize a forma de pagamento e chame a API de cobrança do seu processador de pagamentos quando aplicável.
  • Responda com o estado adequado do pedido: CREATED, CONFIRMED ou REJECTED.

Depois de processar o pedido, seu código de atendimento precisa fornecer uma resposta na forma de uma mensagem JSON SubmitOrderResponseMessage de volta para o Google.

Para mais informações sobre o serviço da Web de atendimento de pedidos de ponta a ponta requisitos de implementação, consulte a Visão geral do fulfillment.

Mensagem de solicitação de pedido

Quando um cliente escolhe fazer um pedido durante o fluxo de pedido de ponta a ponta, O Google envia uma solicitação ao seu serviço da Web com uma mensagem JSON chamada SubmitOrderRequestMessage que contém os seguintes dados:

  1. Intent: o campo inputs[0].intent do corpo de cada solicitação de pedido de envio. contém o valor de string actions.intent.TRANSACTION_DECISION.
  2. Ordem:o campo inputs[0].arguments[0].transactionDecisionValue de um solicitação de envio de pedido contém um objeto Order que representa o pedido do cliente, incluindo os detalhes do pagamento.
  3. Flag de sandbox: o campo isInSandbox de uma solicitação de envio de pedido indica se a transação usa pagamentos de sandbox.
.

Exemplo de solicitação de pedido

Veja abaixo um exemplo 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
}
    

Mensagem de resposta do pedido

Após receber uma solicitação, o serviço da Web de pedidos de ponta a ponta processa os de destino e envia de volta um SubmitOrderResponseMessage que inclui o seguintes dados:

  • OrderUpdate: um objeto que contém o estado do pedido e quaisquer ações pós-pedido disponíveis para o usuário, como contato com o suporte e visualizar detalhes do pedido, que você define na Campo finalResponse.richResponse.items[0].structuredResponse.orderUpdate de a resposta.

Campo de atualização do pedido

Quando o serviço da Web envia um SubmitOrderResponseMessage, ele contém um OrderUpdate que inclui os seguintes campos:

  • actionOrderId: o ID exclusivo do pedido, que é usado para identificar o pedido em seu sistema e consultá-lo ao enviar atualizações de pedidos.
  • orderState: um objeto OrderState que representa o estado do pedido.
  • orderManagementActions: ações pós-pedido disponíveis para o usuário, como como entrar em contato com o suporte ao cliente e consultar os detalhes do pedido.
  • totalPrice: o preço total do pedido. Isso é opcional. Enviar apenas se o preço total do pedido tiver sido alterado após o pedido ser enviado.

Um pedido pode estar em um dos seguintes estados:

  • CREATED: o endpoint de atendimento processou o pedido com sucesso. mas o fornecedor ainda não confirmou o pedido.
  • CONFIRMED: o endpoint de atendimento processou o pedido com sucesso. e o fornecedor confirmou o pedido.
  • REJECTED: ocorreu um problema e não foi possível usar seu endpoint de fulfillment criar ou confirmar o pedido, o que pode incluir problemas com o pagamento.

Se você definir um pedido com o estado REJECTED, especifique o motivo no Campo rejectionInfo de OrderUpdate. Usar FoodOrderUpdateExtension.FoodOrderErrors em conjunto com rejectionInfo do tipo UNKNOWN e fornecem uma descrição.

Exemplo de resposta ao pedido

Veja abaixo um exemplo 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"
              }
            }
          }
        }
      ]
    }
  }
}

Falha na solicitação

Se um pedido de envio não for bem-sucedido, o SubmitOrderResponseMessage precisará definir OrderState.state para REJECTED. A resposta também precisa inclua o RejectionInfo, que contém um RejectionType para descrever o tipo de erro.

Exemplo de resposta sem êxito

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

Implementação do envio do pedido

Siga as etapas abaixo ao implementar a API de pedido de envio.

Validação

  1. Faça validações de serviços, carrinhos e promoções como feito em Configuração Finalizar a compra.
  2. Retorne RejectionInfo com um dos seguintes tipos se necessário:
RejectionInfoType Caso de uso
UNAVAILABLE_SLOT O horário de atendimento não é mais válido.
PROMO_USER_INELIGIBLE Use o e-mail no objeto Contato na solicitação para validar a qualificação do usuário para a promoção. Confira o exemplo em Como implementar a ordem de envio com promoções.
INELIGIBLE
  • Informações do usuário, como número de telefone ou e-mail, não são válidas.
  • Seu mecanismo de risco detectou fraude.
PAYMENT_DECLINED Não foi possível processar o pagamento. Por exemplo, o motivo pode ser a insuficiência de fundos.
UNKNOWN Para qualquer outro erro de validação.

Defina OrderState.state como REJECTED se houver validação erros encontrados. Também é possível informar um motivo específico para a rejeição usando a classe FoodOrderUpdateExtension.foodOrderErrors. Confira exemplos em Validação de pedido de envio.

Processar o pagamento

  1. Calcule o totalPrice adicionando o preço, as taxas, o desconto, os tributos e o preço do carrinho. gratificação. O totalPrice precisa ser igual ao totalPrice retornado. na CheckoutResponseMessage mais a alteração no o valor da gratificação se ela puder ser modificada pelo usuário. Consulte Preço durante o envio do pedido para mais detalhes.
  2. Processe o pedido e o pagamento se retornar uma resposta com um estado do pedido de CREATED ou CONFIRMED.
  3. Use os tipos gerados para garantir que um formato de resposta válido seja retornado criados a partir do esquema, conforme descrito nas gerar bibliotecas de cliente.
  4. Use o GoogleProvidedPaymentInstrument.instrumentToken para processar o pagamento. Retorne RejectionInfo com o tipo PAYMENT_DECLINED se não for possível processar o pagamento. Consulte Processo pagamentos para mais detalhes.
  5. Notificar o usuário imediatamente após o processamento do pedido por e-mail e/ SMS.

Retornar a resposta

  1. Defina OrderState.state como CREATED ou CONFIRMED se não há erros.
  2. Defina OrderState.state como REJECTED se houver erros encontrados e incluir o objeto RejectionInfo com o RejectionInfoType correspondente.
  3. Defina o OrderUpdate.orderManagementActions.