ارسال پیامک با دلفی
پیام رسان بلاگ برنامه نویسی راهنمای کامل ارسال پیامک در زبان دلفی

راهنمای کامل ارسال پیامک در زبان دلفی

نوشته ای از پیام رسان
انتشار در تاریخ 10 شهریور 1404
دسته بندی: برنامه نویسی

زبان برنامه‌نویسی دلفی (Delphi) یکی از زبان‌های قدرتمند، شی‌ءگرا و ساختاریافته است که برای توسعه نرم‌افزارهای کاربردی دسکتاپ، موبایل و وب استفاده می‌شود. این زبان بر پایه زبان «پاسکال» بنا شده است و شرکت امبارکادرو (Embarcadero) در حال حاضر مسئولیت توسعه آن را بر عهده دارد.

ارسال پیامک (SMS) در زبان برنامه‌نویسی دلفی کاربردهای بسیار گسترده‌ای در دنیای نرم‌افزارهای تجاری و سازمانی دارد. از آنجا که دلفی در ایران به شدت برای نوشتن نرم‌افزارهای حسابداری، مدیریتی و سازمانی محبوب است، اتصال این نرم‌افزارها به سیستم پیامکی یک نیاز رایج است. از جمله این کاربرد ها می توان به موارد زیر اشاره کرد:

  • احراز هویت کاربران
  • اطلاع رسانی و اعلانات
  • بازاریابی و تبلیغات
  • سیستم های هوشمند و مانیتورینگ

پیاده‌سازی ارسال پیامک در دلفی:

در این راهنما توابع معادل برای ارسال OTP (پترن)، ارسال پیام به چند شماره (GET و POST)، دریافت وضعیت پیام‌ها و مشاهده اعتبار حساب با استفاده از وب‌سرویس REST ارائه شده است.

پیش‌نیازها

Delphi XE7 یا جدیدتر (برای استفاده از THTTPClient)؛ در نسخه‌های قدیمی‌تر می‌توان از Indy (TIdHTTP) استفاده کرد.

واحدهای مورد نیاز: System.Net.HttpClientSystem.Net.URLClientSystem.NetEncodingSystem.JSONSystem.SysUtilsSystem.Classes.

تنظیمات پایه

ابتدا مقادیر ApiKey، Sender و BaseUrl را در یک واحد مرکزی تعریف کنید (به‌عنوان ثابت یا متغیر سراسری)

unit SmsConfig;

interface

const
ApiKey  = 'YOUR_API_KEY';
Sender  = 'YOUR_SMS_SENDER';
BaseUrl = 'http://api.sms-webservice.com/api/V3/';

implementation

end;

توضیح: در تمام درخواست‌ها به “ApiKey” نیاز دارید، بنابراین آن را یک‌بار تعریف کنید. جهت دریافت این کلید API بصورت اختصاصی برای نرم افزار خود، باید ابتدا در سامانه پیام رسان ثبت نام کنید و طبق مراحل تصویری زیر، مقدار لازم را دریافت نمایید.

دریافت api key

۲) ارسال پیامک کد تایید (پترن OTP) — معادل “SendTokenSingle”

این متد در سرویس پیام‌رسان به‌صورت GET پیاده‌سازی شده است و پارامترهایی مانند “TemplateKey” و پارامترهای p1، p2، p3 را می‌گیرد.

uses
  System.SysUtils, System.Net.HttpClient, System.NetEncoding;

function SendTokenSingle(const TemplateKey, Destination, P1, P2, P3: string): string;
var
  Client: THTTPClient;
  Url, Params: string;
begin
  Client := THTTPClient.Create;
  try
    Params := Format('ApiKey=%s&TemplateKey=%s&Destination=%s&p1=%s&p2=%s&p3=%s',
      [TNetEncoding.URL.Encode(ApiKey), TNetEncoding.URL.Encode(TemplateKey),
       TNetEncoding.URL.Encode(Destination), TNetEncoding.URL.Encode(P1),
       TNetEncoding.URL.Encode(P2), TNetEncoding.URL.Encode(P3)]);

    Url := BaseUrl + 'SendTokenSingle?' + Params;
    Result := Client.Get(Url).ContentAsString(TEncoding.UTF8);
  finally
    Client.Free;
  end;
end;

مثال استفاده:

var
  resp: string;
begin
  resp := SendTokenSingle('MY_TEMPLATE_KEY', '09121234567', '1234', '', '');
  // resp حاوی پاسخ سرویس (معمولا JSON یا متن) است
end;

نکته: در سمت کلاینت، پس از دریافت پاسخ باید مقدار ارسال‌شده در قالب OTP را با مقدار ورودی کاربر اعتبارسنجی کنید.

۳) ارسال یک متن به چند شماره (GET) — معادل “Send”

نسخهٔ GET این متد می‌تواند تا 99 گیرنده را در یک فراخوانی پشتیبانی کند . در اینجا نمونه پیاده‌سازی با پارامتر “Recipients” به‌صورت رشته (مثلا جداشده با ویرگول) آورده شده است:

function Send_Get(const RecipientsCSV, TextMessage: string): string;
var
  Client: THTTPClient;
  Url, Params: string;
begin
  Client := THTTPClient.Create;
  try
    Params := Format('ApiKey=%s&Text=%s&Sender=%s&Recipients=%s',
      [TNetEncoding.URL.Encode(ApiKey),
       TNetEncoding.URL.Encode(TextMessage),
       TNetEncoding.URL.Encode(Sender),
       TNetEncoding.URL.Encode(RecipientsCSV)]);

    Url := BaseUrl + 'Send?' + Params;
    Result := Client.Get(Url).ContentAsString(TEncoding.UTF8);
  finally
    Client.Free;
  end;
end;

مثال استفاده:

var
  response: string;
begin
  response := Send_Get('09121234567,09129876543', 'سلام! این یک پیام تست است.');
end;

نکته: اگر تعداد گیرندگان بیش از 99 است، باید چندین درخواست ارسال کنید یا از متد “SendBulk” (POST JSON) استفاده کنید.

۴) ارسال گروهی با POST JSON — معادل “SendBulk”

نسخهٔ POST برای ارسال لیست گیرندگان با مشخصات هر گیرنده (مانند “UserTraceId”) استفاده می‌شود. خروجی JSON و ورودی JSON باید مشابه نمونهٔ PHP باشد.

uses
  System.JSON, System.Classes, System.Net.HttpClient, System.SysUtils;

function SendBulk(const DestinationArr, UserTraceIdArr: TArray; const TextMessage: string): string;
var
  Client: THTTPClient;
  JSONObj, RecipientObj: TJSONObject;
  RecipientsArr: TJSONArray;
  I: Integer;
  RequestBody: TStringStream;
begin
  Client := THTTPClient.Create;
  try
    JSONObj := TJSONObject.Create;
    RecipientsArr := TJSONArray.Create;
    try
      for I := 0 to Length(DestinationArr)-1 do
      begin
        RecipientObj := TJSONObject.Create;
        RecipientObj.AddPair('Destination', TJSONString.Create(DestinationArr[I]));
        if I <= High(UserTraceIdArr) then
          RecipientObj.AddPair('UserTraceId', TJSONString.Create(UserTraceIdArr[I]))
        else
          RecipientObj.AddPair('UserTraceId', TJSONString.Create(''));
        RecipientsArr.AddElement(RecipientObj);
      end;

      JSONObj.AddPair('ApiKey', TJSONString.Create(ApiKey));
      JSONObj.AddPair('Text', TJSONString.Create(TextMessage));
      JSONObj.AddPair('Sender', TJSONString.Create(Sender));
      JSONObj.AddPair('Recipients', RecipientsArr);

      RequestBody := TStringStream.Create(JSONObj.ToString, TEncoding.UTF8);
      try
        Result := Client.Post(BaseUrl + 'SendBulk', RequestBody, nil, [TNetHeader.Create('Content-Type', 'application/json')]).ContentAsString(TEncoding.UTF8);
      finally
        RequestBody.Free;
      end;
    except
      JSONObj.Free; // در صورت بروز خطا
      raise;
    end;
  finally
    Client.Free;
  end;
end;

مثالٔ ساخت آرایه‌ها و فراخوانی:

var
  dests, traces: TArray;
  resp: string;
begin
  dests := TArray.Create('09121234567','09129876543');
  traces := TArray.Create('order-123','order-124');
  resp := SendBulk(dests, traces, 'پیام گروهی تست');
end;

۵) دریافت وضعیت پیام‌ها — معادل “StatusById”

برای استعلام وضعیت یک یا چند پیام، سرویس یک متد POST JSON با پارامتر “Ids” ارائه می‌دهد.

function StatusById(const Ids: TArray): string;
var
  Client: THTTPClient;
  JSONObj: TJSONObject;
  IdsArr: TJSONArray;
  I: Integer;
  RequestBody: TStringStream;
begin
  Client := THTTPClient.Create;
  try
    JSONObj := TJSONObject.Create;
    IdsArr := TJSONArray.Create;
    try
      for I := 0 to High(Ids) do
        IdsArr.Add(Ids[I]);

      JSONObj.AddPair('ApiKey', TJSONString.Create(ApiKey));
      JSONObj.AddPair('Ids', IdsArr);

      RequestBody := TStringStream.Create(JSONObj.ToString, TEncoding.UTF8);
      try
        Result := Client.Post(BaseUrl + 'StatusById', RequestBody, nil, [TNetHeader.Create('Content-Type', 'application/json')]).ContentAsString(TEncoding.UTF8);
      finally
        RequestBody.Free;
      end;
    except
      JSONObj.Free;
      raise;
    end;
  finally
    Client.Free;
  end;
end;

نمونه فراخوانی:

var
  statusResp: string;
begin
  statusResp := StatusById(TArray.Create('12345','12346'));
end;

۶) دریافت اعتبار پنل — معادل “AccountInfo”

برای نمایش اعتبار پنل در اپلیکیشن می‌توان از متد “AccountInfo” استفاده کرد.

function AccountInfo: string;
var
  Client: THTTPClient;
  JSONObj: TJSONObject;
  RequestBody: TStringStream;
begin
  Client := THTTPClient.Create;
  try
    JSONObj := TJSONObject.Create;
    try
      JSONObj.AddPair('ApiKey', TJSONString.Create(ApiKey));

      RequestBody := TStringStream.Create(JSONObj.ToString, TEncoding.UTF8);
      try
        Result := Client.Post(BaseUrl + 'AccountInfo', RequestBody, nil, [TNetHeader.Create('Content-Type', 'application/json')]).ContentAsString(TEncoding.UTF8);
      finally
        RequestBody.Free;
      end;
    finally
      JSONObj.Free;
    end;
  finally
    Client.Free;
  end;
end;

نکات کاربردی و خطاگیری

همیشه پاسخ سرویس را (که معمولاً به‌صورت JSON است) پارس کنید (“TJSONObject.ParseJSONValue”) و خطاهای شبکه را مدیریت کنید.
برای امنیت، ApiKey را در متن کد قرار ندهید؛ بهتر است آن را در فایل تنظیمات رمزنگاری‌شده یا محیط اجرا نگهداری کنید.
در درخواست‌های GET طول URL ممکن است محدودیت داشته باشد؛ برای لیست طولانی گیرندگان از “SendBulk” (POST) استفاده کنید.
بررسی وضعیت HTTP و محتوای پاسخ (کد وضعیت، پیام خطا) کمک بزرگی در دیباگ می‌کند.

جایگزین: استفاده از Indy (TIdHTTP)

اگر از نسخه‌ای از Delphi استفاده می‌کنید که THTTPClient ندارد، می‌توانید از TIdHTTP استفاده کنید؛ ولی در نمونه بالا از THTTPClient استفاده شده که API ساده و مدرن‌تری دارد.

نمونهٔ کامل: ارسال OTP و بررسی پاسخ

یک نمونهٔ ساده که OTP را ارسال و خروجی را چاپ می‌کند:

procedure TestOTP;
var
  resp: string;
begin
  resp := SendTokenSingle('VERIFY_TEMPLATE', '09121234567', '5678', '', '');
  Writeln('Response: ' + resp);
end;

این مقاله مفید بود ؟

به این مقاله امتیاز دهید

میانگین رتبه 5 / 5. تعداد رای : 37

هنوز کسی به این مطلب رای نداده ؛ شما اولین نفر باشید !

تحریریه از پیام رسان

پیام رسان

مشتری همیشگی ما خواهید شد . قول میدهیم ! در سامانه پیامکی پیام رسان می توانید به افراد مورد نظر خود پیامک متنی و پیام صوتی ارسال کنید. با ثبت نام پنل رایگان پیام رسان، انواع امکانات جهت ارسال پیامک در اختیار کاربران قرار می گیرد.

ارسال کامنت

ثبت نام ورود