사용자가 장바구니를 만들면 결제 프로세스가 호출됩니다. 사용자의 장바구니 콘텐츠 및 주문 세부정보가 Order with Google 웹 서비스로 전송됩니다. 이 정보는 웹 서비스에서 검증한 다음 필요에 따라 계속 진행하거나 장바구니를 조정할 수 있습니다.
웹 서비스의 결제 핸들러가 POST 요청에 응답해야 합니다. 고객이 결제를 선택하면 Google은 Order with Google 웹 서비스에 JSON 형식으로 된 JSON 요청 본문을 CheckoutRequestMessage
형식으로 전송하며 여기에는 고객의 Cart
세부정보가 포함됩니다. 그러면 웹 서비스가 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
는 성공 또는 실패 요청 중 하나를 처리해야 합니다.
요청 성공
결제 요청이 성공하면 CheckoutResponseMessage
에 ProposedOrder
및 PaymentOptions
를 포함해야 합니다.
ProposedOrder
cart
:CheckoutRequestMessage
에 제공된 장바구니와 동일한cart
객체입니다. 장바구니의 콘텐츠를 변경해야 하는 경우CheckoutResponseMessage
는 대신 수정된ProposedOrder
의FoodErrorExtension
를 포함해야 합니다.otherItems
: 배송 요금, 세금, 기타 수수료 등 제공업체가 추가한 항목입니다. 사용자가 추가한 봉사료도 포함될 수 있습니다.totalPrice
: 주문의 총 가격입니다.extension
: 배송 시간 등 주문의 처리 정보를 정의하는FoodOrderExtension
입니다.
PaymentOptions
- 결제 처리 설정은 나중에 Google Pay 설정에서 다룹니다.
결제 처리를 구현할 준비가 될 때까지
CheckoutResponseMessage
에서 자리표시자 JSON을 사용할 수 있습니다. CheckoutResponseMessage
에 자리표시자 결제 옵션을 추가하려면PaymentOptions
의 결제 게이트웨이 예시를 사용하는 아래의 예시를 참조하세요.
- 결제 처리 설정은 나중에 Google Pay 설정에서 다룹니다.
결제 처리를 구현할 준비가 될 때까지
성공한 응답 예시
{
"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
항목 목록이 포함된 FoodErrorExtension
를
CheckoutResponseMessage
에 포함해야 합니다. 장바구니에 있는 상품의 가격을 변경하는 등 주문에 복구할 수 있는 오류가 있는 경우 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."
}
]
}
}
}
]
}
}
}