주문 제출 설정

결제 호출이 끝나면 사용자는 업데이트된 장바구니를 세금, 배송료, 할인, 반환된 기타 요금과 함께 검토합니다. 사용자가 주문을 확인하여 제출하면 Google이 처리 엔드포인트에 주문 정보가 포함된 JSON 요청을 보냅니다. 웹 서비스는 이 주문을 받아 처리한 후 주문 상태를 포함하여 Google에 다시 응답해야 합니다.

이 섹션에서는 Google에서 전송하는 주문 요청 메시지 형식(SubmitOrderRequestMessage)과 제공해야 하는 응답 메시지 형식(SubmitOrderResponseMessage)에 관해 설명합니다. 주문 처리 수명 주기에 관한 자세한 내용은 처리 개요를 참고하세요.

주문 처리 구현

엔드 투 엔드 주문과 연동하도록 빌드하는 주문 엔드 투 엔드 웹 서비스에는 Google에서 보내는 주문 메시지를 수신하기 위한 URL 엔드포인트가 포함되어야 합니다. 주문 처리를 위해 웹 서비스는 Google의 POST 요청으로 JSON 형식의 SubmitOrderRequestMessage을 수신합니다. 이 요청에는 세금, 수수료, 결제 정보가 포함된 고객 주문이 포함됩니다. 주문 제출 요청을 받으면 웹 서비스에서 다음을 실행해야 합니다.

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

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

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

주문 요청 메시지

고객이 주문 엔드 투 엔드 흐름 중에 주문하기로 선택하면 Google은 다음 데이터가 포함된 SubmitOrderRequestMessage라는 JSON 메시지와 함께 웹 서비스에 요청을 전송합니다.

  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: 주문 상태 및 사용자가 사용할 수 있는 모든 주문 후 작업(예: 지원팀에 문의하기, 주문 세부정보 보기)이 포함된 객체로, 응답의 finalResponse.richResponse.items[0].structuredResponse.orderUpdate 필드에서 정의합니다.

주문 업데이트 필드

웹 서비스가 SubmitOrderResponseMessage를 전송할 때 다음 필드가 있는 OrderUpdate 필드가 포함됩니다.

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

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

  • 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.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 요청의 Contact(연락처) 객체에 있는 이메일을 사용하여 사용자의 프로모션 자격요건을 확인합니다. 프로모션과 함께 주문 제출 구현의 예를 참고하세요.
INELIGIBLE
  • 전화번호, 이메일과 같은 사용자 정보가 잘못되었습니다.
  • 위험 엔진이 사기를 감지합니다.
PAYMENT_DECLINED 결제를 처리할 수 없습니다. 예를 들어 잔액이 부족하기 때문일 수 있습니다.
UNKNOWN 기타 유효성 검사 오류의 경우

유효성 검사 오류가 발생하면 OrderState.stateREJECTED로 설정합니다. 선택적으로 FoodOrderUpdateExtension을 사용하여 특정 거부 사유를 제공할 수 있습니다.foodOrderErrors 주문 유효성 검사 제출의 예를 참고하세요.

결제 처리

  1. 장바구니 가격, 수수료, 할인, 세금, 봉사를 추가하여 totalPrice를 계산합니다. totalPriceCheckoutResponseMessage에서 반환된 totalPrice와 같아야 하며, 사용자가 봉사료를 수정할 수 있는 경우 봉사료의 변경사항을 더한 값이어야 합니다. 자세한 내용은 주문 제출 중 가격 변경을 참고하세요.
  2. 주문 상태가 CREATED 또는 CONFIRMED인 응답을 반환하면 주문 및 결제를 처리합니다.
  3. 클라이언트 라이브러리 생성에 설명된 대로 스키마에서 생성된 생성된 유형을 사용하여 유효한 응답 형식이 반환되도록 합니다.
  4. GoogleProvidedPaymentInstrument.instrumentToken를 사용하여 결제를 처리합니다. 결제를 처리할 수 없는 경우 PAYMENT_DECLINED 유형의 RejectionInfo를 반환합니다. 자세한 내용은 결제 처리를 참고하세요.
  5. 주문이 이메일이나 SMS로 처리된 직후 사용자에게 알립니다.

응답 반환

  1. 오류가 없으면 OrderState.stateCREATED 또는 CONFIRMED로 설정합니다.
  2. 오류가 발생하면 OrderState.stateREJECTED로 설정하고 RejectionInfo 객체를 해당하는 RejectionInfoType과 함께 포함합니다.
  3. OrderUpdate.orderManagementActions를 설정합니다.