设置“提交订单”

结账后 调用、 用户查看更新后的购物车,其中包含税费、运费、折扣和 退还的其他费用。用户确认并提交订单 Google 会向您的执行端点发送 JSON 请求,其中包含 订单信息您的网络服务必须接收、处理此订单 并回复 Google 并提供相应订单的状态。

本部分介绍了 Google 发送的订单请求消息格式, 称为 SubmitOrderRequestMessage,以及响应消息的格式 (称为 SubmitOrderResponseMessage。 如需详细了解订单履单生命周期,请参阅 Fulfillment 概览

履单实现

您构建的端到端订购网络服务必须与端到端订购网络服务搭配使用, 添加用于接收来自 Google 的订单消息的网址端点。对于订单 处理时,您的 Web 服务会收到 JSON 格式的 SubmitOrderRequestMessage 格式设置为来自 Google 的 POST 请求。此请求包含一个客户订单 包括税费、费用和付款信息。收到提交订单后 请求,您的 Web 服务必须执行以下操作:

  • 检查交易资格,例如银行卡验证或欺诈检测。
  • 在您的系统中创建一个订单。
  • 向付款方式授权,并在适用的情况下调用付款处理方的 charge API。
  • 返回相应的订单状态作为响应:CREATEDCONFIRMEDREJECTED

处理订单后,您的履单代码必须提供响应 以 SubmitOrderResponseMessage JSON 消息的形式返回给 Google。

如需详细了解用于下单的端到端履单网络服务 实现要求,请参阅 Fulfillment 概览

订单请求消息

如果客户在端到端下单流程中选择下单, Google 会使用名为 SubmitOrderRequestMessage,其中包含以下数据:

  1. Intent:每个提交订单请求正文的 inputs[0].intent 字段 包含 actions.intent.TRANSACTION_DECISION 字符串值。
  2. Order(订单):订单的 inputs[0].arguments[0].transactionDecisionValue 字段 提交订单请求包含一个 Order 对象,该对象表示 要下达的订单以及付款明细。
  3. 沙盒标记:提交订单请求的 isInSandbox 字段用于指明 交易是否使用沙盒付款。

订单请求示例

下面给出了一个示例 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
}
    

订单响应消息

收到请求后,您的端到端订购网络服务会 请求并发回一个包含SubmitOrderResponseMessage 以下数据:

  • OrderUpdate:一个包含订单状态和 用户可以执行的下单后操作,例如与支持团队联系和 查看您在 finalResponse.richResponse.items[0].structuredResponse.orderUpdate 个字段 响应。

订单更新字段

当网络服务发送 SubmitOrderResponseMessage 时,它会包含一个 OrderUpdate 字段,其中包含以下字段:

  • actionOrderId:订单的唯一 ID,用于对 识别系统中的订单,并在发送后续订单时参考 订单更新。
  • orderState:表示订单状态的 OrderState 对象。
  • orderManagementActions:用户可执行的操作,例如 例如与客户支持团队联系和查看订单详情
  • totalPrice:订单的总价格。您可以选择是否创建 PIN 码。仅发送 如果在订单提交后订单的总价格发生了变化,则会发生该变化。

订单可能处于以下状态之一:

  • CREATED:您的履单端点已成功处理订单。 但提供商尚未确认订单。
  • CONFIRMED:您的履单端点已成功处理订单。 且提供商已确认订单
  • REJECTED:出了点问题,您的执行端点无法执行 创建或确认订单,其中可能包括付款问题。

如果您将订单设置为 REJECTED 状态,请在 OrderUpdaterejectionInfo 字段。使用 FoodOrderUpdateExtension.FoodOrderErrors 值与 UNKNOWN 类型的 rejectionInfo,并提供说明。

订单响应示例

下面给出了一个示例 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"
              }
            }
          }
        }
      ]
    }
  }
}

请求失败

如果提交请求不成功,则需要将 SubmitOrderResponseMessage 设为 将 OrderState.state 设置为 REJECTED。响应还必须 包含 RejectionInfo,其中包含 RejectionType 对象来描述错误类型。

失败响应示例

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

提交订单实施

实现提交订单 API 时,应采取以下步骤。

验证

  1. 按照设置 结账
  2. 如果存在以下情况,则返回带有以下类型之一的 RejectionInfo 所需内容:
RejectionInfoType 使用场景
UNAVAILABLE_SLOT 履单时间已失效。
PROMO_USER_INELIGIBLE 使用请求中的 Contact 对象中的电子邮件来验证用户的促销资格。请参见实现包含促销活动的提交订单中的示例。
INELIGIBLE
  • 用户信息(如电话号码或电子邮件地址)无效。
  • 风险引擎会检测到欺诈行为。
PAYMENT_DECLINED 无法处理付款。例如,这可能是资金不足所致。
UNKNOWN 任何其他验证错误。

如果存在验证,则将 OrderState.state 设置为 REJECTED 错误。您还可以选择提供具体的拒绝原因 FoodOrderUpdateExtension.foodOrderErrors。查看示例: 提交订单验证

处理付款

  1. 通过将购物车价格、费用、折扣、税费和totalPrice相加, 小费。totalPrice 应与返回的 totalPrice 相同 在 CheckoutResponseMessage 中,再加上 小费金额(如果用户可以修改小费金额)。请参阅价格 提交订单期间更改
  2. 如果您返回的响应中包含订单状态,请处理订单和付款 (共 CREATEDCONFIRMED)。
  3. 确保使用生成的类型返回有效的响应格式 按照说明 生成客户端库
  4. 使用 GoogleProvidedPaymentInstrumentinstrumentToken 处理付款。根据类型返回 RejectionInfo PAYMENT_DECLINED。请参阅流程 付款,了解更多详情。
  5. 在通过电子邮件和/或或 短信。

返回响应

  1. OrderState.state 设置为 CREATEDCONFIRMED(如果 没有错误。
  2. 如果存在错误,请将 OrderState.state 设置为 REJECTED 并将 RejectionInfo 对象和 相应的 RejectionInfoType
  3. 设置 OrderUpdate.orderManagementActions