اتصال و ارسال پیامک از پنل پیامکی ویکی پیام (wikipayam) از طریق دایال پلن سیموتل

برای اتصال از طریق سیموتل به پنل پیامکی، پیش از هر کاری باید افزونه cURL برای PHP نصب گردد که با دستور زیر صورت میگیرد:

php -v
apt update && apt install -y php-curl
php -m | grep -i curl

اسکریپت پایین به‌عنوان AGI اجرا می‌شود؛ یعنی سیموتل هنگام رسیدن تماس به داخلی موردنظر، آن را صدا می‌زند و متغیرهای تماس (شماره تماس‌گیرنده، مقصد و غیره) را از طریق ورودی استاندارد (stdin) به آن می‌دهد. منطق تشخیص شماره مشتری:

  1. در تماس ورودی، شماره موبایل مشتری در متغیر agi_callerid قرار دارد.
  2. در تماس خروجی (وقتی داخلی به موبایل مشتری زنگ می‌زند)، شماره مشتری در متغیر agi_extension قرار دارد.
    اسکریپت هر دو منبع را بررسی می‌کند و اولین موردی که فرمت موبایل ایران (09XXXXXXXXX) داشته باشد را انتخاب می‌کند. شماره‌های داخلی و ثابت به‌طور خودکار فیلتر می‌شوند تا پیامک اشتباه ارسال نشود.

#!/usr/bin/php
<?php
// --- خواندن متغیرهای AGI ---
$agi = [];
while (($line = fgets(STDIN)) !== false) {
    $line = trim($line);
    if ($line === '') break;
    $parts = explode(':', $line, 2);
    if (count($parts) === 2) $agi[trim($parts[0])] = trim($parts[1]);
}

// --- شماره‌ی مشتری از آرگومان اول ---
$raw = $agi['agi_arg_1'] ?? '';

function normalize_mobile($raw) {
    $n = preg_replace('/\D/', '', $raw);
    if ($n === '') return null;
    if (strpos($n, '0098') === 0)   $n = '0' . substr($n, 4);
    elseif (strpos($n, '98') === 0) $n = '0' . substr($n, 2);
    elseif (strpos($n, '0') !== 0)  $n = '0' . $n;
    return preg_match('/^09\d{9}$/', $n) ? $n : null;
}

$number = normalize_mobile($raw);
if (!$number) {
    file_put_contents('/var/log/sendsms.log', date('c') . " skip raw=$raw\n", FILE_APPEND);
    exit(0);
}

// --- پیام ---
$message = <<<EOT
خط اول
خط دوم
خط سوم
EOT;

// --- ارسال ---
$url = 'https://wikipayam.ir/api/v1/sms/send';
$headers = [
    'Authorization: Bearer $TOKEN',
    'Accept: application/json',
    'Content-Type: application/json',
];

$payload = json_encode([[
    'sender'      => '$SMS-NUMBER',
    'receiver'    => $number,
    'message'     => $message,
    'track_id'    => 'CID_' . $number . '_' . time(),
    'mask_digits' => true,
]], JSON_UNESCAPED_UNICODE);

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);

$response = curl_exec($ch);
$error = curl_error($ch);
curl_close($ch);

پیام جهت ارسال در قسمت $message = <<<EOT
متن پیام
EOT;

برای $TOKEN باید توکن یکتا خود که از ویکی پیام دریافت میکنید را قرار دهید.

برای $SMS-NUMBER باید سرشماره ای که قرار است با آن پیامک ارسال کنید را قرار دهید.

اگر فایل را با ویرایشگری در ویندوز (مثل Notepad ساده) نوشته و ذخیره کرده باشید، انتهای هر خط دو کاراکتر نامرئی CR و LF دارد (CRLF)، در حالی‌که لینوکس فقط LF می‌خواهد. این باعث می‌شود خط (#!/usr/bin/php) درست خوانده نشود و فایل اصلاً اجرا نشود — بدون هیچ خطای مشخصی در لاگ.

برای اتصال به پنل پیامکی از طریق دایال پلن و ارسال پیامک از طریق دایال پلن، کامپوننت AGI را اضافه کرده و فایل ایجاد شده را در پنل آپلود میکنیم. سپس SAVE و سپس دایال پلن را SAVE میکنیم و در آخر رفرش میکنیم.
در ادامه هر مسیری که در دایال پلن به این کامپوننت AGI برسد، به شماره با فرمت 09XXXXXXXXX پیامک ارسال میشود.