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
ouREJECTED
.
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:
- Intent: o campo
inputs[0].intent
do corpo de cada solicitação de pedido de envio. contém o valor de stringactions.intent.TRANSACTION_DECISION
. - Ordem:o campo
inputs[0].arguments[0].transactionDecisionValue
de um solicitação de envio de pedido contém um objetoOrder
que representa o pedido do cliente, incluindo os detalhes do pagamento. - 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 CampofinalResponse.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 objetoOrderState
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
- Faça validações de serviços, carrinhos e promoções como feito em Configuração Finalizar a compra.
- 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 |
|
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
- Calcule o
totalPrice
adicionando o preço, as taxas, o desconto, os tributos e o preço do carrinho. gratificação. OtotalPrice
precisa ser igual aototalPrice
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. - Processe o pedido e o pagamento se retornar uma resposta com um estado do pedido
de
CREATED
ouCONFIRMED
. - 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.
- Use o
GoogleProvidedPaymentInstrument.
instrumentToken
para processar o pagamento. Retorne RejectionInfo com o tipoPAYMENT_DECLINED
se não for possível processar o pagamento. Consulte Processo pagamentos para mais detalhes. - Notificar o usuário imediatamente após o processamento do pedido por e-mail e/ SMS.
Retornar a resposta
- Defina OrderState.
state
comoCREATED
ouCONFIRMED
se não há erros. - Defina OrderState.
state
comoREJECTED
se houver erros encontrados e incluir o objeto RejectionInfo com o RejectionInfoType correspondente. - Defina o OrderUpdate.
orderManagementActions
.