SMSPlugin
    • 08 Aug 2024
    • 3 Minutes to read
    • Dark
      Light

    SMSPlugin

    • Dark
      Light

    Article summary

    SMS gönderimi esnasında mevcut sms sağlayıcısı haricinde bir sağlayıcı kullanılmak istenirse SMS Plug-In geliştirmek gerekir. Örneğin, Paperwork sistemi üzerinde kullanıcı kimlik doğrulama işlemini sms üzerinden yapıldığı durumda kullanılır. Yeni SMS Plug-In aşağıdaki şekilde tanımlayabilirsiniz. 

    Öncelikli olarak yeni bir .Net kütüphanesi oluşturulması gerekmektedir. Kütüphane oluştururken dikkat edilmesi gereken üç konu vardır. Oluşturduğunuz kütüphanenin özelliklerinden “Target framework” değeri “.NET Framework 4.7.2”, “Platform target” değeri “X64” ve kütüphanenin ön eki “Paperwork” olarak ayalarlanmalıdır. 

    Bilgi
    Bu işlem için öncelikle installer üzerinden MFA yapılandırması yapılması gerekmektedir.

    Başlangıçta yeni bir proje oluşturulmalıdır. Yeni bir Class Library(.NET Framework) oluştururken framework olarak “.NET Framework 4.7.2” seçilmelidir. 

    Proje oluşturulduktan sonra “Paperwork.Sms” projeye referans olarak eklenmelidir. Paperwork.Sms.dll dosyasına “C:\Paperwork\Bin\PWLibs” konumundan erişim sağlanabilir.

    Burada “Paperwork.Sms” referans gösterilmesinin sebebi oluşturacağımız sınıfın referans üzerinden “SmsInterface” interface’i ile kullanılacak olmasıdır.

    Daha sonra kütüphaneye yeni bir sınıf eklemeli ve oluşturulan sınıf “SmsInterface” interface’ini kullanacak şekilde tanımlanmalıdır. 

    SmsInterface’inin hata aldığını göreceksiniz. Bunun sebebi interface’in gerekliliklerinin eklenmemiş olmasıdır.

    Görüleceği gibi SmsInterface’in gerekli olan iki fonksiyonu mevcuttur. Balance ve SendSms fonsiyonları mevcut olmalı ve gerekli parametrelerin eklenmiş olması gerekmektedir. “Implement interface” ile sınıfımıza gerekli fonksiyonları ekleyebiliriz.

    Paperwork giriş ekranlarında “SendSms” dönüş değeri olarak tipi olarak integer bir değer bekler. Dolayısıyla fonksiyonun dönüş tipinin değiştirilmemesi gerekmektedir. 0 (sıfır) değeri dönüyorsa işlemin başarılı olduğu anlamına gelir. Interface tanımlamasında olan “Balance” fonksiyonu ile sms sağlayıcı tarafından tanımlı sms miktarı tanımlanır.

    Önemli olan nokta Paperwork üzerinde SMS ile girişin başırılı şekilde sonuçlanabilmesi için “SendSms” fonksiyonun değerlerinin doğru verilmesi ve geri dönüş tipinin doğru olarak tanımlanması gerekmektedir. 

    Sms gönderimi için geliştirmemizi tamamladıktan sonra derlediğimiz projenin .dll dosyasını içerik sunucusunun kurulu olduğu makine üzerine “C:\Paperwork\Bin\Plugins” konumuna eklenmelidir.

    Not: Derlenmiş olan projemizi bu dizine atmadan önce IIS Manager ile Paperwork uygulaması durdurulduktan sonra dizine atılmalıdır. Taşıma işlemi bittikten sonra IIS Manager ve Paperwork tekrar başlatılabilir. 

    Tüm işlemler bittikten sonra Paperwork uygulaması konfigrasyon dosyasında (C:\inetpub\wwwroot\Paperwork\web.config) düzenlemeler yapılmalıdır.

    mfAuthType ile doğrulama yöntemi belirlenir. mfSmsTarget ile hedef kütüphane belirlenir.

    <!—Multi Factor Auth -->

    <add key=”mfAuthType” value=”sms”/><!—none/mail/sms-->

    <add key=” mfSmsTarget” value=”Paperwork.Sms.SanalSantral”/>

    Aşağıda SmsSantral uygulamasına bir örneğe ulaşılabilir : 

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace Paperwork.Sms.SanalSantral
    {
        public class SmsManager : SmsInterface
        {
            private string url = "http://sms2.sanalsantral.com.tr";
            private string API_KEY = "";
            private int SMS_ID = 0;
    
            public int Balance() => throw new NotImplementedException();
    
            /// <summary>
            /// sms2 sağlayıcısı üzerinden Web servis api (smspost) fonksiyonu ile sms gönderilir
            /// </summary>
            /// <remarks>
            /// sms sağlayıcının sağladığı anahtar bilgisi ile işlem yapılır.
            /// </remarks>
            /// <param name="phone">Telefon Numarası</param>
            /// <param name="subject">Başlık bilgisi</param>
            /// <param name="message">Mesaj</param>
            /// <param name="platform">Ortam Bilgisi</param>
            /// <param name="result">Hata durumundaki oluşan mesaj</param>
            public int SendSms(string phone, string subject, string message, string platform, ref string result)
            {
                if (this.API_KEY.Length < 10) throw new Exception("Api_key Eksiktir!");
                if (this.SMS_ID == 0) throw new Exception("SMS Id Eksiktir!");
                if (subject == "") throw new Exception("SMS Başlığı  Eksiktir!");
    
                string str = this.SendSms(this.GetSmsText(new SsSms()
                {
                    api_key = this.API_KEY,
                    sms_id = this.SMS_ID,
                    baslik = subject,
                    gidecek_no = phone,
                    mesaj = message,
                    tipi = "2"
                }), ref result);
                return int.Parse(str);
            }
    
            /// <summary>
            /// smspost api fonksiyonu  sms gönderir.
            /// </summary>
            /// <param name="smsInfo">Sms Detay Bilgisi</param>
            /// <param name="message">Hata durumundaki oluşan mesaj</param>
            private string SendSms(string smsInfo, ref string message)
            {
                string str;
                try
                {
                    WebRequest length = WebRequest.Create(string.Concat(this.url, "/api/smspost/v1"));
                    length.Method = "POST";
                    byte[] bytes = Encoding.UTF8.GetBytes(smsInfo);
                    length.ContentType = "application/x-www-form-urlencoded";
                    length.ContentLength = (long)((int)bytes.Length);
                    Stream requestStream = length.GetRequestStream();
                    requestStream.Write(bytes, 0, (int)bytes.Length);
                    requestStream.Close();
                    using (WebResponse response = length.GetResponse())
                    {
                        Stream responseStream = response.GetResponseStream();
                        requestStream = responseStream;
                        using (responseStream)
                        {
                            string end = (new StreamReader(requestStream)).ReadToEnd();
                            string[] strArrays = end.Split(new char[] { ' ' });
                            if ((int)strArrays.Length <= 1)
                            {
                                message = string.Concat("Error from Sanal Santral:", strArrays[0]);
                            }
                            else
                            {
                                message = strArrays[1];
                            }
                            str = strArrays[0];
                            return str;
                        }
                    }
                }
                catch (Exception exception1)
                {
                    Exception exception = exception1;
                    message = exception.Message;
                    Console.WriteLine(exception.Message);
                }
                str = "-1";
                return str;
            }
    
            public SmsManager(string apiKey, int smsId)
            {
                this.SMS_ID = smsId;
                this.API_KEY = apiKey;
            }
    
    
            private string GetSmsText(SsSms sm)
            {
                return string.Concat(new object[] { "<sms><apikey>", sm.api_key, "</apikey><header>", sm.baslik, "</header><type>", sm.tipi, "</type><validity>", sm.sms_id, "</validity><message><gsm><no>", sm.gidecek_no, "</no></gsm><msg> ", sm.mesaj, "</msg></message></sms>" });
            }
    
    
            public class SsSms
            {
                public string api_key { get; set; }
                public string baslik { get; set; }
                public string gidecek_no { get; set; }
                public string mesaj { get; set; }
                public int sms_id { get; set; }
                public string tipi { get; set; }
                public SsSms() { }
            }
        }
    }