تنظیم ارسال سفارش

پس از تماس تسویه‌حساب ، کاربر سبد خرید به‌روزرسانی‌شده را با مالیات، هزینه‌های تحویل، تخفیف‌ها و سایر هزینه‌هایی که برمی‌گردانید بررسی می‌کند. کاربر سفارش را تأیید و ارسال می‌کند و Google یک درخواست JSON که حاوی اطلاعات سفارش است، نقطه پایانی برای شما ارسال می‌کند. سرویس وب شما باید این سفارش را دریافت کند، آن را پردازش کند و با وضعیت سفارش به Google پاسخ دهد.

در این بخش، قالب پیام درخواست سفارش ارسال شده توسط Google، به نام SubmitOrderRequestMessage ، و قالب پیام پاسخی که باید ارائه دهید، به نام SubmitOrderResponseMessage ارسال شده است. برای اطلاعات بیشتر در مورد چرخه عمر انجام سفارش، به نمای کلی Fulfillment مراجعه کنید.

اجرای سفارش

سرویس وب سفارش از پایان به انتها که برای کار با Ordering End-to-End می‌سازید باید دارای یک نشانی وب برای دریافت پیام‌های سفارش از Google باشد. برای پردازش سفارش، سرویس وب شما یک SubmitOrderRequestMessage در قالب JSON به عنوان یک درخواست POST از Google دریافت می کند. این درخواست حاوی سفارش مشتری، از جمله مالیات، هزینه‌ها و اطلاعات پرداخت است. پس از دریافت درخواست ارسال سفارش، وب سرویس شما باید موارد زیر را انجام دهد:

  • واجد شرایط بودن تراکنش، مانند تأیید کارت یا کشف تقلب را بررسی کنید.
  • یک سفارش در سیستم خود ایجاد کنید.
  • روش پرداخت را مجاز کنید و در صورت لزوم با API شارژ پردازنده پرداخت خود تماس بگیرید.
  • با وضعیت مناسب سفارش پاسخ دهید: CREATED ، CONFIRMED ، یا REJECTED .

پس از پردازش سفارش، کد تکمیل شما باید پاسخی را در قالب یک پیام SubmitOrderResponseMessage JSON به Google ارائه دهد.

برای اطلاعات بیشتر در مورد الزامات اجرای سرویس وب انجام سفارش از پایان به پایان، به نمای کلی Fulfillment مراجعه کنید.

پیام درخواست سفارش

هنگامی که مشتری تصمیم می‌گیرد در طول جریان سفارش از پایان به پایان سفارش دهد، Google درخواستی را با یک پیام JSON به نام SubmitOrderRequestMessage به سرویس وب شما ارسال می‌کند که حاوی داده‌های زیر است:

  1. Intent: فیلد inputs[0].intent هر بدنه درخواست سفارش ارسال حاوی مقدار رشته actions.intent.TRANSACTION_DECISION است.
  2. Order: فیلد inputs[0].arguments[0].transactionDecisionValue یک درخواست سفارش ارسال حاوی یک شی Order است که نشان دهنده سفارش مشتری برای ارسال به همراه جزئیات پرداخت است.
  3. پرچم Sandbox: قسمت isInSandbox درخواست سفارش ارسال نشان می‌دهد که آیا تراکنش از پرداخت‌های جعبه ایمنی استفاده می‌کند یا خیر.

نمونه درخواست سفارش

نمونه زیر SubmitOrderRequestMessage است:

JSON

{
    "user": {},
    "conversation": {
        "conversationId": "CTKbKfUlHCyDEdcz_5PBJTtf"
    },
    "inputs": [
        {
            "intent": "actions.intent.TRANSACTION_DECISION",
            "arguments": [
                {
                    "transactionDecisionValue": {
                        "order": {
                            "finalOrder": {
                                "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"
                                                ]
                                            }
                                        },
                                        "contact": {
                                            "displayName": "Hab Sy",
                                            "email": "hab9878.sy@gmail.com",
                                            "phoneNumber": "+61000000000",
                                            "firstName": "Hab",
                                            "lastName": "Sy"
                                        }
                                    }
                                },
                                "otherItems": [
                                    {
                                        "name": "Delivery fee",
                                        "type": "DELIVERY",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "3",
                                                "nanos": 500000000
                                            }
                                        }
                                    },
                                    {
                                        "name": "Subtotal",
                                        "type": "SUBTOTAL",
                                        "price": {
                                            "type": "ESTIMATE",
                                            "amount": {
                                                "currencyCode": "AUD",
                                                "units": "39",
                                                "nanos": 600000000
                                            }
                                        }
                                    }
                                ],
                                "totalPrice": {
                                    "type": "ESTIMATE",
                                    "amount": {
                                        "currencyCode": "AUD",
                                        "units": "43",
                                        "nanos": 100000000
                                    }
                                },
                                "extension": {
                                    "@type": "type.googleapis.com/google.actions.v2.orders.FoodOrderExtension"
                                }
                            },
                            "googleOrderId": "01412971004192156198",
                            "orderDate": "2020-10-22T09:02:06.173Z",
                            "paymentInfo": {
                                "displayName": "Pay when you get your food",
                                "paymentType": "ON_FULFILLMENT"
                            }
                        }
                    }
                }
            ]
        }
    ],
    "directActionOnly": true,
    "isInSandbox": true
}
    

پیام پاسخ سفارش

پس از دریافت درخواست، سرویس وب سفارشی End-to-End شما درخواست را پردازش می کند و یک SubmitOrderResponseMessage که شامل داده های زیر است، ارسال می کند:

  • OrderUpdate : یک شی حاوی وضعیت سفارش و هرگونه اقدام پس از سفارش در دسترس کاربر، مانند تماس با پشتیبانی و مشاهده جزئیات سفارش، که در قسمت finalResponse.richResponse.items[0].structuredResponse.orderUpdate تعریف می کنید. پاسخ

فیلد به روز رسانی سفارش

هنگامی که وب سرویس شما یک SubmitOrderResponseMessage ارسال می کند، حاوی یک قسمت OrderUpdate است که شامل فیلدهای زیر است:

  • actionOrderId : شناسه منحصر به فرد سفارش که برای شناسایی منحصر به فرد سفارش در سیستم شما و مراجعه به آن هنگام ارسال به روز رسانی های بعدی سفارش استفاده می شود.
  • orderState : یک شی OrderState که وضعیت سفارش را نشان می دهد.
  • orderManagementActions : اقدامات پس از سفارش در دسترس کاربر، مانند تماس با پشتیبانی مشتری و مشاهده جزئیات سفارش.
  • totalPrice : قیمت کل سفارش. این اختیاری است. فقط در صورتی ارسال کنید که قیمت کل سفارش پس از ارسال سفارش تغییر کرده باشد.

سفارش می تواند در یکی از حالت های زیر باشد:

  • CREATED : نقطه پایانی شما سفارش را با موفقیت پردازش کرد، اما ارائه دهنده هنوز سفارش را تأیید نکرده است.
  • CONFIRMED : نقطه پایانی شما سفارش را با موفقیت پردازش کرد و ارائه دهنده سفارش را تأیید کرد.
  • REJECTED : مشکلی وجود داشت و نقطه پایانی شما نتوانست سفارش را ایجاد یا تأیید کند، که می‌تواند شامل مشکلاتی در پرداخت باشد.

اگر سفارشی را روی حالت REJECTED می‌کنید، دلیل آن را در قسمت rejectionInfo OrderUpdate مشخص کنید. از مقادیر FoodOrderUpdateExtension.FoodOrderErrors در ارتباط با rejectionInfo از نوع UNKNOWN استفاده کنید و یک توضیح ارائه دهید.

نمونه پاسخ سفارش

نمونه زیر SubmitOrderResponseMessage است:

JSON

{
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "1603357328160",
              "orderState": {
                "state": "CONFIRMED",
                "label": "Pending"
              },
              "updateTime": "2020-10-22T02:02:08-07:00",
              "orderManagementActions": [
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Call customer service",
                    "openUrlAction": {
                      "url": "tel:+61234561000"
                    }
                  }
                },
                {
                  "type": "VIEW_DETAILS",
                  "button": {
                    "title": "View order details",
                    "openUrlAction": {
                      "url": "https://partner.com/view/orderstatus"
                    }
                  }
                }
              ],
              "receipt": {
                "userVisibleOrderId": "BXZ-1603357328"
              }
            }
          }
        }
      ]
    }
  }
}

درخواست ناموفق

اگر درخواست ارسال ناموفق باشد، SubmitOrderResponseMessage باید OrderState را تنظیم کند. state به REJECTED . پاسخ همچنین باید شامل RejectionInfo باشد که حاوی یک شی RejectionType برای توصیف نوع خطا است.

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

JSON

{
  "expectUserResponse": false,
  "finalResponse": {
    "richResponse": {
      "items": [
        {
          "structuredResponse": {
            "orderUpdate": {
              "actionOrderId": "sample_action_order_id",
              "orderState": {
                "state": "REJECTED",
                "label": "Order rejected"
              },
              "updateTime": "2017-05-10T02:30:00.000Z",
              "rejectionInfo": {
                "type": "PAYMENT_DECLINED",
                "reason": "Insufficient funds"
              },
              "orderManagementActions": [
                {
                  "type": "CUSTOMER_SERVICE",
                  "button": {
                    "title": "Contact customer service",
                    "openUrlAction": {
                      "url": "mailto:support@example.com"
                    }
                  }
                },
                {
                  "type": "EMAIL",
                  "button": {
                    "title": "Email restaurant",
                    "openUrlAction": {
                      "url": "mailto:person@example.com"
                    }
                  }
                },
                {
                  "type": "CALL",
                  "button": {
                    "title": "Call restaurant",
                    "openUrlAction": {
                      "url": "tel:+16505554679"
                    }
                  }
                },
                {
                  "type": "VIEW_DETAILS",
                  "button": {
                    "title": "View order",
                    "openUrlAction": {
                      "url": "https://orderview.partner.com?orderid=sample_action_order_id"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
    

ارسال اجرای سفارش

مراحل زیر باید هنگام اجرای API سفارش انجام شود.

اعتبار سنجی

  1. اعتبارسنجی خدمات، سبد خرید و تبلیغات را همانطور که در تنظیم پرداخت انجام شد انجام دهید.
  2. در صورت نیاز RejectionInfo را با یکی از انواع زیر برگردانید:
RejectionInfoType مورد استفاده
UNAVAILABLE_SLOT زمان تکمیل دیگر معتبر نیست.
PROMO_USER_INELIGIBLE از ایمیل موجود در شیء تماس در درخواست برای تأیید صلاحیت تبلیغ برای کاربر استفاده کنید. مثال را در پیاده سازی سفارش ارسال با تبلیغات ببینید.
INELIGIBLE
  • اطلاعات کاربر مانند شماره تلفن یا ایمیل معتبر نیست.
  • موتور ریسک شما تقلب را تشخیص می دهد.
PAYMENT_DECLINED پرداخت قابل پردازش نیست. به عنوان مثال، این می تواند به دلیل کمبود بودجه باشد.
UNKNOWN برای هرگونه خطای اعتبارسنجی دیگر.

OrderState را تنظیم کنید. در صورت وجود خطاهای اعتبار سنجی، state را REJECTED . به صورت اختیاری، می‌توانید با استفاده از FoodOrderUpdateExtension دلیل رد خاصی را ارائه کنید. foodOrderErrors نمونه هایی را در ارسال اعتبار سفارش مشاهده کنید.

پرداخت را پردازش کنید

  1. با اضافه کردن قیمت سبد خرید، کارمزد، تخفیف، مالیات و انعام، totalPrice محاسبه کنید. در صورتی که کاربر بتواند انعام را تغییر دهد، totalPrice باید همان totalPrice باشد که در CheckoutResponseMessage به اضافه تغییر در مبلغ انعام است. برای جزئیات بیشتر به تغییرات قیمت در حین ارسال سفارش مراجعه کنید.
  2. اگر پاسخی را با وضعیت سفارش CREATED یا CONFIRMED برگردانید، سفارش و پرداخت را پردازش کنید.
  3. اطمینان حاصل کنید که یک قالب پاسخ معتبر با استفاده از انواع تولید شده ایجاد شده از طرحواره همانطور که در کتابخانه های تولید مشتری توضیح داده شده است، بازگردانده شده است.
  4. از GoogleProvidedPaymentInstrument استفاده کنید. instrumentToken برای پردازش پرداخت. اگر پرداخت قابل پردازش نیست، RejectionInfo را با نوع PAYMENT_DECLINED بازگردانید. برای جزئیات بیشتر به فرآیند پرداخت ها مراجعه کنید.
  5. بلافاصله پس از پردازش سفارش از طریق ایمیل و یا پیامک به کاربر اطلاع دهید.

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

  1. OrderState را تنظیم کنید. اگر خطایی وجود نداشته باشد، state به CREATED یا CONFIRMED کنید.
  2. OrderState را تنظیم کنید. در صورت وجود خطا، state را REJECTED و شی RejectionInfo را با RejectionInfoType مربوطه اضافه کنید.
  3. OrderUpdate را تنظیم کنید. orderManagementActions .