결제 프로세스는 사용자가 장바구니를 만들 때 호출됩니다. 이 사용자의 장바구니 및 주문 세부정보가 주문 엔드 투 엔드 웹으로 전송됩니다. 있습니다. 이 정보는 웹 서비스에서 검증되며, 사용자는 계속 진행하거나 필요에 따라 장바구니를 조정할 수 있습니다.
웹 서비스의 결제 핸들러는 POST 요청에 응답해야 합니다. 사용자가
고객이 결제를 선택하면 Google은 주문 엔드 투 엔드 웹 서비스를
CheckoutRequestMessage
형식의 JSON 요청 본문이며 여기에는 다음이 포함됩니다.
고객의 Cart
세부정보 그러면 웹 서비스는
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
에서는 성공 또는 실패 여부를 다루어야 합니다.
합니다.
요청 성공
결제 요청이 성공하면 CheckoutResponseMessage
에
ProposedOrder
및
PaymentOptions
:
ProposedOrder
cart
:cart
객체:CheckoutRequestMessage
입니다. 장바구니의 내용물 중 하나라도 변경되면CheckoutResponseMessage
에FoodErrorExtension
를 수정된ProposedOrder
로 바꿉니다.otherItems
: 배송비 등 제공업체가 추가한 항목입니다. 세금, 기타 수수료가 포함됩니다. 사용자가 추가한 봉사료도 포함할 수 있습니다.totalPrice
: 총 주문 가격입니다.extension
: fulfillment 정보를 정의하는FoodOrderExtension
입니다. 주문 정보(예: 배송 시간)를 확인할 수 있습니다.
PaymentOptions
- 결제 처리 설정은 나중에 Google 설정
결제를 탭합니다.
다음 작업을 할 때까지
CheckoutResponseMessage
에서 자리표시자 JSON을 사용할 수 있습니다. 결제 처리를 구현할 준비가 된 경우 CheckoutResponseMessage
에 자리표시자 결제 옵션을 추가하려면 다음 안내를 따르세요. 아래의 예를 참조하세요. 이 예시는PaymentOptions
의 결제 게이트웨이 예시
- 결제 처리 설정은 나중에 Google 설정
결제를 탭합니다.
다음 작업을 할 때까지
성공적인 응답의 예
{
"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 반환 발견. 이러한 오류는 복구할 수 없으므로 처음 발생한 오류는 반환합니다. 다음에 대한 설명은 오류 처리를 참조하세요. 오류가 발생할 수 있습니다
- 아래의 FulfillmentOptionInfo 속성을
fulfillment 유형이
delivery
인지pickup
인지 확인합니다. 필요한 경우 다음 오류 유형을 반환합니다.
오류 유형 사용 사례 유효하지 않음 처리 유형이 잘못되었습니다. NOT_FOUND fulfillment 유형을 찾을 수 없습니다. 종료됨 - 주문에 대한 OperationHours 기간이 없습니다.
- 주문이 ASAP 주문이며 현재 이용 가능한 ASAP ServiceHours가 없습니다.
- 긴급 폐쇄 발생 또는
isDisabled
서비스가 true입니다.
UNAVAILABLE_SLOT 미리 주문을 처리할 수 없습니다. NO_CAPACITY 음식점이 혼잡하여 현재 주문을 받지 않고 있습니다. OUT_OF_SERVICE_AREA 주문 상품을 사용자의 주소로 배송할 수 없습니다. 예시는 배송 주소 유효성 검사를 참고하세요. NO_COURIER_AVAILABLE 배송 인력이 제한되어 있어 주문을 배송할 수 없습니다.
장바구니 확인 및 가격 책정
각 장바구니를 조회
lineItems
하고 판매자 시스템에서 식별할 수 있습니다 이 MenuItemOffer.sku
값이 포함됩니다. LineItem으로 설정합니다.offerId
만들기 FoodOrderError가 포함됩니다(필요한 경우). 만들기 각 항목당 최대 1개의 오류가 허용됩니다. 다음과 같은 경우 다음 오류 유형을 반환합니다. 필요:오류 유형 사용 사례 복구 가능 유효하지 않음 항목 데이터 또는 옵션 데이터가 잘못되었습니다. 아니요 NOT_FOUND 항목 또는 옵션을 찾을 수 없습니다. 아니요 PRICE_CHANGED 항목 또는 부가기능 조합의 가격이 변경되었습니다. 이 오류는 복구 가능한 오류로 취급할 수 있습니다. 예 AVAILABILITY_CHANGED 광고 항목 또는 옵션에 대해 요청된 금액을 사용할 수 없습니다. 예 REQUIREMENTS_NOT_MET 최소 주문 금액 또는 최대 주문 금액을 충족하지 않습니다. 이는 장바구니 가격이 수수료. eligibleTransactionVolumeMin
미만인지 수수료eligibleTransactionVolumeMax
이상인지 확인하여 알 수 있습니다. 최소 주문 금액 유효성 검사의 예를 참고하세요.아니요 LineItemType을 사용하여 검증된 광고 항목 목록을 반환합니다.
REGULAR
입니다. 모든 장바구니 광고 항목 가격의 합계가 장바구니 가격 또는SUBTOTAL
장바구니 항목 유효성 검사의 예를 참고하세요.
서비스 수수료 계산
- 다음을 기준으로 서비스의 올바른 Fee 항목을 찾습니다.
eligibleRegion
,validFrom
,validThrough
,priority
- 항목이
price
로 정의된지 여부에 따라 수수료를 계산합니다.percentageOfCart
또는pricePerMeter
속성 - 배달 또는 테이크아웃 서비스 수수료를LineItem
LineItemType은 각각
DELIVERY
또는FEE
입니다. 수수료 추가 장바구니.otherItems
목록에 추가합니다.
프로모션 적용
- 일치하는 Deal 항목을 찾습니다.
거래를 통한 프로모션.
coupon
가치dealCode
. 거래를 확인하고 필요한 경우 FoodOrderError를 반환합니다. 이러한 오류는 복구 가능한 것으로 처리할 수 있습니다. 다음 오류 유형 반환 다음을 수행합니다.
오류 유형 사용 사례 PROMO_NOT_RECOGNIZED 쿠폰 코드를 인식할 수 없습니다. PROMO_EXPIRED 거래 유효 기간이 만료되었습니다. PROMO_ORDER_INELIGIBLE 쿠폰을 사용할 수 없는 주문입니다. PROMO_NOT_APPLICABLE 기타 이유 다음에 따라 장바구니 총액 또는 수수료 합계를 사용하여 거래 가격 금액을 적용합니다. 거래.
dealType
.적용된 프로모션으로 장바구니
promotions
를 반품합니다.프로모션을 다음 항목이 포함된 LineItem으로 반환합니다. LineItemType
DISCOUNT
입니다. 다음에 할인 추가: 장바구니.otherItems
마이너스 가격 목록.
응답 반환
- ProposedOrder.
cart
를 만듭니다. 응답 장바구니는 유효성 검사 중에 오류가 발생하지 않으면 요청 장바구니와 동일합니다. - 다음을 포함하여 ProposedOrder.
otherItems
목록을 반환합니다. 세금, 수수료, 봉사료 및 할인(적용되는 경우)이 포함됩니다. 다음에 대한 혜택을 참조하세요. 을 참조하세요. - 장바구니를 추가하여 ProposedOrder.
totalPrice
를 포함합니다. 가격, 수수료, 할인, 세금, 봉사료 등이 포함됩니다. - 반환 값:
FoodOrderExtension.
availableFulfillmentOptions
이 각 FulfillmentOption을 참고하세요. 예상 가격 업데이트 수령 또는 배송 시간을 예상 시간으로 변경합니다. - 이전 유효성 검사에서 생성된 FoodOrderErrors가 있는 경우:
<ph type="x-smartling-placeholder">
- </ph>
- StructuredResponse.
error
및 FoodErrorExtension.foodOrderErrors
에 오류가 있습니다. - 다음에서 ProposedOrder를 반환
모든 오류를 복구할 수 있는 경우
correctedProposedOrder
필드 paymentOptions
에서 PaymentOptions를 반환합니다. 필드를 반환합니다.- 필요한 경우 다른 항목이 있는 경우
additionalPaymentOptions
를 포함합니다. 결제 옵션을 사용할 수 있고 모든 오류를 복구할 수 있습니다.
- StructuredResponse.
- 유효성 검사 오류가 없으면
proposedOrder
를 반환합니다. CheckoutResponse 객체의paymentOptions
필요한 경우 다른 항목이 있는 경우additionalPaymentOptions
를 포함합니다. 결제 옵션을 사용할 수 있습니다.