주문 제출 설정

결제 후 호출, 사용자가 업데이트된 장바구니에 세금, 배송료, 할인, 기타 비용을 환불할 수 있습니다. 사용자가 주문을 확인하고 제출합니다. Google은 처리 엔드포인트에 주문 관련 정보 귀하의 웹 서비스는 이 주문을 받고 처리하고 주문 상태를 Google에 전송합니다.

이 섹션에서는 Google에서 보낸 주문 요청 메시지 형식을 설명합니다. SubmitOrderRequestMessage, 응답 메시지의 형식 사용자가 제공해야 하는 SubmitOrderResponseMessage 주문 처리 수명 주기에 대한 자세한 내용은 처리 개요

주문 처리 구현

엔드 투 엔드 주문과 함께 작동하도록 빌드하는 엔드 투 엔드 주문 웹 서비스는 Google에서 오는 주문 메시지를 수신하기 위한 URL 엔드포인트를 포함합니다. 주문용 웹 서비스에서 JSON 형식으로 SubmitOrderRequestMessage를 수신합니다. 형식으로 제공해야 합니다. 이 요청에는 고객 주문, 여기에는 세금, 수수료, 결제 정보가 포함됩니다. 주문 접수 후 웹 서비스에서 다음을 실행해야 합니다.

  • 카드 인증 또는 사기 감지와 같은 거래 자격 요건을 확인합니다.
  • 시스템에서 주문을 생성합니다.
  • 결제 수단을 승인하고 해당하는 경우 결제 대행업체의 청구 API를 호출합니다.
  • 주문의 적절한 상태(CREATED)로 응답합니다. CONFIRMED 또는 REJECTED입니다.

주문을 처리한 후 처리 코드에서 응답을 제공해야 합니다. SubmitOrderResponseMessage JSON 메시지 형식으로 Google에 반환됩니다.

주문 엔드 투 엔드 처리 웹 서비스에 대한 자세한 내용 자세한 내용은 처리 개요를 참고하세요.

주문 요청 메시지

고객이 엔드 투 엔드 주문 절차 중에 주문하기로 선택하면 Google은 다음 데이터가 포함된 SubmitOrderRequestMessage:

  1. 인텐트: 모든 주문 제출 요청 본문의 inputs[0].intent 필드 actions.intent.TRANSACTION_DECISION 문자열 값을 포함합니다.
  2. 주문: 주문 상품의 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: 주문 상태 및 사용자에게 제공되는 주문 후 작업(예: 지원팀에 문의, 'API 약관'의 finalResponse.richResponse.items[0].structuredResponse.orderUpdate 필드/ 확인할 수 있습니다.

주문 업데이트 필드

웹 서비스가 SubmitOrderResponseMessage를 전송할 때는 다음을 포함합니다. 다음 필드가 포함된 OrderUpdate 필드:

  • actionOrderId: 주문의 고유 ID로, 고유한 데 사용됩니다. 시스템에서 주문을 식별하고 후속 메시지를 보낼 때 주문 업데이트.
  • orderState: 주문 상태를 나타내는 OrderState 객체입니다.
  • orderManagementActions: 사용자에게 제공되는 주문 후 작업(예: 고객 지원 문의, 주문 세부정보 보기와 같은 작업을 예로 들 수 있습니다
  • totalPrice: 총 주문 가격입니다. 이는 선택사항입니다. 전송만 주문이 제출된 후 주문의 총가격이 변경된 경우

주문 상태는 다음 중 하나일 수 있습니다.

  • CREATED: 처리 엔드포인트에서 주문을 처리했습니다. 제공업체가 아직 주문을 확인하지 않았습니다.
  • CONFIRMED: 처리 엔드포인트에서 주문을 처리했습니다. 제공업체가 주문을 확인했습니다.
  • REJECTED: 문제가 발생하여 처리 엔드포인트에서 처리할 수 없습니다. 주문을 생성하거나 확인합니다. 여기에는 결제 문제가 포함될 수 있습니다.

주문을 REJECTED 상태로 설정하는 경우 OrderUpdaterejectionInfo 필드입니다. 사용 FoodOrderUpdateExtension.FoodOrderErrorsUNKNOWN 유형의 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.stateREJECTED로 설정합니다. 응답은 또한 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를 구현할 때는 다음 단계를 따라야 합니다.

유효성 검사

  1. 설정에 설명된 대로 서비스, 장바구니, 프로모션 유효성 검사를 수행합니다. 결제를 선택합니다.
  2. 다음과 같은 경우 다음 유형 중 하나를 사용하여 RejectionInfo를 반환합니다. 필요:
RejectionInfoType 사용 사례
UNAVAILABLE_SLOT 처리 시간이 더 이상 유효하지 않습니다.
PROMO_USER_INELIGIBLE 요청에서 연락처 객체에 있는 이메일을 사용하여 사용자의 프로모션 자격 요건을 확인합니다. 프로모션으로 주문 제출 구현의 예를 참고하세요.
INELIGIBLE
  • 전화번호나 이메일과 같은 사용자 정보가 올바르지 않습니다.
  • 위험 엔진이 사기를 감지합니다.
PAYMENT_DECLINED 결제를 처리할 수 없습니다. 예를 들어 잔액 부족이 원인일 수 있습니다.
UNKNOWN 기타 유효성 검사 오류

유효성 검사가 있는 경우 OrderState.stateREJECTED로 설정합니다. 오류가 발생했습니다. 원하는 경우 구체적인 거부 사유를 입력할 수 있습니다. FoodOrderUpdateExtension.foodOrderErrors을 사용할 수 있습니다. 예시 보기: 주문 유효성 검사 제출

결제 처리

  1. 장바구니 가격, 수수료, 할인, 세금을 더해 totalPrice를 계산합니다. 제공합니다. totalPrice는 반환된 totalPrice와 같아야 합니다. CheckoutResponseMessage와 사용자가 수정할 수 있는 경우 봉사료 금액입니다. 가격 보기 변경사항을 참조하세요.
  2. 주문 상태가 포함된 응답을 반환하는 경우 주문 및 결제 처리 CREATED 또는 CONFIRMED입니다.
  3. 생성된 유형을 사용하여 유효한 응답 형식이 반환되는지 확인하세요. 스키마에서 생성된 데이터 세트와 클라이언트 라이브러리를 생성합니다.
  4. 사용 GoogleProvidedPaymentInstrument(Google 제공 결제 수단)instrumentToken 결제를 처리합니다. 유형이 있는 RejectionInfo 반환 결제를 처리할 수 없는 경우 PAYMENT_DECLINED입니다. 프로세스 결제를 참조하세요.
  5. 이메일로 주문이 처리되는 즉시 사용자에게 알립니다. SMS를 탭합니다.

응답 반환

  1. 다음과 같은 경우 OrderState.stateCREATED 또는 CONFIRMED로 설정합니다. 오류가 없습니다.
  2. 오류가 있는 경우 OrderState.stateREJECTED로 설정합니다. 가 발견되고 다음과 함께 RejectionInfo 객체를 포함합니다. 해당하는 RejectionInfoType입니다.
  3. OrderUpdate.orderManagementActions를 설정합니다.