إرشادات بنية دفع المؤسسة

تنتقل الشركات في هذه الأيام تدريجيًا نحو إنشاء تطبيقات الهاتف المحمول إما لمستخدميها النهائيين (في الخارج) أو للموظفين (في الداخل). وتمتلك الشركات أنظمة خلفية، مثل الأطر الرئيسية أو بعض تطبيقات LoB، والتي يجب دمجها في بنية تطبيق الهاتف المحمول. يعرض هذا الدليل أفضل طريقة للقيام بهذا التكامل مع التوصية بحل ممكن للسيناريوهات الشائعة.

تتمثل إحدى المتطلبات المتكررة في إرسال الإعلامات المؤقتة للمستخدمين من خلال تطبيق الهاتف المحمول الخاص بهم عند وقوع حدث يهمهم في أنظمة الخلفية. على سبيل المثال، يريد عميل البنك الذي لديه تطبيق البنك المصرفي على iPhone أن يتم إعلامه عند إجراء خصم فوق مبلغ معين من الحساب، أو سيناريو إنترانت حيث يريد موظف من قسم المالية يستخدم التطبيق الموافقة على الموازنة على Windows Phone بأن يتم إعلامه عند تلقي طلب الموافقة.

من المحتمل أن تتم معالجة الحساب البنكي أو الموافقة في بعض نظام الخلفية، والذي من المفترض أن يبدأ بإرسال الإعلام المؤقت إلى المستخدم. قد يكون هناك العديد من أنظمة الخلفية هذه، والتي يجب أن تبني جميعها نفس النوع من المنطق للدفع عندما تؤدي إحدى الأحداث إلى تشغيل الإعلام. يكمن التعقيد هنا في دمج العديد من الأنظمة الخلفية مع نظام دفع واحد؛ حيث قد يكون المستخدمون النهائيون قد اشتركوا في إعلامات مختلفة وقد يكون هناك حتى تطبيقات متعددة للهاتف المحمول. على سبيل المثال، تطبيقات إنترانت للهواتف المحمولة حيث قد يرغب تطبيق واحد للهواتف المحمولة في تلقي إخطارات من أنظمة خلفية متعددة. أنظمة الخلفية لا تعرف أو تحتاج إلى معرفة دلالات الدفع / التكنولوجيا، لذلك كان الحل المشترك التقليدي هنا هو إدخال مكون، والذي يستقصي أنظمة الواجهة الخلفية لأي أحداث ذات أهمية وهو مسؤول عن إرسال رسائل الدفع إلى العميل.

الحل الأفضل هو استخدام ناقل خدمة Microsoft Azure - نموذج الموضوع/الاشتراك، ما يقلل من التعقيد مع جعل الحل قابلاً للتطوير.

فيما يلي البنية العامة للحل (معممة مع تطبيقات متعددة للهواتف المحمولة ولكن قابلة للتطبيق بنفس القدر عندما يكون هناك تطبيق واحد فقط للهواتف المحمولة)

البنية

Diagram of the enterprise architecture showing the flow through Events, Subscriptions, and Push Messages.

يعتبر الجزء الرئيسي في هذا الرسم التخطيطي للبنة ناقل خدمة Microsoft Azure، والذي يوفر نموذج برمجة الموضوعات/الاشتراكات (يتم توفير المزيد من المعلومات بشان ذلك في برمجة Service Bus Pub/Sub). لا يستلم المتلقي، والذي يكون في هذه الحالة هو الواجهة الخلفية للأجهزة المحمولة (عادةً Azure Mobile Service، التي تبدأ إرسال الإعلام المؤقت إلى تطبيقات الأجهزة المحمولة)، الرسائل مباشرة من أنظمة الواجهة الخلفية، ولكن بدلاً من ذلك، طبقة تجريد وسيطة توفرها ناقل خدمة Azure، والتي تمكن الواجهة الخلفية للأجهزة المحمولة من تلقي الرسائل من نظام خلفية واحد أو أكثر. يجب إنشاء موضوع ناقل خدمة Microsoft Azure لكل نظام من أنظمة الواجهة الخلفية، على سبيل المثال، الحساب، الموارد البشرية، التمويل، وهي في الأساس «موضوعات» ذات أهمية، والذي يبدأ إرسال الرسائل كإشعار دفع. تقوم أنظمة الواجهة الخلفية بإرسال رسائل إلى هذه الموضوعات. يمكن للواجهة الخلفية للأجهزة المحمولة الاشتراك في موضوع واحد أو أكثر من هذه الموضوعات عن طريق إنشاء اشتراك ناقل خدمة Microsoft Azure. وهي تخول الواجهة الخلفية للأجهزة المحمولة تلقي إخطار من نظام الواجهة الخلفية المقابل. تستمر الواجهة الخلفية للأجهزة المحمولة في الاستماع إلى الرسائل على اشتراكاتها وبمجرد وصول رسالة، فإنها تعود وترسلها إخطارا إلى مركز الإعلامات الخاص بها. ثم تقوم مراكز الإعلامات بتسليم الرسالة في نهاية المطاف إلى تطبيق الأجهزة المحمولة. فيما يلي قائمة بالمكونات الرئيسية:

  1. أنظمة الواجهة الخلفية (أنظمة LoB/Legacy)
    • إنشاء موضوع ناقل خدمة Microsoft Azure
    • إرسال رسالة
  2. الخلفية للأجهزة المحمولة
    • إنشاء اشتراك خدمة
    • استلام الرسالة (من نظام الخلفية)
    • إرسال إعلام إلى العملاء (عبر Azure Notification Hub)
  3. تطبيق الجوال
    • استلام الإعلام وعرضه

المزايا

  1. يتيح الفصل بين المتلقي (تطبيق/خدمة الهواتف المحمولة عبر Notification Hub) والمرسل (أنظمة الواجهة الخلفية) دمج أنظمة خلفية إضافية مع الحد الأدنى من التغيير.
  2. كما أنه يجعل سيناريو تطبيقات الأجهزة المحمولة المتعددة قادرًا على تلقي الأحداث من نظام واجهة خلفية واحد أو أكثر.

عينة

المتطلبات الأساسية

أكمل البرامج التعليمية التالية للتعرف على المفاهيم بالإضافة إلى خطوات الإنشاء والتكوين الشائعة:

  1. برمجة Service Bus Pub/Sub - يشرح هذا البرنامج التعليمي تفاصيل العمل مع مواضيع/اشتراكات ناقل خدمة Microsoft Azure، وكيفية إنشاء مساحة اسم لتحتوي على مواضيع/اشتراكات، وكيفية إرسال واستقبال الرسائل منها.
  2. مراكز الإعلامات - البرنامج التعليمي العام ل Windows - يشرح هذا البرنامج التعليمي كيفية إعداد تطبيق Windows Store واستخدام مراكز الإخطارات لتسجيل الإخطارات ثم تلقيها.

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

يتوفر نموذج التعليمات البرمجية الكامل في عينات مركز الإعلامات. يقسم إلى ثلاثة مكونات:

  1. EnterprisePushBackendSystem

    أ. يقوم هذا المشروع باستخدام حزمة Azure.Messaging.ServiceBus NuGet ويستند إلى برمجة Service Bus Pub/Sub.

    ب. يعتبر هذا التطبيق هو تطبيق وحدة تحكم C# بسيط لمحاكاة نظام LoB، والذي يبدأ الرسالة ليتم تسليمها إلى تطبيق الأجهزة المحمولة.

    static async Task Main(string[] args)
    {
        string connectionString =
            ConfigurationManager.AppSettings.Get("Azure.ServiceBus.ConnectionString");
    
        // Create the topic
        await CreateTopicAsync(connectionString);
    
        // Send message
        await SendMessageAsync(connectionString);
    }
    

    جـ. CreateTopicAsync يتم استخدامه لإنشاء موضوع ناقل خدمة Microsoft Azure.

    public static async Task CreateTopicAsync(string connectionString)
    {
        // Create the topic if it does not exist already
        ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(connectionString);
    
        if (!await client.TopicExistsAsync(topicName))
        {
            await client.CreateTopicAsync(topicName);
        }
    }
    

    د. SendMessageAsync يستخدم لإرسال الرسائل إلى موضوع ناقل خدمة Microsoft Azure هذا. ترسل هذه التعليمة البرمجية ببساطة مجموعة من الرسائل العشوائية إلى الموضوع بصورة دورية لغرض العينة. عادة ما يكون هناك نظام الخلفية، والذي يرسل رسائل عند حدوث حدث.

    public static sync Task SendMessageAsync(string connectionString)
    {
        await using var client = new ServiceBusClient(connectionString);
        ServiceBusSender sender = client.CreateSender(topicName);
    
        // Sends random messages every 10 seconds to the topic
        string[] messages =
        {
            "Employee Id '{0}' has joined.",
            "Employee Id '{0}' has left.",
            "Employee Id '{0}' has switched to a different team."
        };
    
        while (true)
        {
            Random rnd = new Random();
            string employeeId = rnd.Next(10000, 99999).ToString();
            string notification = String.Format(messages[rnd.Next(0,messages.Length)], employeeId);
    
            // Send Notification
            ServiceBusMessage message = new ServiceBusMessage(notification);
            await sender.SendMessageAsync(message);
    
            Console.WriteLine("{0} Message sent - '{1}'", DateTime.Now, notification);
    
            System.Threading.Thread.Sleep(new TimeSpan(0, 0, 10));
        }
    }
    
  2. ReceiveAndSendNotification

    أ. يقوم هذا المشروع باستخدام حزم Azure.Messaging.ServiceBusوMicrosoft.Web.WebJobs.Publish NuGet ويستند إلى برمجة Service Bus Pub/Sub.

    ب. يعمل تطبيق وحدة التحكم التالي كـ Azure WebJob لأنه يجب تشغيله باستمرار للاستماع إلى الرسائل من أنظمة LoB/الخلفية. يعد هذا التطبيق جزءا من الخلفية للأجهزة المحمولة الخاصة بك.

    static async Task Main(string[] args)
    {
        string connectionString =
                 ConfigurationManager.AppSettings.Get("Azure.ServiceBus.ConnectionString");
    
        // Create the subscription that receives messages
        await CreateSubscriptionAsync(connectionString);
    
        // Receive message
        await ReceiveMessageAndSendNotificationAsync(connectionString);
    }
    

    جـ. CreateSubscriptionAsync يتم استخدامه لإنشاء اشتراك ناقل خدمة Microsoft Azure للموضوع حيث يرسل نظام الواجهة الخلفية رسائل. اعتمادًا على سيناريو العمل، ينشئ هذا المكون اشتراكًا واحدًا أو أكثر في الموضوعات المقابلة (على سبيل المثال، قد يتلقى البعض رسائل من نظام الموارد البشرية، وبعضها من نظام التمويل، وغيرها)

    static async Task CreateSubscriptionAsync(string connectionString)
    {
        // Create the subscription if it does not exist already
        ServiceBusAdministrationClient client = new ServiceBusAdministrationClient(connectionString);
    
        if (!await client.SubscriptionExistsAsync(topicName, subscriptionName))
        {
            await client.CreateSubscriptionAsync(topicName, subscriptionName);
        }
    }
    

    د. ReceiveMessageAndSendNotificationAsync يستخدم لقراءة الرسالة من الموضوع باستخدام اشتراكه وفي حال كانت القراءة ناجحة، فاختر إعلامًا (في نموذج السيناريو إعلام منبثق أصلي لـ Windows) ليتم إرساله إلى تطبيق الجوال باستخدام Azure Notification Hubs.

    static async Task ReceiveMessageAndSendNotificationAsync(string connectionString)
    {
        // Initialize the Notification Hub
        string hubConnectionString = ConfigurationManager.AppSettings.Get
                ("Microsoft.NotificationHub.ConnectionString");
        hub = NotificationHubClient.CreateClientFromConnectionString
                (hubConnectionString, "enterprisepushservicehub");
    
        ServiceBusClient Client = new ServiceBusClient(connectionString);
        ServiceBusReceiver receiver = Client.CreateReceiver(topicName, subscriptionName);
    
        // Continuously process messages received from the subscription
        while (true)
        {
            ServiceBusReceivedMessage message = await receiver.ReceiveMessageAsync();
            var toastMessage = @"<toast><visual><binding template=""ToastText01""><text id=""1"">{messagepayload}</text></binding></visual></toast>";
    
            if (message != null)
            {
                try
                {
                    Console.WriteLine(message.MessageId);
                    Console.WriteLine(message.SequenceNumber);
                    string messageBody = message.Body.ToString();
                    Console.WriteLine("Body: " + messageBody + "\n");
    
                    toastMessage = toastMessage.Replace("{messagepayload}", messageBody);
                    SendNotificationAsync(toastMessage);
    
                    // Remove message from subscription
                    await receiver.CompleteMessageAsync(message);
                }
                catch (Exception)
                {
                    // Indicate a problem, unlock message in subscription
                    await receiver.AbandonMessageAsync(message);
                }
            }
        }
    }
    static async void SendNotificationAsync(string message)
    {
        await hub.SendWindowsNativeNotificationAsync(message);
    }
    

    هـ. لكي تنشر هذا التطبيق كـ WebJob، انقر بزر الماوس الأيمن فوق الحل في Visual Studio وحدد Publish as WebJob

    Screenshot of the right-click options being displayed with Publish as Azure WebJob outlined in red.

    و. حدد ملف تعريف النشر الخاص بك وأنشئ Azure WebSite جديدًا في حال لم يكن موجودا بالفعل، والذي يستضيف WebJob هذا وبمجرد حصولك على WebSite ثم Publish.

    Screenshot showing the workflow to create a site on Azure.

    لقطة شاشة لمربع الحوار Publish Web مع تحديد خيار مواقع Microsoft Azure على الويب، وسهم أخضر يشير إلى مربع الحوار تحديد موقع ويب موجود مع الخيار جديد الموضح باللون الأحمر، وسهم أخضر يشير إلى مربع الحوار إنشاء موقع على Microsoft Azure باسم الموقع وإنشاء خيارات موضحة باللون الأحمر.

    ز. كون المهمة لتكون «تشغيل مستمر» بحيث عند تسجيل الدخول إلى مدخل Microsoft Azure يجب أن ترى شيئا مثل ما يلي:

    Screenshot of the Azure Portal with the enterprise push backend webjobs displayed and the Name, Schedule, and Logs values outlined in red.

  3. EnterprisePushMobileApp

    أ. يعتبر هذا التطبيق تطبيق Windows Store، يتلقى إعلامات منبثقة من WebJob قيد التشغيل كجزء من الخلفية للأجهزة المحمولة وعرضها. تستند هذه التعليمة البرمجية إلى Notification Hubs - البرنامج التعليمي العام لـ Windows.

    ب. تأكد من تمكين التطبيق الخاص بك لتلقي الإخطارات المنبثقة.

    جـ. تأكد من استدعاء رمز تسجيل Notification Hubs التالي في بدء تشغيل التطبيق (بعد استبدال HubName قيم و DefaultListenSharedAccessSignature:

    private async void InitNotificationsAsync()
    {
        var channel = await PushNotificationChannelManager.CreatePushNotificationChannelForApplicationAsync();
    
        var hub = new NotificationHub("[HubName]", "[DefaultListenSharedAccessSignature]");
        var result = await hub.RegisterNativeAsync(channel.Uri);
    
        // Displays the registration ID so you know it was successful
        if (result.RegistrationId != null)
        {
            var dialog = new MessageDialog("Registration successful: " + result.RegistrationId);
            dialog.Commands.Add(new UICommand("OK"));
            await dialog.ShowAsync();
        }
    }
    

تشغيل العينة

  1. تأكد من تشغيل WebJob بنجاح وجدولته للتشغيل على نحو مستمر.

  2. شغل تطبيق هاتف محمول لدفع المؤسسة، الذي يبدأ تشغيل تطبيق Windows Store.

  3. شغل تطبيق وحدة تحكم نظام واجهة خلفية دفع المؤسسة، الذي يحاكي خلفية LoB ويبدأ في إرسال الرسائل ويجب أن تشاهد إخطارات منبثة تظهر مثل الصورة التالية:

    Screenshot of a console running the Enterprise Push Backend System app and the message that is sent by the app.

  4. أرسلت الرسائل في الأصل إلى موضوعات ناقل خدمة Microsoft Azure، والتي كانت تتم مراقبتها بواسطة اشتراكات ناقل خدمة Microsoft Azure في مهمة الويب الخاصة بك. بمجرد استلام رسالة، تم إنشاء إخطار وإرساله إلى تطبيق الأجهزة المحمولة. بإمكانك البحث من خلال سجلات WebJob لتأكيد المعالجة عند الانتقال إلى ارتباط السجلات في مدخل Microsoft Azure لمهمة الويب الخاصة بك:

    Screenshot of the Continuous WebJob Details dialog box with the message that is sent outlined in red.