Checkout را تنظیم کنید

فرآیند پرداخت زمانی فراخوانی می شود که کاربر یک سبد خرید ایجاد می کند. محتویات سبد خرید کاربر و جزئیات سفارش به وب سرویس پایان به انتها سفارش شما ارسال می شود. این اطلاعات توسط وب سرویس شما تأیید می شود و سپس می توانید ادامه دهید یا در صورت نیاز تنظیماتی را در سبد خرید آنها انجام دهید.

کنترل کننده پرداخت برای وب سرویس شما باید به درخواست های POST پاسخ دهد. وقتی مشتری تصمیم به تسویه حساب می‌کند، Google برای سرویس وب سفارش‌دهی پایان به انتها بدنه درخواست JSON را در قالب یک CheckoutRequestMessage ارسال می‌کند که حاوی جزئیات Cart مشتری است. سپس سرویس وب شما با یک CheckoutResponseMessage پاسخ می دهد. نمودار زیر فرآیند را نشان می دهد.

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 استفاده می‌کند.

نمونه پاسخ موفق

{
    "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 را در درخواست بخوانید تا تعیین کنید که آیا نوع انجام برای delivery یا pickup است.
  2. در صورت نیاز انواع خطاهای زیر را برگردانید:

    نوع خطا مورد استفاده
    نامعتبر نوع انجام نامعتبر است.
    NOT_FOUND نوع تحقق یافت نشد.
    بسته شده
    • هیچ پنجره عملیات ساعتی برای سفارش وجود ندارد.
    • سفارش یک سفارش ASAP است و هیچ ساعت خدمات ASAP برای زمان فعلی موجود نیست.
    • بسته شدن اضطراری وجود دارد یا سرویس isDisabled درست است.
    توجه داشته باشید که پنجره های ویژه بر ویندوزهای معمولی اولویت دارند. نمونه هایی را در سفارش اعتبار سنجی پنجره مشاهده کنید و نهادهای سرویس را به طور موقت حذف کنید .
    UNAVAILABLE_SLOT سفارش از قبل قابل انجام نیست.
    NO_CAPACITY رستوران شلوغ است و در حال حاضر سفارشی نمی گیرد.
    OUT_OF_SERVICE_AREA سفارش به آدرس کاربر قابل تحویل نیست. برای مثال به تأیید اعتبار آدرس تحویل مراجعه کنید.
    NO_COURIER_AVAILABLE به دلیل محدودیت پرسنل تحویل، سفارش قابل تحویل نیست.

سبد خرید را تایید و قیمت گذاری کنید

  1. هر سبد خرید را جستجو کنید. lineItems و اعتبارسنجی با داده های فعلی در سیستم شما یا در سیستم تاجر. MenuItemOffer . مقدار sku از موجودیت فید به عنوان LineItem گنجانده شده است. offerId . در صورت نیاز برای هر مورد خط یک FoodOrderError ایجاد کنید. برای هر مورد حداکثر یک خطا ایجاد کنید. در صورت نیاز انواع خطاهای زیر را برگردانید:

    نوع خطا مورد استفاده قابل بازیابی
    نامعتبر داده های مورد یا هر یک از داده های گزینه نامعتبر است. خیر
    NOT_FOUND مورد یا هیچ یک از گزینه ها یافت نشد. خیر
    PRICE_CHANGED قیمت یک مورد یا ترکیب افزودنی تغییر کرده است. این خطا را می توان به عنوان قابل بازیابی در نظر گرفت. بله
    AVAILABILITY_CHANGED مبلغ درخواستی برای آیتم های خط یا هیچ یک از گزینه ها در دسترس نیست. بله
    REQUIREMENTS_NOT_MET حداقل سفارش یا حداکثر سفارش رعایت نمی شود. این را می توان با بررسی اینکه آیا قیمت سبد خرید زیر کارمزد است یا خیر تعیین می شود. eligibleTransactionVolumeMin یا بالاتر از کارمزد . eligibleTransactionVolumeMax . مثال را در اعتبارسنجی حداقل ارزش سفارش مشاهده کنید. خیر
  2. لیست تایید شده lineItems را با LineItemType REGULAR برگردانید. مجموع تمام قیمت‌های اقلام سبد خرید، قیمت سبد خرید یا SUBTOTAL است.

نمونه هایی را در اعتبارسنجی اقلام سبد خرید ببینید.

هزینه خدمات را محاسبه کنید

  1. موجودیت Fee مناسب برای سرویس را بر اساس eligibleRegion ، validFrom ، validThrough و priority پیدا کنید.
  2. مقدار کارمزد را بر اساس اینکه آیا نهاد با ویژگی price ، percentageOfCart یا pricePerMeter تعریف شده است، محاسبه کنید.
  3. هزینه سرویس تحویل یا تحویل را به عنوان LineItem با LineItemType DELIVERY یا FEE برگردانید. هزینه را به سبد خرید اضافه کنید. لیست otherItems

تبلیغات را اعمال کنید

  1. موجودیت معامله را بر اساس تطبیق تبلیغات پیدا کنید. ارزش coupon با معامله . dealCode .
  2. قرارداد را تأیید کنید و در صورت نیاز یک FoodOrderError برگردانید. این خطاها را می توان به عنوان قابل بازیابی در نظر گرفت. در صورت نیاز انواع خطاهای زیر را برگردانید:

    نوع خطا مورد استفاده
    PROMO_NOT_RECOGNIZED کد کوپن شناسایی نشد.
    PROMO_EXPIRED اعتبار معامله منقضی شده است.
    PROMO_ORDER_INELIGIBLE سفارش واجد شرایط دریافت کوپن نیست.
    PROMO_NOT_APPLICABLE هر دلیل دیگری
  3. مبلغ قیمت معامله را بر اساس Deal محاسبه کنید. discount یا معامله . discountPercentage .

  4. بسته به معامله ، مبلغ قیمت معامله را با استفاده از کل سبد خرید یا کل کارمزد اعمال کنید. dealType .

  5. سبد خرید را برگردانید. promotions با تبلیغات کاربردی

  6. با LineItemType DISCOUNT تبلیغ را به عنوان LineItem برگردانید. تخفیف را به سبد خرید اضافه کنید. لیست otherItems با قیمت منفی.

پاسخ را برگردانید

  1. سفارش پیشنهادی را ایجاد کنید. cart ، اگر در حین اعتبارسنجی با خطایی مواجه نشد، سبد پاسخ مانند سبد درخواست است.
  2. سفارش پیشنهادی را برگردانید. لیست otherItems شامل مالیات، هزینه ها، انعام و تخفیف در صورت اعمال. برای جزئیات بیشتر در مورد نحوه پیکربندی آیتم Gratuity به Gratuity مراجعه کنید.
  3. سفارش پیشنهادی را شامل شود. totalPrice با اضافه کردن قیمت سبد خرید، کارمزد، تخفیف، مالیات و انعام.
  4. FoodOrderExtension را برگردانید. availableFulfillmentOptions با FulfillmentOption مربوطه. زمان تخمینی تحویل یا تحویل را به زمان مورد انتظار به‌روزرسانی کنید.
  5. اگر خطاهای FoodOrder ایجاد شده از بررسی های اعتبار سنجی قبلی وجود داشته باشد:
    • شامل StructuredResponse . error و لیست خطاها در FoodErrorExtension . foodOrderErrors
    • اگر همه خطاها قابل بازیابی هستند، ProposedOrder را در قسمت correctedProposedOrder برگردانید.
    • اگر همه خطاها قابل بازیابی هستند، گزینه‌های پرداخت را در قسمت paymentOptions بازگردانید.
    • اگر گزینه‌های پرداخت دیگری در دسترس است و همه خطاها قابل بازیابی هستند، به‌صورت اختیاری، additionalPaymentOptions را اضافه کنید.
  6. اگر هیچ خطایی در تأیید اعتبار وجود ندارد، proposedOrder ، paymentOptions در شی CheckoutResponse برگردانید. در صورت وجود گزینه های پرداخت دیگری، به صورت اختیاری، additionalPaymentOptions را نیز اضافه کنید.