إعداد خيار "إرسال الطلب"

بعد تسجيل الدفع الاتصال، يراجع المستخدم سلة التسوق المحدثة مع الضرائب ورسوم التسليم والخصومات والرسوم الأخرى التي ترجعها. يؤكد المستخدم ويرسل الطلب ترسل Google لنقطة نهاية عملية التنفيذ طلب JSON يحتوي على معلومات عن الطلب. يجب أن تتلقّى خدمة الويب هذا الطلب أو معالجته والردّ على Google مع توضيح حالة الطلب.

يصف هذا القسم تنسيق رسالة طلب الطلب الذي أرسلته Google. يُسمى SubmitOrderRequestMessage، ويكون تنسيق رسالة الرد التي يجب عليك تقديمها، تسمى SubmitOrderResponseMessage لمزيد من المعلومات حول مراحل توصيل الطلبات، يُرجى الاطّلاع على نظرة عامة على توصيل الطلبات:

تنفيذ الطلب

يجب أن تكون خدمة الويب الشاملة للطلب التي تنشئها للعمل مع الطلب الشامل تضمين نقطة نهاية لعنوان URL لتلقّي رسائل الطلبات من Google. للطلب جارٍ المعالجة، ستتلقى خدمة الويب SubmitOrderRequestMessage بتنسيق JSON كطلب POST من Google. يحتوي هذا الطلب على طلب عميل، بما في ذلك الضرائب والرسوم ومعلومات الدفع عند استلام طلب إرسال يجب أن تقوم خدمة الويب الخاصة بك بما يلي:

  • التحقّق من أهلية المعاملات، مثل إثبات ملكية البطاقة أو رصد عمليات الاحتيال
  • إنشاء طلب في النظام الخاص بك.
  • ما عليك سوى تفويض طريقة الدفع والاتصال بواجهة برمجة تطبيقات تحصيل الرسوم الخاصة بجهة معالجة عمليات الدفع، إذا كان ذلك منطبقًا.
  • ويعرض الحالة المناسبة لطلب الشراء: CREATED CONFIRMED أو REJECTED.

بعد معالجة الطلب، يجب أن يصلك ردّ من رمز التوصيل. في شكل رسالة SubmitOrderResponseMessage JSON مُرسَلة إلى Google.

لمزيد من المعلومات حول خدمة الويب الخاصة بالتنفيذ الشامل للطلب متطلبات التنفيذ، يُرجى الرجوع إلى نظرة عامة على التنفيذ.

رسالة طلب الطلب

عندما يختار العميل تقديم طلب أثناء تدفق الطلب الشامل، ترسل Google طلبًا إلى خدمة الويب باستخدام رسالة JSON تسمى SubmitOrderRequestMessage الذي يحتوي على البيانات التالية:

  1. الهدف: الحقل inputs[0].intent في كل نص طلب إرسال يحتوي على قيمة السلسلة actions.intent.TRANSACTION_DECISION.
  2. الترتيب: يشير إلى الحقل inputs[0].arguments[0].transactionDecisionValue في يحتوي إرسال طلب الطلب على عنصر Order يمثل تقديم طلب العميل، بالإضافة إلى تفاصيل الدفع.
  3. علامة وضع الحماية: يشير الحقل 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
}
    

رسالة الردّ على الطلب

بعد استلام الطلب، تعالج خدمة الويب الشاملة للطلب وإرسال 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"
                    }
                  }
                }
              ]
            }
          }
        }
      ]
    }
  }
}
    

إرسال تنفيذ الطلب

يجب اتّباع الخطوات التالية عند تنفيذ واجهة برمجة تطبيقات إرسال الطلب.

التحقّق من الصحة

  1. إجراء عمليات التحقق من الخدمة وسلة التسوّق والعروض الترويجية كما تم في الإعداد الدفع
  2. اعرض RejectionInfo بأحد الأنواع التالية إذا مطلوبة:
RejectionInfoType حالة الاستخدام
UNAVAILABLE_SLOT لم يعُد وقت توصيل الطلب صالحًا.
PROMO_USER_INELIGIBLE استخدِم "البريد الإلكتروني" في عنصر Contact (جهة الاتصال) في الطلب للتحقّق من أهلية المستخدم للعرض الترويجي. يمكنك الاطّلاع على المثال في مقالة تنفيذ الطلب مع العروض الترويجية.
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.