결제 설정

사용자가 장바구니를 만들면 결제 프로세스가 호출됩니다. 사용자의 장바구니 콘텐츠 및 주문 세부정보가 Order with Google 웹 서비스로 전송됩니다. 이 정보는 웹 서비스에서 검증한 다음 필요에 따라 계속 진행하거나 장바구니를 조정할 수 있습니다.

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

CheckoutResponseMessage는 고객의 수정되지 않은 장바구니 또는 오류를 반환합니다.

결제 요청을 받으면 Order with Google 웹 서비스에서 다음을 실행해야 합니다.

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

결제를 구현하기 전에 처리 개요 문서를 검토하는 것이 좋습니다.

결제 요청 메시지

고객의 장바구니를 검증하기 위해 고객이 결제하려고 선택하면 Google은 CheckoutRequestMessage 본문의 JSON 본문과 함께 웹 서비스에 요청을 전송합니다. 고객 주문은 나중에 'Google을 통한 주문' 절차에서 제출되지 않습니다.

CheckoutRequestMessage에 포함된 데이터에는 다음이 포함됩니다.

  • 인텐트: 모든 결제 요청 본문의 inputs[0].intent 필드에는 actions.foodordering.intent.CHECKOUT 문자열 값이 포함됩니다.
  • 장바구니: 결제 요청의 inputs[0].arguments[0].extension 필드에는 고객의 장바구니를 나타내는 Cart 객체가 포함됩니다.
  • 배달 또는 테이크아웃: Cart 객체의 확장 프로그램 필드에는 배달 또는 테이크아웃 속성을 지정하는 FoodCartExtension 객체가 포함됩니다.
    • 배송 주문의 경우 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
}

결제 응답 메시지

Order with Google 서비스로부터 요청을 받은 후 결제 웹 서비스는 이를 처리하고 CheckoutResponseMessage로 응답해야 합니다. CheckoutResponseMessage는 성공 또는 실패 요청 중 하나를 처리해야 합니다.

요청 성공

결제 요청이 성공하면 CheckoutResponseMessageProposedOrderPaymentOptions를 포함해야 합니다.

  • ProposedOrder

    • cart: CheckoutRequestMessage에 제공된 장바구니와 동일한 cart 객체입니다. 장바구니의 콘텐츠를 변경해야 하는 경우 CheckoutResponseMessage는 대신 수정된 ProposedOrderFoodErrorExtension를 포함해야 합니다.
    • otherItems: 배송 요금, 세금, 기타 수수료 등 제공업체가 추가한 항목입니다. 사용자가 추가한 봉사료도 포함될 수 있습니다.
    • totalPrice: 주문의 총 가격입니다.
    • extension: 배송 시간 등 주문의 처리 정보를 정의하는 FoodOrderExtension입니다.
  • PaymentOptions

    • 결제 처리 설정은 나중에 Google Pay 설정에서 다룹니다. 결제 처리를 구현할 준비가 될 때까지 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": []
                                        }
                                    }
                                }
                            ]
                        }
                    }
                }
            ]
        }
    }
}

요청 실패

결제 요청에 실패하면 발생한 오류를 설명하는 FoodOrderError 항목 목록이 포함된 FoodErrorExtensionCheckoutResponseMessage에 포함해야 합니다. 장바구니에 있는 상품의 가격을 변경하는 등 주문에 복구할 수 있는 오류가 있는 경우 FoodErrorExtensioncorrectedProposedOrder가 포함되어야 합니다.

실패한 응답 예시

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