للمطورين.

ابنِ روبوتات محادثة WhatsApp مخصصة باستخدام حزمة QSoft.CxPerium .NET SDK — من التثبيت والحوارات إلى معالجة اللغة الطبيعية والمراسلة وWhatsApp Flows ووحدات المنصة.

01. التثبيت والتهيئة

أعدّ روبوت محادثة قائمًا على CxPerium من الصفر: أنشئ حسابك، ونزّل المشروع النموذجي، وشغّله خلف وكيل عكسي، ثم اربطه بالمنصة.

  1. أنشئ حسابًا أو سجّل الدخول

    قم بزيارة app.cxperium.com. سجّل باسمك الكامل وبريدك الإلكتروني وكلمة المرور ثم أكّد رسالة التفعيل — أو استخدم Sign In (تسجيل الدخول) إذا كان لديك حساب بالفعل.

  2. نزّل المشروع النموذجي من GitHub

    انتقل إلى مستودع CxPerium.BotTemplate وراجع وصف المشروع. انقر على زر Code، ثم إما أن تنزّل ملف ZIP أو تستنسخ المستودع عبر HTTPS.

  3. أضف حزمة NuGet

    أضف حزمة NuGet الخاصة بـ CxPerium QSoft.CxPerium إلى المشروع.

  4. راجع بنية المشروع والإعدادات الافتراضية

    يعمل المشروع افتراضيًا على http://localhost:3978/. عدّل launchSettings.json إذا احتجت إلى تغيير المنفذ.

  5. أعدّ وكيلًا عكسيًا

    يلزم وكيل عكسي (ngrok) لتوجيه رسائل WhatsApp إلى جهازك المحلي. دوّن عنوان URL العام المُنشأ (مثل https://xxxxx.ngrok.io/).

  6. أضف عنوان ngrok وإعدادات المطور إلى المشروع

    حدد موقع appsettings.json وحدّث حقلي BotUrl وHookUrl. ثم انتقل إلى Settings > API Integration (الإعدادات ← تكامل API) في CxPerium، وانقر على Regenerate (إعادة الإنشاء) لإنشاء مفتاح API، وأضفه إلى الملف.

  7. اختبر الإعداد

    أرسل "Hello" إلى رقم WhatsApp التجريبي +90 850 309 45 52 — يرد الروبوت بـ "Hello World". يمكنك أيضًا استخدام الرابط المباشر https://web.whatsapp.com/send/?phone=908503094552&text=hi. روبوت المحادثة القائم على CxPerium يعمل الآن بنجاح.

terminal
# استنساخ المشروع النموذجي
git clone https://github.com/cxperium/CxPerium.BotTemplate.git

# توجيه رسائل WhatsApp إلى جهازك المحلي
ngrok http 3978 --host-header="localhost:3978"
appsettings.json
{
  "BotUrl": "https://xxxxx.ngrok.io",
  "HookUrl": "https://hook.example.com",
  "ApiKey": "your_generated_api_key_here"
}

02. قالب مشروع المساعد

يأتي مشروع المساعد النموذجي ببنية واضحة: دليل Channels، ودليل Dialogs، وملف التهيئة appsettings.json، ونقطة الدخول Program.cs.

project structure
CxPerium.BotTemplate/
├── Channels/
│   ├── CxPerium.cs
│   └── Whatsapp.cs
├── Dialogs/
│   └── MainDialog.cs
├── appsettings.json
└── Program.cs

مجلد Channels

تلتقط فئة CxPerium.cs الأحداث من منصة CxPerium:

  • OnSurveyCompleted — يُطلق عند انتهاء استطلاع.
  • OnClosingLiveChat — يُطلق عندما يغلق موظف محادثة مباشرة.
  • OnSessionTimeOut — يُطلق بعد عدم ورود رسائل من المستخدم طوال المدة المهيأة (5 دقائق افتراضيًا).

تعالج فئة Whatsapp.cs الرسائل والأحداث الواردة:

  • OnDialogFlowMessage وOnChatGPTMessage — أحداث الرسائل الموجهة عبر معالجة اللغة الطبيعية.
  • OnFileReceived, OnOrderReceived, OnLocationReceived — أحداث الوسائط والطلبات والموقع.
  • GetContactByPhone — يسترجع معلومات المرسل.
  • OnUnderstandMessage — الرد الاحتياطي الافتراضي.

ينبغي عدم تعديل هذا الملف إلا عند الضرورة؛ ويمكن تجاوز (override) أساليبه للمتطلبات الخاصة.

مجلد Dialogs

يحتوي مجلد Dialogs على ملف MainDialog.cs. أنشئ جميع حواراتك هنا لتنظيم أفضل للشيفرة وقابلية للتوسع.

التهيئة

يخزّن ملف appsettings.json مفاتيح API ومعلومات webhook التي حصلت عليها من CxPerium.

03. إنشاء حوار

تدير الحوارات تدفق التفاعلات بين المستخدم والروبوت وتشكّل أساس تجربة المستخدم. يفصّل هذا القسم خطوات إنشاء حوار لروبوت محادثة باستخدام حزمة QSoft.CxPerium .NET SDK.

ما الحوار؟

الحوار بنية منطقية تحدد كيفية استجابة روبوت المحادثة لاستفسارات المستخدم أو معالجته لسير عمل. في حزمة QSoft.CxPerium SDK، تُبرمج الحوارات ضمن إطار منطقي محدد لتحقيق النتائج المرجوة.

مكونات الحوار الأساسية

  • Contact — يمثّل المستخدم المرسل للرسالة، ويقابل إدخالًا في قائمة جهات الاتصال في CxPerium.
  • Activity — كائن يحدد نوع الرسالة المستلمة وقيمتها.
  • Conversation — كائن يخزّن البيانات المؤقتة طوال المحادثة.

مثال حوار: «من أنت؟»

سننشئ حوارًا يرد فيه الروبوت بعبارة "I am a special assistant" عندما يرسل المستخدم الرسالة "who are you". أنشئ مجلدًا باسم Dialogs في مشروعك وأضف ملف فئة C#‎ جديدًا باسم WhoAreYouDialog. يجب أن ترث الفئة من BaseWhatsAppDialog، وتنفّذ الواجهة IWhatsAppDialog، وتنفّذ الأسلوب RunDialog الذي تتطلبه.

WhoAreYouDialog.cs
using QSoft.CxPerium.Dialogs.WhatsApp;

namespace QSoft.CxPerium.Assistant.Dialogs
{
    public class WhoAreYouDialog : BaseWhatsAppDialog, IWhatsAppDialog
    {
        public void RunDialog()
        {
            this.Messages.SendMessage("I am a special assistant");
        }
    }
}

ربط الحوار في CxPerium

  1. سجّل الدخول إلى CxPerium

    افتح المنصة وانتقل إلى صفحة Assistant > Dialog (المساعد ← الحوار).

  2. أنشئ حوارًا جديدًا

    انقر على زر New Dialog (حوار جديد).

  3. أدخل تفاصيل الحوار

    Dialog Name (اسم الحوار): مساحة الاسم الكاملة (مثل QSoft.CxPerium.Assistant.Dialogs.WhoAreYouDialog). Report Name (اسم التقرير): اسم وصفي لأغراض التقارير. Language (اللغة): لغة التعرف. Regex Value (قيمة Regex): نمط التفعيل ("who are you").

  4. احفظ

    انقر على Save (حفظ) لتسجيل الحوار.

ملخص الخطوات

  1. عرّف فئة باسم WhoAreYouDialog.
  2. ورّثها من الفئة BaseWhatsAppDialog.
  3. نفّذ الواجهة IWhatsAppDialog.
  4. اكتب منطق الرد في الأسلوب RunDialog.
  5. أرسل الرسائل باستخدام Messages.SendMessage.
  6. سجّل الحوار وهيّئه في منصة CxPerium.

04. بنية NLP في CxPerium وتهيئتها

يعتمد CxPerium ثلاثة أساليب متمايزة لفهم رسائل المستخدمين وتوجيهها إلى الحوارات المناسبة.

1. المطابقة عبر Regex

تُوجَّه الرسائل المطابقة لتعبيرات Regex إلى الحوارات ذات الصلة وتتقدم وفق القواعد المعرفة مسبقًا. يُنصح بتعريف قواعد Regex تطابق رسائل المستخدمين الأكثر تكرارًا.

2. تكامل Google Dialogflow

عندما لا يكون للرسالة تطابق Regex، يفحص النظام إعدادات DialogFlowConfig في شاشة Assistant > Configuration (المساعد ← التهيئة). عند ضبط IsEnabled: true، تنتقل الرسالة إلى Google Dialogflow الذي يحلل دلالات الرسالة ويولّد ردًا أو يعيد إجراءً مقترحًا. يتطلب هذا التكامل مفاتيح Dialogflow API وتفاصيل المشروع.

3. تكامل ChatGPT

إذا فشلت مطابقة Regex ولم يقدّم Dialogflow ردًا مناسبًا، يرجع CxPerium إلى إعدادات ChatGPTConfig. عند ضبط IsEnabled: true، تُوجَّه الرسالة إلى ChatGPT الذي يحللها مباشرة باستخدام نموذج معالجة لغة طبيعية مدعوم بالذكاء الاصطناعي. يتطلب هذا التكامل مفاتيح API واختيار النموذج وتعريفات المعلمات.

ملخص التدفق

  1. Regex — توجّه الأنماط الرسائل المطابقة إلى الحوارات ذات الصلة.
  2. Dialogflow — يعالج الرسائل غير المطابقة عند تفعيله.
  3. ChatGPT — يتولى الرسائل المتبقية عند تفعيله.

يضمن هذا التسلسل معالجة الرسائل عبر آليات تحكم متعددة والتعامل معها بالأسلوب الأنسب.

05. تهيئة Google Dialogflow

اربط Google Dialogflow بمساعدك بحيث تُحلَّل الرسائل غير المطابقة دلاليًا وتُوجَّه إلى الحوارات الصحيحة.

  1. سجّل الدخول إلى Google Dialogflow وأنشئ وكيلًا

    ادخل إلى Dialogflow Console وأنشئ وكيلًا (على سبيل المثال "DemoAgent" باللغة التركية). افتح إعدادات الوكيل وانتقل إلى إعدادات مشروع Google Cloud عبر رابط Project ID.

  2. أنشئ حساب خدمة

    في Google Cloud، افتح قائمة Service Accounts (حسابات الخدمة)، وأنشئ حساب خدمة جديدًا بدور Owner (المالك)، وأنشئ ملف مفتاح JSON. احفظ الملف في مكان آمن.

  3. اربط CxPerium بالمشروع

    في CxPerium، انتقل إلى Assistant > Configuration (المساعد ← التهيئة) وحرّر حقل DialogFlowConfig. ضع ملف مفتاح JSON في الدليل الجذر للمشروع وهيّئه ليُنسخ أثناء عمليات البناء.

  4. اختبر وتحقق

    أنشئ intent بردّ نصي في Dialogflow، ثم أرسل عبارة التدريب المرتبطة به عبر WhatsApp للتحقق من عمل التهيئة.

يتطلب حقل DialogFlowConfig ما يلي:

  • CredentialsFilePath — اسم ملف مفتاح JSON (مثل demoagent-xxxxx.json).
  • ProjectId — قيمة project_id من ملف JSON.
  • IsEnable — اضبطه على True.

ربط intent بحوار

أضف custom payload إلى intent في Dialogflow لربطه بفئة حوار:

custom-payload.json
{
  "intent": "QSoft.CxPerium.Assistant.Dialogs.DialogFlowDemoDialog"
}
DialogFlowDemoDialog.cs
using QSoft.CxPerium.Dialogs.WhatsApp;

namespace QSoft.CxPerium.Assistant.Dialogs
{
    public class DialogFlowDemoDialog : BaseWhatsAppDialog, IWhatsAppDialog
    {
        public void RunDialog()
        {
            this.Messages.SendMessage("This dialog is mapped from DialogFlow");
        }
    }
}

يمكن قراءة المعلمات التي يلتقطها Dialogflow داخل الحوار:

capturing-parameters.cs
public void RunDialog()
{
    var country = this.Parameters["country"];
    this.Messages.SendMessage($"Country parameter: {country}");
}

06. تهيئة ChatGPT

هيّئ تكامل ChatGPT بحيث تُجاب الرسائل التي يتعذر على Regex وDialogflow التعامل معها بواسطة مساعد OpenAI.

  1. سجّل الدخول إلى منصة OpenAI أو أنشئ حسابًا

    افتح متصفحك وانتقل إلى https://platform.openai.com/. إذا كان لديك حساب OpenAI بالفعل، فانقر على Log In (تسجيل الدخول)؛ وإلا فانقر على Sign Up (إنشاء حساب) لإنشاء حساب جديد.

  2. أنشئ مساعدًا على منصة OpenAI

    بعد تسجيل الدخول، انتقل إلى قائمة Assistants (المساعدون)، وانقر على Create New Assistant (إنشاء مساعد جديد)، وهيّئ المساعد وفق متطلباتك.

  3. انسخ معرّف المساعد وأنشئ مفتاح API

    افتح صفحة تفاصيل المساعد الذي أنشأته وانسخ Assistant ID (معرّف المساعد). ثم انتقل إلى قسم API Keys (مفاتيح API)، وانقر على Create New API Key (إنشاء مفتاح API جديد)، واحفظ المفتاح المُنشأ في مكان آمن — سيُستخدم أثناء التكامل مع CxPerium.

  4. حرّر معلومات ChatGPTConfig في CxPerium

    في منصة CxPerium، انتقل إلى قسم Assistant (المساعد) وافتح شاشة Configuration (التهيئة). هيّئ إعدادات ChatGPTConfig: أدخل قيمتي ApiKey وAssistantId اللتين حصلت عليهما من منصة OpenAI واضبط حقل IsEnabled على True.

بعد إتمام هذه الخطوات، سيكون تكامل ChatGPT مع CxPerium جاهزًا.

08. إعدادات التوطين

تحتوي وحدة التوطين على إعدادات تتيح للمساعد عرض الرسائل المرسلة عبر روبوت المحادثة بلغات مختلفة.

يمكن الوصول إلى قائمة التوطين عبر Assistant > Localization (المساعد ← التوطين). تتيح لك تعريف مفاتيح التوطين والقيم المقابلة لها عبر لغات مختلفة. وداخل مشروعك، تسترجع فئة Localization قيم هذه المفاتيح.

MainDialog.cs
using QSoft.CxPerium.Dialogs.WhatsApp;
using QSoft.CxPerium.Models;
using QSoft.CxPerium.WhatsApp;

namespace QSoft.CxPerium.Assistant.Dialogs
{
    public class MainDialog : WelcomeDialog
    {
        public override void RunDialog()
        {
            string message = this.Localization.GetLocalizationText("SessionTimeoutMessage");
        }
    }
}

يترجم الأسلوب GetLocalizationTextByLanguage النص إلى لغة محددة:

by-language.cs
string message = Localization.GetLocalizationTextByLanguage("SessionTimeoutMessage", LanguagesEnum.Turkish);
  • يمثّل LanguagesEnum اللغة الهدف بخيارات مدعومة معرفة مسبقًا.
  • تؤدي اللغات غير المدعومة إلى إطلاق استثناء NotImplementedException.
  • تُحدَّد الرسائل بناءً على لغة الحوار المكتشفة من إدخال المستخدم.

09. المراسلة

أساليب المراسلة في حزمة CxPerium .NET SDK للتواصل عبر WhatsApp. يتم الوصول إلى جميع الأساليب من خلال الكائن Messages المتاح عند الوراثة من الفئة BaseWhatsAppDialog.

SendMessage

يرسل رسائل نصية، مع معاينة اختيارية لعناوين URL.

send-message.cs
this.Messages.SendMessage("Hello World");
this.Messages.SendMessage("Hello CXPerium https://www.cxperium.com", true);

SendButtonMessage

يسلّم رسالة بأزرار تفاعلية (يُسمح بثلاثة أزرار كحد أقصى).

send-button-message.cs
public class DemoDialog : BaseWhatsAppDialog, IWhatsAppDialog
{
    public void RunDialog()
    {
        List<Button> buttons = new List<Button>();
        buttons.Add(new Button() { IsVisible = true, Reply = new Reply() { Title = "Yes Button", Id = "#yes_button" } });
        buttons.Add(new Button() { IsVisible = true, Reply = new Reply() { Title = "No Button", Id = "#no_button" } });
        this.Messages.SendButtonMessage("Hello World", "Header Text", "Footer Text", buttons);
    }
}

SendImageMessage

ثلاثة أشكال لإرسال الصور: ملف محلي أو معرّف وسائط أو عنوان URL.

send-image-message.cs
FileInfo file = new FileInfo("C:\\images\\example.jpg");
this.Messages.SendImageMessageByFile(file, "Here is an image");

string mediaId = "123456789";
this.Messages.SendImageMessageById(mediaId, "Here is an image");

Uri url = new Uri("https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png");
this.Messages.SendImageMessageByUrl(url, "Here is an image");

SendLocationMessage

يرسل إحداثيات جغرافية مع تفاصيل الموقع.

send-location-message.cs
this.Messages.SendLocationMessage(40.712776, -74.005974, "New York", "New York, NY, USA");

SendDocumentMessage

ثلاثة أشكال لإرسال المستندات: ملف أو معرّف وسائط أو عنوان URL.

send-document-message.cs
FileInfo file = new FileInfo("C:\\documents\\example.pdf");
this.Messages.SendDocumentMessageByFile(file, "Here is a document", "example.pdf");

string mediaId = "987654321";
this.Messages.SendDocumentMessageById(mediaId, "Here is a document", "example.pdf");

Uri link = new Uri("https://example.com/documents/example.pdf");
this.Messages.SendDocumentMessageByUrl(link, "Here is a document", "example.pdf");

SendVideoMessage

ثلاثة أشكال لإرسال الفيديو: ملف أو معرّف وسائط أو عنوان URL.

send-video-message.cs
FileInfo file = new FileInfo("C:\\videos\\example.mp4");
this.Messages.SendVideoMessageByFile(file, "Here is a video");

string mediaId = "654321987";
this.Messages.SendVideoMessageById(mediaId, "Here is a video");

Uri url = new Uri("https://example.com/videos/example.mp4");
this.Messages.SendVideoMessageByUrl(url, "Here is a video");

SendListMessage

يسلّم رسائل قوائم تفاعلية بصفوف و/أو أقسام.

send-list-message.cs
List<Row> rows = new List<Row>
{
    new Row() { Id = "1", Title = "Option 1", Description = "Description for option 1" },
    new Row() { Id = "2", Title = "Option 2", Description = "Description for option 2" }
};
this.Messages.SendListMessage("Choose an option", "Header Text", "Footer Text", "View Options", rows);

List<Section> sections = new List<Section>
{
    new Section()
    {
        Title = "Section 1",
        Rows = new List<Row>
        {
            new Row() { Id = "1", Title = "Option 1", Description = "Description for option 1" },
            new Row() { Id = "2", Title = "Option 2", Description = "Description for option 2" }
        }
    }
};
this.Messages.SendListMessage("Choose an option", "Header Text", "Footer Text", "View Options", sections);

09.1. المراسلة (متقدم)

أساليب مراسلة إضافية: طلبات الموقع وبطاقات جهات الاتصال والملصقات وتفاعلات الرموز التعبيرية ورسائل الكتالوج / المنتجات.

SendLocationMessage

يشارك موقعًا محددًا مع المستخدم عبر الإحداثيات وتفاصيل العنوان. المعلمات: lat (double) وlon (double) وname (string، مثل "Office") وaddress (string).

send-location.cs
SendLocationMessage(double lat, double lon, string name, string address);

SendLocationMessage(40.987654, 29.123456, "QSoft Office", "Istanbul, Turkey");

SendLocationRequest

يطلب الموقع الحالي للمستخدم عبر WhatsApp. المعلمة هي نص رسالة الطلب.

send-location-request.cs
this.Messages.SendLocationRequest("Please share your location.");

SendContact

يرسل بطاقة جهة اتصال تحتوي على الهاتف والاسم والبريد الإلكتروني والتفاصيل المهنية.

send-contact.cs
SendContact(string phoneNumber, string name, string surname, string email,
string company, string department, string title);

SendContact("+905001112233", "Ahmet", "Yılmaz",
"ahmet.yilmaz@example.com", "QSoft", "Software", "Engineer");

SendSticker

يرسل ملفات ملصقات إلى المستخدمين بصيغة WebP.

send-sticker.cs
SendSticker(string stickerUrl);

SendSticker("https://example.com/sticker.webp");
  • الملصقات الثابتة — 512×512 بكسل، بحد أقصى 100 كيلوبايت.
  • الملصقات المتحركة — 512×512 بكسل، بحد أقصى 500 كيلوبايت.
  • الصيغة — WebP فقط؛ ويجب إزالة بيانات EXIF والبيانات الوصفية.
  • التحويل — يمكن لـ CloudConvert تحويل ملفات PNG/JPEG إلى WebP.

SendEmoji

يضيف تفاعل رمز تعبيري على رسالة أو يزيله. يُسمح برمز تعبيري واحد لكل تفاعل؛ ويؤدي إرسال سلسلة فارغة إلى إزالة الرمز التعبيري السابق. تُدعم الرموز التعبيرية المتوافقة مع Android/iOS والرموز المعالجة.

send-emoji.cs
SendEmoji(string messageId, string emoji);

SendEmoji("1234567890", "😊");
SendEmoji("1234567890", "");

SendCatalog

يعرض كتالوج المنتجات المرتبط في WhatsApp. المعلمتان: محتوى رسالة الكتالوج ونص التذييل.

send-catalog.cs
SendCatalog(string message, string footer);

SendCatalog("Discover our products!", "Contact us for more information.");

SendProductMessage

يرسل تفاصيل منتج واحد من كتالوج Meta. المعلمة هي المعرّف الفريد للمنتج في كتالوج Meta. يجب إضافة المنتج أولًا إلى كتالوج Meta قبل إمكان إرسال تفاصيله.

send-product-message.cs
this.Messages.SendProductMessage("1");

SendMultipleProductMessage

يرسل قوائم منتجات متعددة في رسالة واحدة منظمة.

send-multiple-product-message.cs
SendMultipleProductMessage(string bodyText, string footerText,
string headerText, List<MultiProductSection> products);

var products = new List<MultiProductSection>
{
  new MultiProductSection
  {
    Title = "Group 1",
    Items = new List<MultiProductItem>
    {
      new MultiProductItem { ProductRetailerId = "12345" },
      new MultiProductItem { ProductRetailerId = "67890" }
    }
  }
};

this.Messages.SendMultipleProductMessage("Body text", "Footer text",
"Header text", products);

10. WhatsApp Flows

كيفية استخدام WhatsApp Flows في حزمة CxPerium SDK لروبوتات محادثة WhatsApp المخصصة.

ما WhatsApp Flows؟

WhatsApp Flows ميزة مراسلة تجارية تتيح تفاعلات منظمة. فبدلًا من المحادثة التقليدية، توفر واجهة شبيهة بالنماذج دون مغادرة WhatsApp — ما يحقق تجربة مستخدم سلسة وجمعًا منظمًا للبيانات وكفاءة في الحصول على المعلومات.

  • تفاعلات منظمة — نماذج تواصل مخططة ومنظمة.
  • نماذج محسّنة — جمع بيانات يتجاوز المراسلة النصية.
  • البقاء داخل WhatsApp — يشارك المستخدمون المعلومات دون إعادة توجيه خارجية.
  • تفاعل أسرع — توفر العمليات المنظمة الوقت.
  • تجربة مستخدم أفضل — واجهة جمع بيانات سهلة الاستخدام.

إرسال رسالة Flow

يرسل الأسلوب this.Messages.SendFlowMessage رسائل WhatsApp Flows وله عدة أشكال (overloads):

send-flow-message-overloads.cs
// الاستخدام 1
SendFlowMessage(string message, string headerText, string footerText,
  string buttonText, Type catchedDialog, string flowIdOrName, string screen)

// الاستخدام 2
SendFlowMessage(string message, Uri url, string footerText,
  string buttonText, Type catchedDialog, string flowIdOrName, string screen)

// الاستخدام 3
SendFlowMessage(string message, Uri url, string footerText,
  string buttonText, Type catchedDialog, string flowIdOrName, string screen, JObject data)

// الاستخدام 4
SendFlowMessage(string message, string headerText, string footerText,
  string buttonText, Type catchedDialog, string flowId, string screen, JObject data)

التقاط بيانات Flow

يجب أن يشتق الحوار الذي سيلتقط بيانات النموذج من BaseWhatsAppDialog وينفّذ الواجهة IFlowReceiveMessage:

UserFormHandlerDialog.cs
using Newtonsoft.Json.Linq;
using QSoft.CxPerium.Dialogs.WhatsApp;

namespace QSoft.CxPerium.Assistant.Dialogs
{
  public class UserFormHandlerDialog : BaseWhatsAppDialog, IFlowReceiveMessage
  {
    public void ReceiveFlowMessage()
    {
      JObject formValue = this.Activity.Form.ResponseJson;
      // عالج بيانات النموذج هنا.
    }
  }
}

مثال على استخدام Flow

حوار يفتح النموذج:

MainDialog.cs
using QSoft.CxPerium.Dialogs.WhatsApp;
using System;

namespace QSoft.CxPerium.Assistant.Dialogs
{
  public class MainDialog : WelcomeDialog
  {
    public override void RunDialog()
    {
      this.Messages.SendFlowMessage(
        "Fill out the form below for your support request.",
        "Form",
        "Your request will be answered as soon as possible.",
        "Open Form",
        typeof(UserFormHandlerDialog),
        "customer_support",
        "DETAILS"
      );
    }
  }
}

حوار يلتقط بيانات النموذج:

UserFormHandlerDialog.cs
using Newtonsoft.Json.Linq;
using QSoft.CxPerium.Dialogs.WhatsApp;

namespace QSoft.CxPerium.Assistant.Dialogs
{
  public class UserFormHandlerDialog : BaseWhatsAppDialog, IFlowReceiveMessage
  {
    public void ReceiveFlowMessage()
    {
      JObject formValue = this.Activity.Form.ResponseJson;
      Messages.SendMessage($"The order form entered is {formValue["screen_0_Order_number_1"]} types");
    }
  }
}

استخدام نقاط النهاية في Flows

هيّئ عنوان الروبوت أدناه كنقطة نهاية للـ Flow — فهو يدير انتقالات الشاشات وديناميكيات النموذج:

endpoint
https://yourboturl/api/CxPerium/flows

للتعامل مع إجراء data_exchange، نفّذ الواجهة IFlowDataExchange:

data-exchange.cs
public class UserFormHandlerDialog : BaseWhatsAppDialog, IFlowDataExchange
{
  public FlowResponse DataExchange(FlowRequest request)
  {
    var exchangeData = request.Data;
    var response = new FlowResponse();
    response.Screen = "another_screen";
    response.Action = "navigate";
    return response;
  }
}

إنشاء مفاتيح RSA لـ WhatsApp Flows

يلزم مفتاح RSA بطول 2048 بت لتبادل البيانات الآمن — راجع دليل تشفير WhatsApp Business للتفاصيل. أضف ملف المفتاح الخاص إلى المشروع:

  1. اسم الملف

    سمِّ الملف private.pem.

  2. إجراء البناء

    اضبط Build Action (إجراء البناء) للملف على Embedded resource (مورد مضمّن).

بوجود هذا الإطار، يمكّن CxPerium الشركات من الاستفادة من WhatsApp Flows لتفاعلات عملاء منظمة وفعالة.

11. وحدات CxPerium

نظرة عامة على وحدات CxPerium ودمجها في روبوتات محادثة WhatsApp باستخدام C#‎. يوفر CxPerium أربع وحدات رئيسية — المحادثة المباشرة والاستطلاعات وCRM والتذاكر — لكل منها وظائف مميزة للتفاعل مع العملاء.

المحادثة المباشرة (Live Chat)

تتيح دعم العملاء في الوقت الفعلي وردودًا فورية على استفسارات المستخدمين. حوّل محادثة إلى المحادثة المباشرة من أي حوار:

transfer-to-live-chat.cs
using QSoft.CxPerium.Dialogs.WhatsApp;
using System;

namespace QSoft.CxPerium.Assistant.Dialogs
{
  public class MainDialog : BaseWhatsAppDialog
  {
    public override void RunDialog()
    {
      this.LiveChat.TransferToLiveChat();
    }
  }
}

حوّل المحادثة إلى فريق محدد:

transfer-by-team.cs
string teamId = "TEAM_ID_HERE";
this.LiveChat.TransferToLiveChatByTeam(teamId);

تعامل مع webhook الذي يُطلق عند إغلاق محادثة مباشرة:

on-closing-live-chat.cs
protected override void OnClosingLiveChat(Contact contact)
{
  base.OnClosingLiveChat(contact);
}

الاستطلاعات (Survey)

مصممة لقياس تجربة المستخدم وجمع ملاحظات العملاء حول الرضا والاحتياجات. تتيح لك webhooks الاستطلاعات التفاعل مع الإجابات وحالات الإكمال:

survey-webhooks.cs
protected override void OnSurveyQuestionAnswered(Contact contact,
  ConversationState conversation, SurveyCx survey,
  SurveyQuestionReplyCx answer)
{
  base.OnSurveyQuestionAnswered(contact, conversation, survey, answer);
}

protected override void OnSurveyCompleted(Contact contact,
  ConversationState conversation, SurveyCx survey)
{
  base.OnSurveyCompleted(contact, conversation, survey);
}

أرسل استطلاعًا من المساعد:

send-survey.cs
this.Survey.SendSurvey("surveyid");

CRM

يدير علاقات العملاء ويخزّن سجلات تفاعلاتهم. تُنشأ السجلات تلقائيًا عندما يراسل المستخدمون رقم WhatsApp المرتبط مع موافقة GDPR. اصل إلى بيانات جهة الاتصال من أي حوار:

contact-access.cs
var user = this.Contact;
// الوصول إلى user.Id وuser.Phone وuser.Email وغير ذلك.

توفر فئة Contact أيضًا هذه الأساليب:

  • InsertOrUpdateCustomField(string fieldName, string fieldValue)
  • Anonymize()
  • UpdateEmail(string email)
  • UpdateLanguage(LanguagesEnum language)

التذاكر (Ticket)

نظام إدارة مهام يتيح للمستخدمين إنشاء تذاكر دعم عبر المساعدين. يمكن إسناد التذاكر إلى مستخدمي CxPerium أو الفرق، مع إشعارات WhatsApp.

لم تجد ما تبحث عنه؟

دع فريقنا التقني يرافقك في عملية التكامل — أرسل سؤالك وسنعاود التواصل معك في اليوم نفسه.

دعم فني متخصص · استشارات تكامل مجانية