결제 후 호출, 사용자가 업데이트된 장바구니에 세금, 배송료, 할인, 기타 비용을 환불할 수 있습니다. 사용자가 주문을 확인하고 제출합니다. Google은 처리 엔드포인트에 주문 관련 정보 귀하의 웹 서비스는 이 주문을 받고 처리하고 주문 상태를 Google에 전송합니다.
이 섹션에서는 Google에서 보낸 주문 요청 메시지 형식을 설명합니다.
SubmitOrderRequestMessage
, 응답 메시지의 형식
사용자가 제공해야 하는
SubmitOrderResponseMessage
주문 처리 수명 주기에 대한 자세한 내용은
처리 개요
주문 처리 구현
엔드 투 엔드 주문과 함께 작동하도록 빌드하는 엔드 투 엔드 주문 웹 서비스는
Google에서 오는 주문 메시지를 수신하기 위한 URL 엔드포인트를 포함합니다. 주문용
웹 서비스에서 JSON 형식으로 SubmitOrderRequestMessage
를 수신합니다.
형식으로 제공해야 합니다. 이 요청에는 고객 주문,
여기에는 세금, 수수료, 결제 정보가 포함됩니다. 주문 접수 후
웹 서비스에서 다음을 실행해야 합니다.
- 카드 인증 또는 사기 감지와 같은 거래 자격 요건을 확인합니다.
- 시스템에서 주문을 생성합니다.
- 결제 수단을 승인하고 해당하는 경우 결제 대행업체의 청구 API를 호출합니다.
- 주문의 적절한 상태(
CREATED
)로 응답합니다.CONFIRMED
또는REJECTED
입니다.
주문을 처리한 후 처리 코드에서 응답을 제공해야 합니다.
SubmitOrderResponseMessage
JSON 메시지 형식으로 Google에 반환됩니다.
주문 엔드 투 엔드 처리 웹 서비스에 대한 자세한 내용 자세한 내용은 처리 개요를 참고하세요.
주문 요청 메시지
고객이 엔드 투 엔드 주문 절차 중에 주문하기로 선택하면
Google은
다음 데이터가 포함된 SubmitOrderRequestMessage
:
- 인텐트: 모든 주문 제출 요청 본문의
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
: 주문 상태 및 사용자에게 제공되는 주문 후 작업(예: 지원팀에 문의, 'API 약관'의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
로 설정합니다. 응답은 또한
RejectionType
가 포함된 RejectionInfo를 포함합니다.
객체를 정의합니다.
실패 응답 예시
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 |
요청에서 연락처 객체에 있는 이메일을 사용하여 사용자의 프로모션 자격 요건을 확인합니다. 프로모션으로 주문 제출 구현의 예를 참고하세요. |
INELIGIBLE |
|
PAYMENT_DECLINED |
결제를 처리할 수 없습니다. 예를 들어 잔액 부족이 원인일 수 있습니다. |
UNKNOWN |
기타 유효성 검사 오류 |
유효성 검사가 있는 경우 OrderState.state
를 REJECTED
로 설정합니다.
오류가 발생했습니다. 원하는 경우 구체적인 거부 사유를 입력할 수 있습니다.
FoodOrderUpdateExtension.foodOrderErrors
을 사용할 수 있습니다. 예시 보기:
주문 유효성 검사 제출
결제 처리
- 장바구니 가격, 수수료, 할인, 세금을 더해
totalPrice
를 계산합니다. 제공합니다.totalPrice
는 반환된totalPrice
와 같아야 합니다. CheckoutResponseMessage와 사용자가 수정할 수 있는 경우 봉사료 금액입니다. 가격 보기 변경사항을 참조하세요. - 주문 상태가 포함된 응답을 반환하는 경우 주문 및 결제 처리
CREATED
또는CONFIRMED
입니다. - 생성된 유형을 사용하여 유효한 응답 형식이 반환되는지 확인하세요. 스키마에서 생성된 데이터 세트와 클라이언트 라이브러리를 생성합니다.
- 사용
GoogleProvidedPaymentInstrument(Google 제공 결제 수단)
instrumentToken
결제를 처리합니다. 유형이 있는 RejectionInfo 반환 결제를 처리할 수 없는 경우PAYMENT_DECLINED
입니다. 프로세스 결제를 참조하세요. - 이메일로 주문이 처리되는 즉시 사용자에게 알립니다. SMS를 탭합니다.
응답 반환
- 다음과 같은 경우 OrderState.
state
를CREATED
또는CONFIRMED
로 설정합니다. 오류가 없습니다. - 오류가 있는 경우 OrderState.
state
를REJECTED
로 설정합니다. 가 발견되고 다음과 함께 RejectionInfo 객체를 포함합니다. 해당하는 RejectionInfoType입니다. - OrderUpdate.
orderManagementActions
를 설정합니다.