إنشاء الحجوزات

يرشدك هذا الدليل خلال عملية تطوير مشروع "المهام" الذي يستخدم واجهة برمجة تطبيقات الطلبات لإجراء الحجوزات.

مسار المعاملة

عندما يعالج مشروع Actions الحجوزات، فإنه يستخدم التدفق التالي:

  1. التحقق من متطلبات المعاملة (اختياري) - استخدِم مساعد متطلبات المعاملات في بداية المحادثة للتأكّد من أنّ المستخدم قادر على إجراء معاملة.
  2. إنشاء الطلب - قدِّم للمستخدم إرشادات حول "تجميع عربة التسوق" حيث يبني تفاصيل حجزه.
  3. اقتراح الترتيب - بمجرد اكتمال "سلة التسوق"، اقترح "طلب" الحجز على المستخدم، حتى يمكنه تأكيد صحته. إذا تم تأكيد الحجز، ستتلقى ردًا يتضمن تفاصيل الحجز.
  4. إنهاء الطلب وإرسال إيصال - بعد تأكيد الطلب، يمكنك تحديث نظام الحجز وإرسال إيصال إلى المستخدم.
  5. إرسال إشعارات بالطلب: خلال مدة الحجز، أدخِل تعديلات حالة الحجز على المستخدم من خلال إرسال طلبات PATCH إلى واجهة برمجة التطبيقات Orders API.

القيود وإرشادات المراجعة

تذكّر دائمًا أنّ السياسات الإضافية التي تنطبق على الإجراءات التي تستخدم المعاملات وOrders API. قد تستغرق مراجعة الإجراءات ذات المعاملات مدة تصل إلى ستة أسابيع، لذا يُرجى أخذ هذا الوقت في الاعتبار عند التخطيط لجدول الإصدار الخاص بك. لتيسير عملية المراجعة، احرص على الالتزام بسياسات وإرشادات المعاملات قبل إرسال الإجراء الخاص بك للمراجعة.

يمكنك نشر الإجراءات التي تستخدم Orders API في البلدان التالية فقط:

أستراليا
البرازيل
كندا
إندونيسيا
اليابان
المكسيك
قطر
روسيا
سنغافورة
سويسرا
تايلاند
تركيا
المملكة المتحدة
الولايات المتحدة

إنشاء مشروعك

للحصول على مثال شاملاً لمحادثات المعاملات، يمكنك الاطّلاع على نموذج المعاملات في Node.js.

الإعداد

عند إنشاء الإجراء الخاص بك، يجب تحديد أنّك تريد تنفيذ معاملات في وحدة تحكّم الإجراءات.

لإعداد مشروعك وتنفيذه، قم بما يلي:

  1. أنشئ مشروعًا جديدًا أو استورِد مشروعًا حاليًا.
  2. انتقِل إلى نشر > معلومات الدليل.
  3. ضمن معلومات إضافية > المعاملات > ضَع علامة في المربّع "هل تستخدم إجراءاتك واجهة برمجة تطبيقات المعاملات لتنفيذ معاملات سلع مادية؟".

التحقّق من متطلبات المعاملة (اختياري)

بمجرد أن يذكر المستخدم أنه يريد إجراء حجز، يجب عليك التحقق من قدرته على إجراء حجز. على سبيل المثال، عند استدعاء الإجراء، قد يسألك ""هل تريد حجز مقعد؟" إذا قال المستخدم بـ "نعم"، يجب عليك التأكد من أنه يمكنه المتابعة وإعطائه الفرصة لإصلاح أي إعدادات تمنعه من مواصلة المعاملة. للقيام بذلك، يجب عليك الانتقال إلى المشهد الذي يجري فحص متطلبات المعاملة.

إنشاء مشهد التحقق من متطلبات المعاملات

  1. من علامة التبويب مشاهد، أضِف مشهدًا جديدًا باسم TransactionRequirementsCheck.
  2. ضمن ملء الفتحة، انقر على + لإضافة خانة جديدة.
  3. ضمن اختيار النوع، اختَر actions.type.TransactionRequirementsCheckResult كنوع الخانة.
  4. في حقل اسم الخانة، أدخِل الاسم TransactionRequirementsCheck.
  5. فعِّل مربّع الاختيار تخصيص خانة كتابة قيمة الخانة (مفعّل تلقائيًا).
  6. انقر على حفظ.

تؤدّي عملية التحقّق من متطلبات المعاملة إلى إحدى النتائج التالية:

  • في حال استيفاء المتطلبات، يتم ضبط مَعلمة الجلسة مع ذكر شرط نجاح ويمكنك مواصلة إنشاء ترتيب المستخدِم.
  • إذا تعذّر استيفاء شرط واحد أو أكثر من المتطلبات، يتم ضبط معلمة الجلسة بشرط الفشل. في هذه الحالة، يجب عليك تركيز المحادثة بعيدًا عن تجربة المعاملات، أو إنهاء المحادثة.
    • إذا كان بإمكان المستخدم إصلاح أي أخطاء نتج عنها حالة الفشل، سيُطلب منه حل هذه المشاكل على جهازه. إذا كانت المحادثة تتم على منصة صوتية فقط، سيبدأ تسليم المحادثة إلى هاتف المستخدم.

التعامل مع نتيجة التحقّق من متطلبات المعاملات

  1. من علامة التبويب مشاهد، اختَر المشهد TransactionRequirementsCheck الذي تم إنشاؤه حديثًا.
  2. ضمن الشرط، انقر على + لإضافة شرط جديد.
  3. في حقل النص، أدخل بناء جملة الشرط التالي للتحقق من شرط النجاح:

    scene.slots.status == "FINAL" && session.params.TransactionRequirementsCheck.resultType == "CAN_TRANSACT"
    
  4. مرِّر مؤشر الماوس فوق الشرط الذي أضفته للتو وانقر على السهم المتّجه للأعلى لوضعه قبل if scene.slots.status == "FINAL".

  5. فعِّل خيار إرسال الطلبات وقدِّم طلبًا بسيطًا لإعلام المستخدم بأنّه مستعد لإجراء معاملة:

    candidates:
      - first_simple:
          variants:
            - speech: >-
                Looks like you're good to go!.
    
  6. ضمن النقل، اختَر مشهدًا آخر للسماح للمستخدم بمتابعة المحادثة ومتابعة إجراء المعاملة.

  7. اختَر الشرط else if scene.slots.status == "FINAL".

  8. فعِّل ميزة إرسال الطلبات وقدِّم طلبًا بسيطًا لإعلام المستخدم بأنّه لا يمكنه إجراء معاملة:

    candidates:
      - first_simple:
          variants:
            - speech: Transaction requirements check failed.
    
  9. ضمن النقل، اختَر إنهاء المحادثة لإنهاء المحادثة إذا تعذّر على المستخدم إجراء المعاملات.

بناء الطلب

بمجرد حصولك على معلومات المستخدم التي تحتاجها، صمم تجربة "تجميع سلات التسوق" التي توجه المستخدم لإنشاء حجزه. سيكون لكل إجراء مسار مختلف قليلاً لتجميع عربة التسوق حسبما يتناسب مع خدمتهم.

في التجربة الأساسية لتجميع عربة التسوق، يختار المستخدم خيارات من قائمة لإضافتها إلى حجزه، على الرغم من أنه يمكنك تصميم المحادثة لتبسيط تجربة المستخدم. على سبيل المثال، يمكنك إنشاء تجربة تجميع عربة التسوق التي تمكّن المستخدم من جدولة حجز شهري بسؤال بسيط بنعم أو لا. ويمكنك أيضًا أن تعرض للمستخدم لوحة عرض دوّارة أو بطاقة قائمة بالحجوزات "المُقترحة".

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

إنشاء طلب

خلال محادثتك، اجمع تفاصيل حجز المستخدم ثم أنشِئ عنصر Order.

على الأقل، يجب أن يحتوي Order على ما يلي:

  • buyerInfo: معلومات عن المستخدِم الذي يُجري عملية الشراء
  • transactionMerchant: معلومات عن التاجر الذي سهّل الطلب
  • contents - المحتوى الفعلي للطلب المدرَج باسم lineItems.

يمكنك الرجوع إلى مستندات الرد Order لإنشاء سلة التسوّق. لاحظ أنك قد تحتاج إلى تضمين حقول مختلفة بناءً على الحجز.

يوضح الرمز النموذجي أدناه طلب حجز كامل، بما في ذلك الحقول الاختيارية:

const order = {
   createTime: '2019-09-24T18:00:00.877Z',
   lastUpdateTime: '2019-09-24T18:00:00.877Z',
   merchantOrderId: orderId, // A unique ID String for the order
   userVisibleOrderId: orderId,
   transactionMerchant: {
     id: 'http://www.example.com',
     name: 'Example Merchant',
   },
   contents: {
     lineItems: [
       {
         id: 'LINE_ITEM_ID',
         name: 'Dinner reservation',
         description: 'A world of flavors all in one destination.',
         reservation: {
           status: 'PENDING',
           userVisibleStatusLabel: 'Reservation is pending.',
           type: 'RESTAURANT',
           reservationTime: {
             timeIso8601: '2020-01-16T01:30:15.01Z',
           },
           userAcceptableTimeRange: {
             timeIso8601: '2020-01-15/2020-01-17',
           },
           partySize: 6,
           staffFacilitators: [
             {
               name: 'John Smith',
             },
           ],
           location: {
             zipCode: '94086',
             city: 'Sunnyvale',
             postalAddress: {
               regionCode: 'US',
               postalCode: '94086',
               administrativeArea: 'CA',
               locality: 'Sunnyvale',
               addressLines: [
                 '222, Some other Street',
               ],
             },
           },
         },
       },
     ],
   },
   buyerInfo: {
     email: 'janedoe@gmail.com',
     firstName: 'Jane',
     lastName: 'Doe',
     displayName: 'Jane Doe',
   },
   followUpActions: [
     {
       type: 'VIEW_DETAILS',
       title: 'View details',
       openUrlAction: {
         url: 'http://example.com',
       },
     },
     {
       type: 'CALL',
       title: 'Call us',
       openUrlAction: {
         url: 'tel:+16501112222',
       },
     },
     {
       type: 'EMAIL',
       title: 'Email us',
       openUrlAction: {
         url: 'mailto:person@example.com',
       },
     },
   ],
   termsOfServiceUrl: 'http://www.example.com'
 };

إنشاء خيارات الطلب والعرض

const orderOptions = {
      'requestDeliveryAddress': false,
    };

const presentationOptions = {
      'actionDisplayName': 'RESERVE'
    };

حفظ بيانات الطلبات في مَعلمة الجلسة

من عملية التنفيذ، احفظ بيانات الطلب في مَعلمة جلسة. سيتم استخدام كائن الترتيب عبر المشاهد لنفس الجلسة.

conv.session.params.order = {
    '@type': 'type.googleapis.com/google.actions.transactions.v3.TransactionDecisionValueSpec',
    order: order,
    orderOptions: orderOptions,
    presentationOptions: presentationOptions
};

اقتراح الأمر

بمجرد إنشاء طلب الحجز، يجب عليك تقديمه للمستخدم للتأكيد أو الرفض. للقيام بذلك، يجب عليك الانتقال إلى المشهد الذي ينفذ قرار المعاملة.

إنشاء مشهد قرار المعاملة

  1. من علامة التبويب مشاهد، أضِف مشهدًا جديدًا باسم TransactionDecision.
  2. ضمن ملء الفتحة، انقر على + لإضافة خانة جديدة.
  3. ضمن اختيار النوع، اختَر actions.type.TransactionDecisionValue كنوع الخانة.
  4. في حقل اسم الخانة، أدخِل الاسم TransactionDecision.
  5. فعِّل مربّع الاختيار تخصيص خانة كتابة قيمة الخانة (مفعّل تلقائيًا).
  6. ضمن ضبط الخانة، اختر استخدام مَعلمة الجلسة من القائمة المنسدلة.
  7. ضمن ضبط الخانة، أدخِل اسم معلمة الجلسة المستخدَمة لتخزين الطلب في حقل النص (أي $session.params.order).
  8. انقر على حفظ.

في محاولة لملء فجوة TransactionDecisionValue، يبدأ "مساعد Google" تجربة مضمّنة يتم فيها عرض رمز Order الذي مررت به مباشرةً على "بطاقة معاينة سلة التسوّق". يمكن للمستخدم قول "جدولة الحجز" أو رفض المعاملة أو طلب تغيير تفاصيل الحجز.

ويمكن للمستخدم أيضًا طلب إجراء تغييرات على الطلب في هذه المرحلة. في هذه الحالة، يجب عليك التأكد من أن عملية توصيل الطلبات يمكنها التعامل مع طلبات تغيير الطلبات بعد إنهاء تجربة تجميع عربة التسوق.

معالجة نتيجة قرار المعاملة

عندما يتم ملء خانة TransactionDecisionValue، سيتم تخزين إجابة المستخدم على قرار المعاملة في مَعلمة جلسة. تحتوي هذه القيمة على ما يلي:

  • ORDER_ACCEPTED,
  • ORDER_REJECTED,
  • CART_CHANGE_REQUESTED
  • USER_CANNOT_TRANSACT.

لمعالجة نتيجة قرار المعاملة:

  1. من علامة التبويب مشاهد، اختَر مشهد TransactionDecision الذي تم إنشاؤه حديثًا.
  2. ضمن الشرط، انقر على + لإضافة شرط جديد.
  3. في حقل النص، أدخل بناء جملة الشرط التالي للتحقق من شرط النجاح:

    scene.slots.status == "FINAL" && session.params.TransactionDecision.transactionDecision == "ORDER_ACCEPTED"
    
  4. مرِّر مؤشر الماوس فوق الشرط الذي أضفته للتو وانقر على السهم المتّجه للأعلى لوضعه قبل if scene.slots.status == "FINAL".

  5. يمكنك تفعيل إرسال المطالبات وتقديم رسالة مطالبة بسيطة تُعلِم المستخدم باكتمال عملية الحجز:

    candidates:
      - first_simple:
          variants:
            - speech: >-
                Transaction completed! Your reservation
                $session.params.TransactionDecision.order.merchantOrderId is all
                set!
    
  6. ضمن النقل، اختَر إنهاء المحادثة لإنهاء المحادثة.

  7. ضمن الشرط، انقر على + لإضافة شرط جديد.

  8. في حقل النص، أدخل بناء جملة الشرط التالي للتحقق من شروط الفشل:

      scene.slots.status == "FINAL" && session.params.TransactionDecision.transactionDecision == "ORDER_REJECTED"
    
  9. مرِّر مؤشر الماوس فوق الشرط الذي أضفته للتو وانقر على السهم المتّجه للأعلى لوضعه قبل if scene.slots.status == "FINAL".

  10. يمكنك تفعيل إرسال المطالبات وتقديم رسالة مطالبة بسيطة تتيح للمستخدم معرفة أنّ الطلب قد تم رفضه:

    candidates:
      - first_simple:
          variants:
            - speech: Looks like you don't want to set up a reservation. Goodbye.
    
  11. ضمن النقل، اختَر إنهاء المحادثة لإنهاء المحادثة.

  12. اختَر الشرط else if scene.slots.status == "FINAL".

  13. فعِّل إرسال الطلبات وقدِّم رسالة مطالبة بسيطة تخبر المستخدم بأنّه غير قادر على إجراء معاملة:

    candidates:
      - first_simple:
          variants:
            - speech: >-
                Transaction failed with status
                $session.params.TransactionDecision.transactionDecision
    
  14. ضمن النقل، اختَر إنهاء المحادثة لإنهاء المحادثة إذا تعذّر على المستخدم إجراء المعاملات.

إنهاء الحجز وإرسال إيصال

عندما تعرض خانة TransactionDecisionValue نتيجة ORDER_ACCEPTED، يجب إجراء أي معالجة مطلوبة على الفور لجدولة عملية الحجز (مثل الاحتفاظ بها في قاعدة البيانات الخاصة بك).

يمكنك إرسال رد بسيط لمواصلة المحادثة. يتلقى المستخدم "بطاقة إيصال مصغَّرة" مع ردك.

لإرسال تعديل أولي للطلب:

  1. من علامة التبويب مشاهد، اختَر المشهد TransactionDecision.
  2. ضمن الشرط، اختَر الشرط الذي يتحقّق من نتيجة النجاح، ORDER_ACCEPTED:

    scene.slots.status == "FINAL" && session.params.TransactionDecision.transactionDecision == "ORDER_ACCEPTED"
    
  3. بالنسبة إلى هذا الشرط، فعِّل الاتصال للردّ التلقائي على الويب وأدخِل اسم معالج الغرض، مثل update_order.

  4. في رمز الرد التلقائي على الويب، أضِف معالِج أهداف لإرسال تعديل أولي للطلب:

    app.handle('update_order', conv => {
      const currentTime = new Date().toISOString();
      let order = conv.session.params.TransactionDecision.order;
      conv.add(new OrderUpdate({
        'updateMask': {
          'paths': [
            'reservation.status',
            'reservation.user_visible_status_label',
            'reservation.confirmation_code'
          ]
        },
        'order': {
          'merchantOrderId': order.merchantOrderId,
          'lastUpdateTime': currentTime,
          'reservation': {
            'status': 'CONFIRMED',
            'userVisibleStatusLabel': 'Reservation confirmed',
            'confirmationCode': '123ABCDEFGXYZ',
          },
        },
        'reason': 'Reason string'
      }));
    });
    

إرسال آخر أخبار الطلب

وتتغيّر حالة الحجز على مدار عمرها. أرسِل تحديثات طلبات حجز المستخدم من خلال طلبات HTTP PATCH إلى Orders API، والتي تتضمّن حالة الطلب وتفاصيله.

إعداد طلبات غير متزامنة لـ Orders API

يتم السماح بطلبات تعديل الطلبات إلى واجهة برمجة التطبيقات Orders API من خلال رمز دخول. للحصول على موافقة لتحديث طلب بخصوص واجهة برمجة التطبيقات Orders API، عليك تنزيل مفتاح حساب خدمة بتنسيق JSON مرتبط بمشروعك على "وحدة تحكّم المهام"، ثم استبدال مفتاح حساب الخدمة برمز حامل مميّز يمكن تمريره إلى رأس Authorization لطلب HTTP.

لاسترداد مفتاح حساب الخدمة، عليك اتّباع الخطوات التالية:

  1. في Google Cloud Console، انتقِل إلى القائمة أعضاء > واجهات برمجة التطبيقات والخدمات > بيانات الاعتماد > إنشاء بيانات اعتماد > مفتاح حساب الخدمة.
  2. ضمن حساب الخدمة، اختَر حساب خدمة جديد.
  3. اضبط حساب الخدمة على service-account.
  4. اضبط الدور على المشروع > المالك.
  5. اضبط نوع المفتاح على JSON.
  6. اختَر إنشاء.
  7. سيتم تنزيل مفتاح حساب خدمة JSON خاص على جهازك المحلي.

في رمز تعديلات الطلب، استبدِل مفتاح الخدمة برمز حامل مميز باستخدام مكتبة عملاء Google APIs ونطاق "https://www.googleapis.com/auth/actions.order.developer". يمكنك العثور على خطوات التثبيت وأمثلة عليه في مكتبة عميل واجهة برمجة التطبيقات على صفحة GitHub.

يمكنك الرجوع إلى order-update.js في نموذج Node.js للحصول على مثال لتبادل المفاتيح.

إرسال آخر أخبار الطلب

بعد استبدال مفتاح حساب الخدمة برمز مميز لحامل OAuth، أرسِل آخر المعلومات حول الطلب كطلبات تصحيح معتمدة إلى واجهة برمجة التطبيقات Orders API.

عنوان URL لواجهة برمجة تطبيقات الطلبات: PATCH https://actions.googleapis.com/v3/orders/${orderId}

قدِّم العناوين التالية في طلبك:

  • "Authorization: Bearer token" باستخدام رمز حامل OAuth المميز الذي استبدلت مفتاح حساب الخدمة به.
  • "Content-Type: application/json".

يجب أن يتخذ طلب PATCH نص JSON بالتنسيق التالي:

{ "orderUpdate": OrderUpdate }

يتألف الكائن OrderUpdate من حقول المستوى الأعلى التالية:

  • updateMask: حقول الترتيب الذي تُعدِّله لتعديل حالة الحجز، اضبط القيمة على reservation.status, reservation.userVisibleStatusLabel.
  • order - محتوى التحديث وإذا كنت تحدّث محتوى الحجز، اضبط القيمة على عنصر Order المعدّل. إذا كنت تحدّث حالة الحجز فقط (على سبيل المثال، من "PENDING" إلى "FULFILLED")، يحتوي العنصر على الحقول التالية:

    • merchantOrderId - رقم التعريف نفسه الذي حدّدته في عنصر Order
    • lastUpdateTime - الطابع الزمني لهذا التعديل
    • purchase - كائن يحتوي على ما يلي:
      • status - حالة الطلب على أنّه ReservationStatus، مثل "CONFIRMED" أو "CANCELLED".
      • userVisibleStatusLabel - تصنيف موجّه للمستخدمين يوفّر تفاصيل عن حالة الطلب، مثل "تمّ تأكيد الحجز"
  • userNotification يمكن عرضه على جهاز المستخدم عند إرسال هذا التحديث. ويُرجى العِلم بأنّ تضمين هذا الكائن لا يضمن ظهور إشعار على جهاز المستخدم.

يعرض الرمز النموذجي التالي مثالاً OrderUpdate الذي يعدّل حالة طلب الحجز إلى FULFILLED:

// Import the 'googleapis' module for authorizing the request.
const {google} = require('googleapis');
// Import the 'request-promise' module for sending an HTTP POST request.
const request = require('request-promise');
// Import the OrderUpdate class from the client library.
const {OrderUpdate} = require('@assistant/conversation');

// Import the service account key used to authorize the request.
// Replacing the string path with a path to your service account key.
// i.e. const serviceAccountKey = require('./service-account.json')

// Create a new JWT client for the Actions API using credentials
// from the service account key.
let jwtClient = new google.auth.JWT(
   serviceAccountKey.client_email,
   null,
   serviceAccountKey.private_key,
   ['https://www.googleapis.com/auth/actions.order.developer'],
   null,
);

// Authorize the client
let tokens = await jwtClient.authorize();

// Declare the ID of the order to update.
const orderId = '<UNIQUE_MERCHANT_ORDER_ID>';

// Declare order update
const orderUpdate = new OrderUpdate({
   updateMask: {
     paths: [
       'contents.lineItems.reservation.status',
       'contents.lineItems.reservation.userVisibleStatusLabel'
     ]
   },
   order: {
     merchantOrderId: orderId, // Specify the ID of the order to update
     lastUpdateTime: new Date().toISOString(),
     contents: {
       lineItems: [
         {
           reservation: {
             status: 'FULFILLED',
             userVisibleStatusLabel: 'Reservation fulfilled',
           },
         }
       ]
     },
   },
   reason: 'Reservation status was updated to fulfilled.',
});

// Set up the PATCH request header and body,
// including the authorized token and order update.
let options = {
 method: 'PATCH',
 uri: `https://actions.googleapis.com/v3/orders/${orderId}`,
 auth: {
   bearer: tokens.access_token,
 },
 body: {
   header: {
     isInSandbox: true,
   },
   orderUpdate,
 },
 json: true,
};

// Send the PATCH request to the Orders API.
try {
 await request(options);
} catch (e) {
 console.log(`Error: ${e}`);
}

ضبط حالة الحجز

يجب أن يوضِّح ReservationStatus في تعديل الطلب الحالة الحالية للطلب. في حقل order.ReservationStatus الخاص بالتحديث، استخدِم إحدى القيم التالية:

  • PENDING - تم "إنشاء" الحجز من خلال الإجراء الخاص بك ولكنه يتطلب معالجة إضافية من خلال الخادم.
  • CONFIRMED - يتم تأكيد الحجز في الواجهة الخلفية للجدول الزمني.
  • CANCELLED - ألغى المستخدم حجزه.
  • FULFILLED - نفذت الخدمة حجز المستخدم.
  • CHANGE_REQUESTED - طلب المستخدم إجراء تغيير على الحجز، وجارٍ معالجة التغيير.
  • REJECTED - إذا لم تتمكّن من معالجة الحجز أو تأكيده بأي طريقة أخرى

أرسِل إشعارات بالطلب لكل حالة ذات صلة بحجزك. على سبيل المثال، إذا كان الحجز يتطلب معالجة يدوية لتأكيد الحجز بعد طلبه، أرسِل تحديثًا للطلب في PENDING إلى حين الانتهاء من المعالجة الإضافية. لا يتطلب كل حجز كل قيمة للحالة.

اختبار مشروعك

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

  1. في وحدة تحكّم الإجراءات، انقر على اختبار في شريط التنقّل.
  2. انقر على الإعدادات.
  3. فعِّل خيار وضع الحماية للتطوير.

وبالنسبة إلى المعاملات المادية، يمكنك أيضًا ضبط الحقل isInSandbox على true في النموذج. يعادل هذا الإجراء تفعيل إعداد وضع الحماية في وحدة تحكُّم المهام. للاطّلاع على مقتطف رمز يستخدم isInSandbox، راجِع القسم إرسال تعديلات الطلب.

تحديد المشاكل وحلّها

إذا واجهت أي مشاكل أثناء الاختبار، يمكنك الاطّلاع على خطوات تحديد المشاكل وحلّها للمعاملات.