İçeriğe geç

NetGSM SMS ve OTP Mesaj Gönderimi

Merhaba Arkadaşlar,

Çoook uzun zamandır bir şey yazamadım biliyorum. Kısa kısa notlarla yine ara ara sizlerle birlikte olmaya çalışacağım.

Bugünkü konumuz NetGSM operatörü aracılığı ile sms ve otp gönderebileceğimiz bir servisi net core ile bir sınıf ve interface halinde kullanmak olacak.

Gelin kodumuzu görelim ve inceleyelim.

public interface ISendSMS
    {

        public Tuple<bool, string> SendOTP(string url, string username, string password, string orginator, string message, string number);
        public Tuple<bool, string> SendSMS(string url, string username, string password, string orginator, string message, string[] number);
    }

Birden fazla operatör ile bu işlemi yapabileceğimiz için burada bir interface (arayüz) tanımlayarak sadece yolu değiştirme işlemi ile başka operatörleri de kullanabiliriz.

Şimdi arka tarafta çalışacak kodumuzu yazalım. Bu makalenin başlığında olduğu gibi NetGSM firmasının yayınlamış olduğu kod bloğunun düzenlenmiş halini göreceksiniz. Öncelikle OTP (Anlık Mesaj) Göndermeye bakalım.

Tabi herşeyden önce private olarak tanımladığımız HttpPost ve XmlParse metotlarımızı tanımlıyoruz.

XMLPOST

private string XMLPOST(string PostAddress, string xmlData)
        {
            try
            {
                WebClient wUpload = new WebClient();
                HttpWebRequest request = WebRequest.Create(PostAddress) as HttpWebRequest;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                Byte[] bPostArray = Encoding.UTF8.GetBytes(xmlData);
                Byte[] bResponse = wUpload.UploadData(PostAddress, "POST", bPostArray);
                Char[] sReturnChars = Encoding.UTF8.GetChars(bResponse);
                string sWebPage = new string(sReturnChars);
                return sWebPage;
            }
            catch
            {
                return "-1";
            }
        }

XmlParse İşlemi

private Tuple<int, string> XmlParse(string xmlString)
        {
            XmlDocument xml = new XmlDocument();
            xml.LoadXml(xmlString);

            int.TryParse(xml.SelectSingleNode("/xml/main/code").InnerText, out int code);

            return new Tuple<int, string>(code, xml.SelectSingleNode("/xml/main/jobID").InnerText);
        }

SMS_NetGSM.cs

public Tuple<bool, string> SendOTP(string url, string username, string password, string orginator, string message, string number)
        {
            //https://api.netgsm.com.tr/sms/send/otp

            number = number.Replace(" ", "").TrimStart('+').TrimStart('0').TrimStart('9').TrimStart('0');

            string xml = "";
            xml += "<?xml version='1.0' encoding='UTF-8'?>";
            xml += "<mainbody>";
            xml += "<header>";
            xml += $"<usercode>{username}</usercode>";
            xml += $"<password>{password}</password>";
            xml += $"<msgheader>{orginator}</msgheader>";
            xml += "</header>";
            xml += "<body>";
            xml += $"<msg><![CDATA[{message}]]></msg>";
            xml += $"<no>{number}</no>";
            xml += "</body>";
            xml += "</mainbody>";

            xml = string.Format(xml, username, password, orginator, message, number);

            try
            {
                var result = XmlParse(XMLPOST(url, xml));
                return new Tuple<bool, string>(result.Item1 == 0, result.Item2);
            }
            catch (Exception ex)
            {
                return new Tuple<bool, string>(false, ex.Message);
            }
        }

Burada gördüğünüz gibi; “https://api.netgsm.com.tr/sms/send/otp” adresi ile post işlemini yaparak kodumuzu NetGSM tarafına gönderiyoruz ve yanıtı işliyoruz. Durum ne olursa olsun eğer Tuple<bool, string> cevabındaki Item1 olan boolean yanıt true ise sms gönderilmiş demektir. Aksi taktirde Item2’deki mesajı görebilir, gösterebiliriz.

        public Tuple<bool, string> SendSMS(string url, string username, string password, string orginator, string message, string[] number)
        {
            //https://api.netgsm.com.tr/sms/send/xml

            string xml = "";
            xml += "<?xml version='1.0' encoding='UTF-8'?>";
            xml += "<mainbody>";
            xml += "<header>";
            xml += "<company dil='TR'>Netgsm</company>";
            xml += $"<usercode>{username}</usercode>";
            xml += $"<password>{password}</password>";
            xml += "<type>1:n</type>";
            xml += $"<msgheader>{orginator}</msgheader>";
            xml += "</header>";
            xml += "<body>";
            xml += "<msg>";
            xml += $"<![CDATA[{message}]]>";
            xml += "</msg>";
            foreach (string num in number)
            {
                string _num = num.Replace(" ", "").TrimStart('+').TrimStart('0').TrimStart('9').TrimStart('0');
                xml += $"<no>0{_num}</no>";
            }
            xml += "</body>  ";
            xml += "</mainbody>";

            var result = XMLPOST(url, xml);

            try
            {
                int.TryParse(result.Split(' ')[0], out int result_int);
                return new Tuple<bool, string>(result_int == 0, result.Split(' ')[1]);
            }
            catch (Exception ex)
            {
                return new Tuple<bool, string>(false, ex.Message);
            }
        }

Burada da endpoint’imiz “https://api.netgsm.com.tr/sms/send/xml” şeklinde değişiyor. Bu metot ile birden fazla numaraya mesaj gönderme işlemini de yapabiliyoruz…

Daha sonraki makalelerde farklı operatörlerden de aynı interface’i kullanarak mesaj gönderme işlemini yapmayı göreceğiz.

Tabi her şey bir kenara, bu kodu çalıştırmadan önce StartUp.cs dosyasına “AddSingleton” ile inject etmeyi unutmayalım. Aksi taktirde o gıcık hata ile karşılaşırız. 🙂

NetGSM.cs Sayfasının Tamamına Aşağıdak Ulaşabilirsiniz.

    public class SMS_NetGSM : ISendSMS
{
public Tuple<bool, string> SendOTP(string url, string username, string password, string orginator, string message, string number, string ShortNumber = null)
{
//https://api.netgsm.com.tr/sms/send/otp
number = number.Replace(" ", "").TrimStart('+').TrimStart('0').TrimStart('9').TrimStart('0');
string xml = "";
xml += "<?xml version='1.0' encoding='UTF-8'?>";
xml += "<mainbody>";
xml += "<header>";
xml += $"<usercode>{username}</usercode>";
xml += $"<password>{password}</password>";
xml += $"<msgheader>{orginator}</msgheader>";
xml += "</header>";
xml += "<body>";
xml += $"<msg><![CDATA[{message}]]></msg>";
xml += $"<no>{number}</no>";
xml += "</body>";
xml += "</mainbody>";
xml = string.Format(xml, username, password, orginator, message, number);
try
{
var result = XmlParse(XMLPOST(url, xml));
return new Tuple<bool, string>(result.Item1 == 0, result.Item2);
}
catch (Exception ex)
{
return new Tuple<bool, string>(false, ex.Message);
}
}
public Tuple<bool, string> SendSMS(string url, string username, string password, string orginator, string message, string[] number)
{
//https://api.netgsm.com.tr/sms/send/xml
string xml = "";
xml += "<?xml version='1.0' encoding='UTF-8'?>";
xml += "<mainbody>";
xml += "<header>";
xml += "<company dil='TR'>Netgsm</company>";
xml += $"<usercode>{username}</usercode>";
xml += $"<password>{password}</password>";
xml += "<type>1:n</type>";
xml += $"<msgheader>{orginator}</msgheader>";
xml += "</header>";
xml += "<body>";
xml += "<msg>";
xml += $"<![CDATA[{message}]]>";
xml += "</msg>";
foreach (string num in number)
{
string _num = num.Replace(" ", "").TrimStart('+').TrimStart('0').TrimStart('9').TrimStart('0');
xml += $"<no>0{_num}</no>";
}
xml += "</body>  ";
xml += "</mainbody>";
var result = XMLPOST(url, xml);
try
{
int.TryParse(result.Split(' ')[0], out int result_int);
return new Tuple<bool, string>(result_int == 0, result.Split(' ')[1]);
}
catch (Exception ex)
{
return new Tuple<bool, string>(false, ex.Message);
}
}
private string XMLPOST(string PostAddress, string xmlData)
{
try
{
WebClient wUpload = new WebClient();
HttpWebRequest request = WebRequest.Create(PostAddress) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
Byte[] bPostArray = Encoding.UTF8.GetBytes(xmlData);
Byte[] bResponse = wUpload.UploadData(PostAddress, "POST", bPostArray);
Char[] sReturnChars = Encoding.UTF8.GetChars(bResponse);
string sWebPage = new string(sReturnChars);
return sWebPage;
}
catch
{
return "-1";
}
}
private Tuple<int, string> XmlParse(string xmlString)
{
XmlDocument xml = new XmlDocument();
xml.LoadXml(xmlString);
int.TryParse(xml.SelectSingleNode("/xml/main/code").InnerText, out int code);
return new Tuple<int, string>(code, xml.SelectSingleNode("/xml/main/jobID").InnerText);
}
}
0 0 votes
Article Rating
Tarih:.Net CoreAnasayfa
Subscribe
Bildir
guest
2 Yorum
Eskiler
En Yeniler Beğenilenler
Inline Feedbacks
View all comments
Emre Taşkıran
1 yıl önce

Ne Ekersen’in backend’ini .NET Core ile kodluyoruz. NetGSM’den geçen hafta SMS hizmeti almaya başladık. Http Post ile normal SMS’i aktive ettik. Ancak XML Post ile yapılması önerilen OTP SMS gönderiminde bir türlü .NET Core’da nasıl kodlayacağımızı anlayamadık. Bu yazı bu açıdan bizim için çok iyi oldu. Teşekkür ederiz.

2
0
Would love your thoughts, please comment.x