فرآیند پرداخت زمانی فراخوانی می شود که کاربر یک سبد خرید ایجاد می کند. محتویات سبد خرید کاربر و جزئیات سفارش به وب سرویس پایان به انتها سفارش شما ارسال می شود. این اطلاعات توسط وب سرویس شما تأیید می شود و سپس می توانید ادامه دهید یا در صورت نیاز تنظیماتی را در سبد خرید آنها انجام دهید.
کنترل کننده پرداخت برای وب سرویس شما باید به درخواست های POST پاسخ دهد. وقتی مشتری تصمیم به تسویه حساب میکند، Google برای سرویس وب سفارشدهی پایان به انتها بدنه درخواست JSON را در قالب یک CheckoutRequestMessage
ارسال میکند که حاوی جزئیات Cart
مشتری است. سپس سرویس وب شما با یک CheckoutResponseMessage
پاسخ می دهد. نمودار زیر فرآیند را نشان می دهد.
به محض دریافت درخواست تسویهحساب، سرویس وب سفارشی پایان به پایان شما باید موارد زیر را انجام دهد:
- اعتبار سبد خرید را بر اساس قیمتهای فعلی کالا، در دسترس بودن و خدمات ارائهدهنده بررسی کنید.
- قیمت کل (شامل هر گونه تخفیف، مالیات و هزینه تحویل) را محاسبه کنید.
- در صورت موفقیت، با یک سبد خرید اصلاح نشده پاسخ دهید.
- اگر ناموفق بود، با یک پیام خطا و یک سفارش پیشنهادی جدید پاسخ دهید.
قبل از شروع اجرای تسویه حساب، توصیه می کنیم مستندات نمای کلی Fulfillment را مرور کنید.
پیام درخواست پرداخت
به منظور اعتبارسنجی سبد خرید مشتری، وقتی مشتری تصمیم به تسویه حساب میکند، Google درخواستی را با بدنه JSON در قالب CheckoutRequestMessage
به وب سرویس شما ارسال میکند. سفارش مشتری تا بعداً در جریان سفارش از پایان به پایان ارسال نمی شود.
داده های موجود در CheckoutRequestMessage
شامل موارد زیر است:
- Intent: فیلد
inputs[0].intent
هر بدنه درخواست پرداخت شامل مقدار رشتهactions.foodordering.intent.CHECKOUT
است. - سبد خرید: فیلد
inputs[0].arguments[0].extension
درخواست تسویهحساب شامل یک شیءCart
است که نشاندهنده سبد خرید مشتری است. - تحویل یا خروج: فیلد پسوند شی
Cart
حاوی یک شیءFoodCartExtension
است که ویژگیهایی را برای تحویل یا بیرونآوری مشخص میکند:- برای سفارشات تحویل، شی
FoodCartExtension
شامل آدرس تحویل است. - برای سفارشهای تحویل یا تحویل، شی
FoodCartExtension
حاوی هیچ اطلاعات مکان نیست.
- برای سفارشات تحویل، شی
- Sandbox: فیلد
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
: یکFoodOrderExtension
که اطلاعات تکمیلی را برای سفارش تعریف می کند، مانند زمان تحویل.
-
PaymentOptions
- راهاندازی پردازش پرداخت بعداً در راهاندازی Google Pay پوشش داده میشود. تا زمانی که برای اجرای پردازش پرداخت آماده باشید، میتوانید از متغیر JSON در
CheckoutResponseMessage
خود استفاده کنید. - برای افزودن گزینههای پرداخت متغیر در
CheckoutResponseMessage
، به مثال زیر مراجعه کنید، که از یک درگاه پرداخت نمونه برایPaymentOptions
استفاده میکند.
- راهاندازی پردازش پرداخت بعداً در راهاندازی Google Pay پوشش داده میشود. تا زمانی که برای اجرای پردازش پرداخت آماده باشید، میتوانید از متغیر JSON در
نمونه پاسخ موفق
{
"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 را در درخواست بخوانید تا تعیین کنید که آیا نوع انجام برای
delivery
یاpickup
است. در صورت نیاز انواع خطاهای زیر را برگردانید:
نوع خطا مورد استفاده نامعتبر نوع انجام نامعتبر است. NOT_FOUND نوع تحقق یافت نشد. بسته شده - هیچ پنجره عملیات ساعتی برای سفارش وجود ندارد.
- سفارش یک سفارش ASAP است و هیچ ساعت خدمات ASAP برای زمان فعلی موجود نیست.
- بسته شدن اضطراری وجود دارد یا سرویس
isDisabled
درست است.
UNAVAILABLE_SLOT سفارش از قبل قابل انجام نیست. NO_CAPACITY رستوران شلوغ است و در حال حاضر سفارشی نمی گیرد. OUT_OF_SERVICE_AREA سفارش به آدرس کاربر قابل تحویل نیست. برای مثال به تأیید اعتبار آدرس تحویل مراجعه کنید. NO_COURIER_AVAILABLE به دلیل محدودیت پرسنل تحویل، سفارش قابل تحویل نیست.
سبد خرید را تایید و قیمت گذاری کنید
هر سبد خرید را جستجو کنید.
lineItems
و اعتبارسنجی با داده های فعلی در سیستم شما یا در سیستم تاجر. MenuItemOffer . مقدارsku
از موجودیت فید به عنوان LineItem گنجانده شده است.offerId
. در صورت نیاز برای هر مورد خط یک FoodOrderError ایجاد کنید. برای هر مورد حداکثر یک خطا ایجاد کنید. در صورت نیاز انواع خطاهای زیر را برگردانید:نوع خطا مورد استفاده قابل بازیابی نامعتبر داده های مورد یا هر یک از داده های گزینه نامعتبر است. خیر NOT_FOUND مورد یا هیچ یک از گزینه ها یافت نشد. خیر PRICE_CHANGED قیمت یک مورد یا ترکیب افزودنی تغییر کرده است. این خطا را می توان به عنوان قابل بازیابی در نظر گرفت. بله AVAILABILITY_CHANGED مبلغ درخواستی برای آیتم های خط یا هیچ یک از گزینه ها در دسترس نیست. بله REQUIREMENTS_NOT_MET حداقل سفارش یا حداکثر سفارش رعایت نمی شود. این را می توان با بررسی اینکه آیا قیمت سبد خرید زیر کارمزد است یا خیر تعیین می شود. eligibleTransactionVolumeMin
یا بالاتر از کارمزد .eligibleTransactionVolumeMax
. مثال را در اعتبارسنجی حداقل ارزش سفارش مشاهده کنید.خیر لیست تایید شده lineItems را با LineItemType
REGULAR
برگردانید. مجموع تمام قیمتهای اقلام سبد خرید، قیمت سبد خرید یاSUBTOTAL
است.
نمونه هایی را در اعتبارسنجی اقلام سبد خرید ببینید.
هزینه خدمات را محاسبه کنید
- موجودیت Fee مناسب برای سرویس را بر اساس
eligibleRegion
،validFrom
،validThrough
وpriority
پیدا کنید. - مقدار کارمزد را بر اساس اینکه آیا نهاد با ویژگی
price
،percentageOfCart
یاpricePerMeter
تعریف شده است، محاسبه کنید. - هزینه سرویس تحویل یا تحویل را به عنوان LineItem با LineItemType
DELIVERY
یاFEE
برگردانید. هزینه را به سبد خرید اضافه کنید. لیستotherItems
تبلیغات را اعمال کنید
- موجودیت معامله را بر اساس تطبیق تبلیغات پیدا کنید. ارزش
coupon
با معامله .dealCode
. قرارداد را تأیید کنید و در صورت نیاز یک FoodOrderError برگردانید. این خطاها را می توان به عنوان قابل بازیابی در نظر گرفت. در صورت نیاز انواع خطاهای زیر را برگردانید:
نوع خطا مورد استفاده PROMO_NOT_RECOGNIZED کد کوپن شناسایی نشد. PROMO_EXPIRED اعتبار معامله منقضی شده است. PROMO_ORDER_INELIGIBLE سفارش واجد شرایط دریافت کوپن نیست. PROMO_NOT_APPLICABLE هر دلیل دیگری مبلغ قیمت معامله را بر اساس Deal محاسبه کنید.
discount
یا معامله .discountPercentage
.بسته به معامله ، مبلغ قیمت معامله را با استفاده از کل سبد خرید یا کل کارمزد اعمال کنید.
dealType
.سبد خرید را برگردانید.
promotions
با تبلیغات کاربردیبا LineItemType
DISCOUNT
تبلیغ را به عنوان LineItem برگردانید. تخفیف را به سبد خرید اضافه کنید. لیستotherItems
با قیمت منفی.
پاسخ را برگردانید
- سفارش پیشنهادی را ایجاد کنید.
cart
، اگر در حین اعتبارسنجی با خطایی مواجه نشد، سبد پاسخ مانند سبد درخواست است. - سفارش پیشنهادی را برگردانید. لیست
otherItems
شامل مالیات، هزینه ها، انعام و تخفیف در صورت اعمال. برای جزئیات بیشتر در مورد نحوه پیکربندی آیتم Gratuity به Gratuity مراجعه کنید. - سفارش پیشنهادی را شامل شود.
totalPrice
با اضافه کردن قیمت سبد خرید، کارمزد، تخفیف، مالیات و انعام. - FoodOrderExtension را برگردانید.
availableFulfillmentOptions
با FulfillmentOption مربوطه. زمان تخمینی تحویل یا تحویل را به زمان مورد انتظار بهروزرسانی کنید. - اگر خطاهای FoodOrder ایجاد شده از بررسی های اعتبار سنجی قبلی وجود داشته باشد:
- شامل StructuredResponse .
error
و لیست خطاها در FoodErrorExtension .foodOrderErrors
- اگر همه خطاها قابل بازیابی هستند، ProposedOrder را در قسمت
correctedProposedOrder
برگردانید. - اگر همه خطاها قابل بازیابی هستند، گزینههای پرداخت را در قسمت
paymentOptions
بازگردانید. - اگر گزینههای پرداخت دیگری در دسترس است و همه خطاها قابل بازیابی هستند، بهصورت اختیاری،
additionalPaymentOptions
را اضافه کنید.
- شامل StructuredResponse .
- اگر هیچ خطایی در تأیید اعتبار وجود ندارد،
proposedOrder
،paymentOptions
در شی CheckoutResponse برگردانید. در صورت وجود گزینه های پرداخت دیگری، به صورت اختیاری،additionalPaymentOptions
را نیز اضافه کنید.