在結帳呼叫後,使用者會檢視更新過的購物車,並提供稅金、運費、折扣和其他退貨費用。使用者確認並提交訂單,然後 Google 會傳送含有訂單資訊的 JSON 要求給您的執行要求端點。您的網路服務必須接收並處理這筆訂單,然後以訂單的狀態傳回 Google。
本節說明 Google 傳送的訂單要求訊息格式 (呼叫 SubmitOrderRequestMessage
),以及必須提供的回應訊息格式 (稱為 SubmitOrderResponseMessage
)。如要進一步瞭解訂單執行要求生命週期,請參閱執行要求總覽。
導入訂單履行方式
您為了接收 Google 訂購訊息而建立的「端對端排序」網路服務必須包含網址端點。為處理訂單,您的網路服務會收到 JSON 格式的 SubmitOrderRequestMessage
,做為 Google 的 POST 要求。這項要求含有客戶訂單,包括稅金、費用和付款資訊。收到提交訂單要求後,您的網路服務必須執行以下操作:
- 檢查交易資格,例如卡片驗證或詐欺偵測。
- 在系統中建立訂單。
- 授權付款方式,並視需要呼叫付款處理方的 charge API。
- 回應適當的訂單狀態:
CREATED
、CONFIRMED
或REJECTED
。
處理訂單後,執行要求程式碼必須以 SubmitOrderResponseMessage
JSON 訊息的形式提供回應給 Google。
如要進一步瞭解訂購端對端執行要求網路服務的實作要求,請參閱「執行要求總覽」。
訂單要求訊息
客戶在「端對端訂購」流程中選擇下單時,Google 會傳送一項名為 SubmitOrderRequestMessage
的 JSON 訊息至您的網路服務,其中包含下列資料:
- 意圖:每個提交訂單要求主體的
inputs[0].intent
欄位都包含actions.intent.TRANSACTION_DECISION
字串值。 - 訂單:提交訂單要求的
inputs[0].arguments[0].transactionDecisionValue
欄位包含Order
物件,代表要下單的客戶訂單和付款資料。 - 沙箱旗標:提交訂單要求的
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
:訂單的總價。。只有在訂單總價在提交訂單後有變動時,才需要傳送。
訂單可以是下列其中一種狀態:
CREATED
:執行要求端點已成功處理訂單,但供應商尚未確認訂單。CONFIRMED
:您的執行要求端點已成功處理訂單,且供應商已確認訂單。REJECTED
:發生問題,您的執行要求端點無法建立或確認訂單,其中可能包含付款問題。
如果將訂單設為 REJECTED
狀態,請在 OrderUpdate
的 rejectionInfo
欄位中指定原因。請將 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 時,應採取下列步驟。
驗證
- 依照「設定結帳」的說明執行服務、購物車和促銷活動驗證。
- 如有需要,請使用下列其中一種類型傳回 RejectionInfo:
RejectionInfoType | 用途 |
---|---|
UNAVAILABLE_SLOT |
出貨時間已失效。 |
PROMO_USER_INELIGIBLE |
請使用要求中 Contact 物件中的電子郵件,驗證使用者的促銷優惠資格。請參閱導入含有促銷活動的提交訂單中的範例。 |
INELIGIBLE |
|
PAYMENT_DECLINED |
無法處理付款。例如資金不足所致。 |
UNKNOWN |
其他驗證錯誤。 |
發生驗證錯誤時,請將 OrderState.state
設為 REJECTED
。如有需要,您可以使用 FoodOrderUpdateExtension 提供特定的拒絕原因。foodOrderErrors
。請參閱提交訂單驗證中的範例。
處理付款
- 加入購物車價格、費用、折扣、稅金和加值方案,計算
totalPrice
。totalPrice
應與 CheckoutResponseMessage 中傳回的totalPrice
相同,如果使用者可以修改加碼,則需變更加值金額的變更。詳情請參閱「提交訂單時的價格異動」。 - 如果您傳回訂單狀態為
CREATED
或CONFIRMED
的回應,請處理訂單和付款。 - 如產生用戶端程式庫一節所述,使用透過結構定義建立產生的類型,確保傳回有效的回應格式。
- 請使用 GoogleProvidedPaymentInstrument
instrumentToken
處理付款。如果無法處理付款,請傳回類型為PAYMENT_DECLINED
的 RejectionInfo。詳情請參閱「處理付款」。 - 透過電子郵件和簡訊處理訂單後,請立即通知使用者。
傳回回應
- 如果沒有發生錯誤,請將 OrderState.
state
設為CREATED
或CONFIRMED
。 - 如果發生錯誤,請將 OrderState.
state
設為REJECTED
,並納入對應的 RejectionInfoType 的 RejectionInfo 物件。 - 設定 OrderUpdate.
orderManagementActions
。