결제 설정

결제 프로세스는 사용자가 장바구니를 만들 때 호출됩니다. 이 사용자의 장바구니 및 주문 세부정보가 주문 엔드 투 엔드 웹으로 전송됩니다. 있습니다. 이 정보는 웹 서비스에서 검증되며, 사용자는 계속 진행하거나 필요에 따라 장바구니를 조정할 수 있습니다.

웹 서비스의 결제 핸들러는 POST 요청에 응답해야 합니다. 사용자가 고객이 결제를 선택하면 Google은 주문 엔드 투 엔드 웹 서비스를 CheckoutRequestMessage 형식의 JSON 요청 본문이며 여기에는 다음이 포함됩니다. 고객의 Cart 세부정보 그러면 웹 서비스는 CheckoutResponseMessage 다음 다이어그램은 이러한 프로세스를 보여줍니다.

CheckoutResponseMessage가 고객의 수정되지 않은 장바구니 또는
오류가 발생했습니다.

결제 요청을 받으면 주문 엔드 투 엔드 웹 서비스는 다음을 수행해야 합니다. 다음과 같습니다.

  • 현재 상품 가격, 재고, 재고 상태를 기준으로 장바구니의 유효성을 확인합니다. 서비스 제공업체입니다.
  • 총가격 (할인, 세금, 배송료 포함)을 계산하세요 있습니다.
  • 성공하면 수정되지 않은 장바구니로 응답합니다.
  • 실패하면 오류 메시지와 새로 제안하는 주문을 포함한 답장을 보냅니다.

결제를 구현하기 전에 주문 처리 개요 문서를 참조하세요.

결제 요청 메시지

고객의 장바구니를 확인하기 위해 고객이 결제를 선택하면 Google은 CheckoutRequestMessage 고객 주문이 엔드 투 엔드 순서 지정 흐름

CheckoutRequestMessage 드림 다음이 포함됩니다.

  • 인텐트: inputs[0].intent 드림 필드에는 actions.foodordering.intent.CHECKOUT 문자열 값입니다.
  • 장바구니: 결제 요청의 inputs[0].arguments[0].extension 필드 에는 고객의 장바구니를 나타내는 Cart 객체가 포함됩니다.
  • 배달 또는 테이크아웃: Cart 객체의 확장 필드에는 전송 또는 전송용 속성을 지정하는 FoodCartExtension 객체 테이크아웃: <ph type="x-smartling-placeholder">
      </ph>
    • 배달 주문의 경우 FoodCartExtension 객체에는 배송지 주소를 입력합니다.
    • 포장 또는 테이크아웃 주문의 경우 FoodCartExtension 객체가 다음과 같이 작동하지 않습니다. .
  • 샌드박스: 결제 요청의 isInSandbox 필드에는 불리언 값이 포함됩니다. 거래에서 샌드박스 결제를 사용하는지 여부를 나타내는 값입니다.

결제 요청 예시

다음은 CheckoutRequestMessage의 예입니다.

{
    "user": {},
    "conversation": {
        "conversationId": "CTZbZfUlHCybEdcz_5PB3Ttf"
    },
    "inputs": [
        {
            "intent": "actions.foodordering.intent.CHECKOUT",
            "arguments": [
                {
                    "extension": {
                        "@type": "type.googleapis.com/google.actions.v2.orders.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"
                                    ]
                                }
                            }
                        }
                    }
                }
            ]
        }
    ],
    "directActionOnly": true,
    "isInSandbox": true
}

결제 응답 메시지

주문 엔드 투 엔드 서비스로부터 요청을 받은 후 결제 웹은 서비스에서 이를 처리하고 CheckoutResponseMessage로 응답해야 합니다. 이 CheckoutResponseMessage에서는 성공 또는 실패 여부를 다루어야 합니다. 합니다.

요청 성공

결제 요청이 성공하면 CheckoutResponseMessageProposedOrderPaymentOptions:

  • ProposedOrder

    • cart: cart 객체: CheckoutRequestMessage입니다. 장바구니의 내용물 중 하나라도 변경되면 CheckoutResponseMessageFoodErrorExtension를 수정된 ProposedOrder로 바꿉니다.
    • otherItems: 배송비 등 제공업체가 추가한 항목입니다. 세금, 기타 수수료가 포함됩니다. 사용자가 추가한 봉사료도 포함할 수 있습니다.
    • totalPrice: 총 주문 가격입니다.
    • extension: fulfillment 정보를 정의하는 FoodOrderExtension입니다. 주문 정보(예: 배송 시간)를 확인할 수 있습니다.
  • PaymentOptions

    • 결제 처리 설정은 나중에 Google 설정 결제를 탭합니다. 다음 작업을 할 때까지 CheckoutResponseMessage에서 자리표시자 JSON을 사용할 수 있습니다. 결제 처리를 구현할 준비가 된 경우
    • CheckoutResponseMessage에 자리표시자 결제 옵션을 추가하려면 다음 안내를 따르세요. 아래의 를 참조하세요. 이 예시는 PaymentOptions의 결제 게이트웨이 예시

성공적인 응답의 예

{
    "finalResponse": {
        "richResponse": {
            "items": [
                {
                    "structuredResponse": {
                        "checkoutResponse": {
                            "proposedOrder": {
                                "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"
                                                ]
                                            }
                                        }
                                    }
                                },
                                "totalPrice": {
                                    "type": "ESTIMATE",
                                    "amount": {
                                        "currencyCode": "AUD",
                                        "units": "43",
                                        "nanos": 100000000
                                    }
                                },
                                "extension": {
                                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension",
                                    "availableFulfillmentOptions": [
                                        {
                                            "fulfillmentInfo": {
                                                "delivery": {
                                                    "deliveryTimeIso8601": "P0M"
                                                }
                                            }
                                        }
                                    ]
                                },
                                "otherItems": [
                                    {
                                        "name": "Delivery fee",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "3",
                                                "nanos": 500000000
                                            }
                                        },
                                        "type": "DELIVERY"
                                    }
                                ]
                            },
                            "paymentOptions": {
                                "googleProvidedOptions": {
                                    "facilitationSpecification": "{\"apiVersion\":2,\"apiVersionMinor\":0,\"merchantInfo\":{\"merchantName\":\"merchantName\"},\"allowedPaymentMethods\":[{\"type\":\"CARD\",\"parameters\":{\"allowedAuthMethods\":[\"PAN_ONLY\"],\"allowedCardNetworks\":[\"VISA\",\"MASTERCARD\"],\"billingAddressRequired\":true,\"cvcRequired\":false},\"tokenizationSpecification\":{\"type\":\"PAYMENT_GATEWAY\",\"parameters\":{\"gatewayMerchantId\":\"YOUR_MERCHANT_ID\",\"gateway\":\"cybersource\"}}}],\"transactionInfo\":{\"currencyCode\":\"AUD\",\"totalPriceStatus\":\"ESTIMATED\",\"totalPrice\":\"43.1\"}} "
                                }
                            },
                            "additionalPaymentOptions": [
                                {
                                    "actionProvidedOptions": {
                                        "paymentType": "ON_FULFILLMENT",
                                        "displayName": "Pay when you get your food.",
                                        "onFulfillmentPaymentData": {
                                            "supportedPaymentOptions": []
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            ]
        }
    }
}

요청 실패

결제 요청이 실패하면 CheckoutResponseMessage에서 FoodErrorExtension를 포함시킵니다. 여기에는 FoodOrderError 발생한 모든 오류를 설명하는 항목이 포함됩니다. 만약 복구 가능한 장바구니에 있는 상품의 가격 변경과 같은 주문 오류, FoodErrorExtension에는 correctedProposedOrder가 포함되어야 합니다.

실패 응답 예시

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "error": {
              "@type": "type.googleapis.com/google.actions.v2.orders.FoodErrorExtension",
              "foodOrderErrors": [
                {
                  "error": "CLOSED",
                  "description": "The restaurant is closed."
                }
              ]
            }
          }
        }
      ]
    }
  }
}

결제 구현

결제를 구현할 때는 다음 단계를 따라야 합니다.

서비스 유효성 검사

첫 번째 서비스 오류 조건에 대해 FoodOrderError 반환 발견. 이러한 오류는 복구할 수 없으므로 처음 발생한 오류는 반환합니다. 다음에 대한 설명은 오류 처리를 참조하세요. 오류가 발생할 수 있습니다

  1. 아래의 FulfillmentOptionInfo 속성을 fulfillment 유형이 delivery인지 pickup인지 확인합니다.
  2. 필요한 경우 다음 오류 유형을 반환합니다.

    오류 유형 사용 사례
    유효하지 않음 처리 유형이 잘못되었습니다.
    NOT_FOUND fulfillment 유형을 찾을 수 없습니다.
    종료됨
    • 주문에 대한 OperationHours 기간이 없습니다.
    • 주문이 ASAP 주문이며 현재 이용 가능한 ASAP ServiceHours가 없습니다.
    • 긴급 폐쇄 발생 또는 isDisabled 서비스가 true입니다.
    특수 창은 일반 기간보다 우선 적용됩니다. 기간 유효성 검사 정렬일시적으로 서비스 항목 삭제의 예를 참고하세요.
    UNAVAILABLE_SLOT 미리 주문을 처리할 수 없습니다.
    NO_CAPACITY 음식점이 혼잡하여 현재 주문을 받지 않고 있습니다.
    OUT_OF_SERVICE_AREA 주문 상품을 사용자의 주소로 배송할 수 없습니다. 예시는 배송 주소 유효성 검사를 참고하세요.
    NO_COURIER_AVAILABLE 배송 인력이 제한되어 있어 주문을 배송할 수 없습니다.

장바구니 확인 및 가격 책정

  1. 장바구니를 조회lineItems하고 판매자 시스템에서 식별할 수 있습니다 이 MenuItemOffer.sku 값이 포함됩니다. LineItem으로 설정합니다.offerId 만들기 FoodOrderError가 포함됩니다(필요한 경우). 만들기 각 항목당 최대 1개의 오류가 허용됩니다. 다음과 같은 경우 다음 오류 유형을 반환합니다. 필요:

    오류 유형 사용 사례 복구 가능
    유효하지 않음 항목 데이터 또는 옵션 데이터가 잘못되었습니다. 아니요
    NOT_FOUND 항목 또는 옵션을 찾을 수 없습니다. 아니요
    PRICE_CHANGED 항목 또는 부가기능 조합의 가격이 변경되었습니다. 이 오류는 복구 가능한 오류로 취급할 수 있습니다.
    AVAILABILITY_CHANGED 광고 항목 또는 옵션에 대해 요청된 금액을 사용할 수 없습니다.
    REQUIREMENTS_NOT_MET 최소 주문 금액 또는 최대 주문 금액을 충족하지 않습니다. 이는 장바구니 가격이 수수료.eligibleTransactionVolumeMin 미만인지 수수료eligibleTransactionVolumeMax 이상인지 확인하여 알 수 있습니다. 최소 주문 금액 유효성 검사의 예를 참고하세요. 아니요
  2. LineItemType을 사용하여 검증된 광고 항목 목록을 반환합니다. REGULAR입니다. 모든 장바구니 광고 항목 가격의 합계가 장바구니 가격 또는 SUBTOTAL

장바구니 항목 유효성 검사의 예를 참고하세요.

서비스 수수료 계산

  1. 다음을 기준으로 서비스의 올바른 Fee 항목을 찾습니다. eligibleRegion, validFrom, validThrough, priority
  2. 항목이 price로 정의된지 여부에 따라 수수료를 계산합니다. percentageOfCart 또는 pricePerMeter 속성
  3. 배달 또는 테이크아웃 서비스 수수료를LineItem LineItemType은 각각 DELIVERY 또는 FEE입니다. 수수료 추가 장바구니.otherItems 목록에 추가합니다.

프로모션 적용

  1. 일치하는 Deal 항목을 찾습니다. 거래를 통한 프로모션.coupon 가치dealCode.
  2. 거래를 확인하고 필요한 경우 FoodOrderError를 반환합니다. 이러한 오류는 복구 가능한 것으로 처리할 수 있습니다. 다음 오류 유형 반환 다음을 수행합니다.

    오류 유형 사용 사례
    PROMO_NOT_RECOGNIZED 쿠폰 코드를 인식할 수 없습니다.
    PROMO_EXPIRED 거래 유효 기간이 만료되었습니다.
    PROMO_ORDER_INELIGIBLE 쿠폰을 사용할 수 없는 주문입니다.
    PROMO_NOT_APPLICABLE 기타 이유
  3. 거래를 기준으로 거래 가격을 계산합니다.discount 또는 거래.discountPercentage.

  4. 다음에 따라 장바구니 총액 또는 수수료 합계를 사용하여 거래 가격 금액을 적용합니다. 거래.dealType.

  5. 적용된 프로모션으로 장바구니promotions를 반품합니다.

  6. 프로모션을 다음 항목이 포함된 LineItem으로 반환합니다. LineItemType DISCOUNT입니다. 다음에 할인 추가: 장바구니.otherItems 마이너스 가격 목록.

응답 반환

  1. ProposedOrder.cart를 만듭니다. 응답 장바구니는 유효성 검사 중에 오류가 발생하지 않으면 요청 장바구니와 동일합니다.
  2. 다음을 포함하여 ProposedOrder.otherItems 목록을 반환합니다. 세금, 수수료, 봉사료 및 할인(적용되는 경우)이 포함됩니다. 다음에 대한 혜택을 참조하세요. 을 참조하세요.
  3. 장바구니를 추가하여 ProposedOrder.totalPrice를 포함합니다. 가격, 수수료, 할인, 세금, 봉사료 등이 포함됩니다.
  4. 반환 값: FoodOrderExtension.availableFulfillmentOptions이 각 FulfillmentOption을 참고하세요. 예상 가격 업데이트 수령 또는 배송 시간을 예상 시간으로 변경합니다.
  5. 이전 유효성 검사에서 생성된 FoodOrderErrors가 있는 경우: <ph type="x-smartling-placeholder">
      </ph>
    • StructuredResponse.errorFoodErrorExtension.foodOrderErrors에 오류가 있습니다.
    • 다음에서 ProposedOrder를 반환 모든 오류를 복구할 수 있는 경우 correctedProposedOrder 필드
    • paymentOptions에서 PaymentOptions를 반환합니다. 필드를 반환합니다.
    • 필요한 경우 다른 항목이 있는 경우 additionalPaymentOptions를 포함합니다. 결제 옵션을 사용할 수 있고 모든 오류를 복구할 수 있습니다.
  6. 유효성 검사 오류가 없으면 proposedOrder를 반환합니다. CheckoutResponse 객체의 paymentOptions 필요한 경우 다른 항목이 있는 경우 additionalPaymentOptions를 포함합니다. 결제 옵션을 사용할 수 있습니다.