بعد تسجيل الدفع الاتصال، يراجع المستخدم سلة التسوق المحدثة مع الضرائب ورسوم التسليم والخصومات والرسوم الأخرى التي ترجعها. يؤكد المستخدم ويرسل الطلب ترسل Google لنقطة نهاية عملية التنفيذ طلب JSON يحتوي على معلومات عن الطلب. يجب أن تتلقّى خدمة الويب هذا الطلب أو معالجته والردّ على Google مع توضيح حالة الطلب.
يصف هذا القسم تنسيق رسالة طلب الطلب الذي أرسلته Google.
يُسمى SubmitOrderRequestMessage
، ويكون تنسيق رسالة الرد
التي يجب عليك تقديمها، تسمى
SubmitOrderResponseMessage
لمزيد من المعلومات حول مراحل توصيل الطلبات، يُرجى الاطّلاع على
نظرة عامة على توصيل الطلبات:
تنفيذ الطلب
يجب أن تكون خدمة الويب الشاملة للطلب التي تنشئها للعمل مع الطلب الشامل
تضمين نقطة نهاية لعنوان URL لتلقّي رسائل الطلبات من Google. للطلب
جارٍ المعالجة، ستتلقى خدمة الويب SubmitOrderRequestMessage
بتنسيق JSON
كطلب POST من Google. يحتوي هذا الطلب على طلب عميل،
بما في ذلك الضرائب والرسوم ومعلومات الدفع عند استلام طلب إرسال
يجب أن تقوم خدمة الويب الخاصة بك بما يلي:
- التحقّق من أهلية المعاملات، مثل إثبات ملكية البطاقة أو رصد عمليات الاحتيال
- إنشاء طلب في النظام الخاص بك.
- ما عليك سوى تفويض طريقة الدفع والاتصال بواجهة برمجة تطبيقات تحصيل الرسوم الخاصة بجهة معالجة عمليات الدفع، إذا كان ذلك منطبقًا.
- ويعرض الحالة المناسبة لطلب الشراء:
CREATED
CONFIRMED
أوREJECTED
.
بعد معالجة الطلب، يجب أن يصلك ردّ من رمز التوصيل.
في شكل رسالة SubmitOrderResponseMessage
JSON مُرسَلة إلى Google.
لمزيد من المعلومات حول خدمة الويب الخاصة بالتنفيذ الشامل للطلب متطلبات التنفيذ، يُرجى الرجوع إلى نظرة عامة على التنفيذ.
رسالة طلب الطلب
عندما يختار العميل تقديم طلب أثناء تدفق الطلب الشامل،
ترسل Google طلبًا إلى خدمة الويب باستخدام رسالة JSON تسمى
SubmitOrderRequestMessage
الذي يحتوي على البيانات التالية:
- الهدف: الحقل
inputs[0].intent
في كل نص طلب إرسال يحتوي على قيمة السلسلةactions.intent.TRANSACTION_DECISION
. - الترتيب: يشير إلى الحقل
inputs[0].arguments[0].transactionDecisionValue
في يحتوي إرسال طلب الطلب على عنصرOrder
يمثل تقديم طلب العميل، بالإضافة إلى تفاصيل الدفع. - علامة وضع الحماية: يشير الحقل
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" } } } ] } } } ] } } }
إرسال تنفيذ الطلب
يجب اتّباع الخطوات التالية عند تنفيذ واجهة برمجة تطبيقات إرسال الطلب.
التحقّق من الصحة
- إجراء عمليات التحقق من الخدمة وسلة التسوّق والعروض الترويجية كما تم في الإعداد الدفع
- اعرض RejectionInfo بأحد الأنواع التالية إذا مطلوبة:
RejectionInfoType | حالة الاستخدام |
---|---|
UNAVAILABLE_SLOT |
لم يعُد وقت توصيل الطلب صالحًا. |
PROMO_USER_INELIGIBLE |
استخدِم "البريد الإلكتروني" في عنصر Contact (جهة الاتصال) في الطلب للتحقّق من أهلية المستخدم للعرض الترويجي. يمكنك الاطّلاع على المثال في مقالة تنفيذ الطلب مع العروض الترويجية. |
INELIGIBLE |
|
PAYMENT_DECLINED |
لا يمكن معالجة الدفعة. على سبيل المثال، قد يرجع ذلك إلى عدم توفّر أموال كافية. |
UNKNOWN |
لأي أخطاء أخرى في عملية التحقق. |
اضبط OrderState.state
على REJECTED
في حال وجود تحقق
الأخطاء التي حدثت. يمكنك اختياريًا تقديم سبب محدّد للرفض.
باستخدام FoodOrderUpdateExtension.foodOrderErrors
. اطّلع على أمثلة في
أرسِل رسالة التحقّق من صحة الطلب.
معالجة الدفعة
- يمكنك احتساب قيمة
totalPrice
من خلال إضافة سعر سلة التسوّق والرسوم والخصم والضرائب والإكرامية. يجب أن تكون قيمةtotalPrice
هي نفسها قيمةtotalPrice
التي تم إرجاعها. في CheckoutResponseMessage بالإضافة إلى التغيير في مبلغ الإكرامية إذا كان بإمكان المستخدم تعديل الإكرامية. عرض السعر التغييرات أثناء إرسال الطلب للاطّلاع على مزيد من التفاصيل. - معالجة الطلب والدفع في حال إرجاع ردّ يتضمّن حالة الطلب
من
CREATED
أوCONFIRMED
. - تأكَّد من عرض تنسيق رد صالح باستخدام الأنواع التي تم إنشاؤها. من المخطط كما هو موضح في إنشاء مكتبات البرامج
- يمكنك استخدام
GoogleProvidedPaymentInstrument.
instrumentToken
لمعالجة الدفعة. عرض RejectionInfo مع النوعPAYMENT_DECLINED
في حال تعذُّر معالجة الدفعة. عرض المعالجة الدفعات للاطّلاع على مزيد من التفاصيل. - إبلاغ المستخدم فور معالجة الطلب عن طريق البريد الإلكتروني رسالة قصيرة
عرض الردّ
- اضبط OrderState.
state
علىCREATED
أوCONFIRMED
إذا ما مِن أخطاء. - اضبط OrderState.
state
علىREJECTED
في حال حدوث أخطاء. التي تم رصدها وتضمين العنصر RejectionInfo RejectionInfoType مطابق. - اضبط OrderUpdate.
orderManagementActions
.