sms_rangine-8.x-1.2/src/Plugin/SmsGateway/RangineGateway.php
src/Plugin/SmsGateway/RangineGateway.php
<?php
namespace Drupal\sms_rangine\Plugin\SmsGateway;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use GuzzleHttp\ClientInterface;
use GuzzleHttp\Exception\RequestException;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Drupal\sms\Plugin\SmsGatewayPluginBase;
use Drupal\sms\Message\SmsDeliveryReport;
use Drupal\sms\Message\SmsMessageInterface;
use Drupal\sms\Message\SmsMessageResult;
use Drupal\sms\Message\SmsMessageReportStatus;
use Drupal\sms\Message\SmsMessageResultStatus;
/**
* @SmsGateway(
* id = "rangine",
* label = "Rangine",
* outgoing_message_max_recipients = 1,
* reports_pull = TRUE,
* reports_push = TRUE,
* )
*/
class RangineGateway extends SmsGatewayPluginBase implements ContainerFactoryPluginInterface {
/**
* The HTTP client.
*
* @var \GuzzleHttp\ClientInterface
*/
protected $httpClient;
/**
* Map Messente status codes to sms framework compatible ones
*
* @var array
*/
protected static $statusMap = [
'DELIVRD' => SmsMessageReportStatus::DELIVERED,
'UNDELIV' => SmsMessageReportStatus::REJECTED,
'FAILED' => SmsMessageReportStatus::REJECTED,
'UNKNOWN' => SmsMessageReportStatus::ERROR,
'ACCEPTD' => SmsMessageReportStatus::QUEUED,
'REJECTD' => SmsMessageReportStatus::REJECTED,
'DELETED' => SmsMessageReportStatus::EXPIRED,
'EXPIRED' => SmsMessageReportStatus::EXPIRED,
'NACK' => SmsMessageReportStatus::REJECTED,
];
/**
* Constructs a new Rangine instance.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \GuzzleHttp\ClientInterface $http_client
* The HTTP client.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition, ClientInterface $http_client) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->httpClient = $http_client;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('http_client')
);
}
/**
* {@inheritdoc}
*/
public function defaultConfiguration() {
return [
'user' => '',
'pass' => '',
'sender' => '',
'confirm' => 'A SMS has sent from site to {number} and will achieve to phone in 3 minute if ther is no problem in communication or the phone is not off.',
'host' => 'sms.rangine.ir',
];
}
/**
* {@inheritdoc}
*/
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form = parent::buildConfigurationForm($form, $form_state);
$config = $this->getConfiguration();
$form['rangine'] = [
'#type' => 'details',
'#title' => 'Rangine',
'#open' => TRUE,
];
$form['rangine']['user'] = [
'#type' => 'textfield',
'#title' => $this->t('User Name'),
'#default_value' => $config['user'],
'#required' => TRUE,
'#description' => $this->t('Your user name in Rangine SMS Service.'),
];
$form['rangine']['pass'] = [
'#type' => 'textfield',
'#title' => $this->t('Password'),
'#default_value' => $config['pass'],
'#required' => TRUE,
'#description' => $this->t('Your current password in Rangine SMS service. <b>Note:</b> Change it when you change your password in rangine SMS service'),
];
$form['rangine']['sender'] = [
'#type' => 'textfield',
'#title' => $this->t('Sender'),
'#default_value' => $config['sender'],
'#required' => TRUE,
'#description' => $this->t('Input one of your active SMS line number.'),
];
$form['rangine']['confirm'] = [
'#type' => 'textfield',
'#title' => $this->t('Confirm Message'),
'#default_value' => $config['confirm'],
'#required' => TRUE,
'#description' => $this->t('This message will be shown after successful SMS sending. Use "{number}" for insert number in the message.'),
];
$form['rangine']['host'] = [
'#type' => 'textfield',
'#title' => $this->t('Rangine Api IP'),
'#default_value' => $config['host'],
'#required' => TRUE,
'#description' => $this->t('If checked send nothing but show the message that will be send if this was unchecked!.'),
];
$form['rangine']['debug'] = [
'#type' => 'checkbox',
'#title' => $this->t('Debug Mode'),
'#default_value' => $config['debug'],
'#description' => $this->t('If checked send nothing but show the message that will be send if this was unchecked!.'),
];
return $form;
}
/**
* {@inheritdoc}
*/
public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
$this->configuration['user'] = trim($form_state->getValue('user'));
$this->configuration['pass'] = trim($form_state->getValue('pass'));
$this->configuration['sender'] = trim($form_state->getValue('sender'));
$this->configuration['confirm'] = trim($form_state->getValue('confirm'));
$this->configuration['host'] = trim($form_state->getValue('host'));
$this->configuration['debug'] = trim($form_state->getValue('debug'));
}
/**
* {@inheritdoc}
*/
public function send(SmsMessageInterface $sms_message) {
$result = new SmsMessageResult();
$report = new SmsDeliveryReport();
$param = array(
'uname' => $this->configuration['user'],
'pass' => $this->configuration['pass'],
'from' => $this->configuration['sender'],
'message' => $sms_message->getMessage(),
'to' => json_encode($sms_message->getRecipients()),
'op' => 'send',
);
if(isset($this->configuration['debug'])) $debug= $this->configuration['debug']; else $debug = false;
try {
$massage = str_replace('pcode:','patterncode:',strip_tags(trim($param['message'])));
if (substr($massage, 0, 11 ) === "patterncode"){ //if send by pattern
$massage = str_replace("\r\n",";",$massage);
$massage = str_replace("\n",";",$massage);
$splited = explode(';', $massage);
$patterncodeArray = explode(':', $splited[0]);
$patterncode = trim($patterncodeArray[1]);
unset($splited[0]);
$input_data = array();
foreach($splited as $parm){
$splited_parm = explode(':', $parm, 2);
$input_data[$splited_parm[0]] = trim($splited_parm[1]);
}
if (!$debug){ //if debug is off
$user = $param['uname'];
$pass = $param['pass'];
$fromNum = $param['from'];
$toNum = $param['to'];
$url = $this->configuration['host']."/patterns/pattern?username=".$user."&password=".urlencode($pass)."&from=".$fromNum."&to=".$toNum."&input_data=".urlencode(json_encode($input_data))."&pattern_code=".$patterncode;
$response = $this->cUrl( $url, array(), 'GET' );
$responseArray = json_decode($response);
if (is_array($responseArray)) {
$res_code = $responseArray[0];
$res_data = $responseArray[1];
$report->setStatusMessage('Sending message failed with error code: '.$res_code.' - '.$this->getErrors($res_code));
$report->setStatus(SmsMessageReportStatus::ERROR);
} else {
$report->setStatus(SmsMessageReportStatus::QUEUED);
$report->setMessageId($response);
$report->setStatusMessage('Message sent: '.$param['message']);
}
// if the gateway is in debug mode.
}else {
//TODO: Only show status massage.
}
$report->setRecipient($sms_message->getRecipients()[0]);
$result->addReport($report);
return $result;
}else{ // normal send
$url = $this->configuration['host'].'/services.jspd';
$response = $this->cUrl( $url, $param, 'POST' );
$responseArray = json_decode($response);
$res_code = $responseArray[0];
$res_data = $responseArray[1];
// Check if the sms delivery request was successful
if($res_code == 0){
$report->setStatus(SmsMessageReportStatus::QUEUED);
$report->setMessageId((string)$res_data);
$report->setStatusMessage('Message sent: '.$param['message']);
} else {
$report->setStatus(SmsMessageReportStatus::ERROR);
$report->setStatusMessage('Sending message failed with error code: '.$res_code.' - '.$this->getErrors($res_code));
}
$report->setRecipient($sms_message->getRecipients()[0]);
$result->addReport($report);
return $result;
}
} catch (RequestException $e) {
$report->setStatus(SmsMessageReportStatus::ERROR);
$report->setStatusMessage($e->getMessage());
return $result
->addReport($report)
->setError(SmsMessageResultStatus::ERROR)
->setErrorMessage('The request failed for some reason.');
}
}
private function cUrl( $url, $params = array() , $method = 'POST' ) {
$handler = curl_init($url);
curl_setopt($handler, CURLOPT_CONNECTTIMEOUT, 20);
curl_setopt($handler, CURLOPT_TIMEOUT, 25);
curl_setopt($handler, CURLOPT_CUSTOMREQUEST, $method);
if($method == 'POST') curl_setopt($handler, CURLOPT_POSTFIELDS, $params);
curl_setopt($handler, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($handler);
if (curl_errno($handler)) {
$result = curl_error($handler);
return json_encode(array('-1',$result));
}
return $result;
}
private function getErrors($error){
$errorCodes = array(
'-1' => 'ارتباط با سامانه پیامک انجام نشد.',
'0' => 'عملیات با موفقیت انجام شده است.',
'1' => 'متن پیام خالی می باشد.',
'2' => 'کاربر محدود گردیده است.',
'3' => 'خط به شما تعلق ندارد.',
'4' => 'گیرندگان خالی است.',
'5' => 'اعتبار کافی نیست.',
'7' => 'خط مورد نظر برای ارسال انبوه مناسب نمیباشد.',
'9' => 'خط مورد نظر در این ساعت امکان ارسال ندارد. برای ارسال پیامک در ۲۴ ساعت شبانه روز از وب سرویس پترن استفاده نمایید',
'98' => 'حداکثر تعداد گیرنده رعایت نشدهه است.',
'99' => 'اپراتور خط ارسالی قطع می باشد.',
'21' => 'پسوند فایل صوتی نامعتبر است.',
'22' => 'سایز فایل صوتی نامعتبر است.',
'23' => 'تعداد تالش در پیام صوتی نامعتبر است.',
'100' => 'شماره مخاطب دفترچه تلفن نامعتبر می باشد.',
'101' => 'شماره مخاطب در دفترچه تلفن وجود دارد.',
'102' => 'شماره مخاطب با موفقیت در دفترچه تلفن ذخیره گردید.',
'111' => 'حداکثر تعداد گیرنده برای ارسال پیام صوتی رعایت نشده است.',
'131' => 'تعداد تالش در پیام صوتی باید یکبار باشد.',
'132' => 'آدرس فایل صوتی وارد نگردیده است.',
'301' => 'از حرف ویژه در نام کاربری استفاده گردیده است.',
'302' => 'قیمت گذاری انجام نگریدهه است.',
'303' => 'نام کاربری وارد نگردیده است.',
'304' => 'نام کاربری قبال انتخاب گردیده است.',
'305' => 'نام کاربری وارد نگردیده است.',
'306' => 'کد ملی وارد نگردیده است.',
'307' => 'کد ملی به خطا وارد شده است.',
'308' => 'شماره شناسنامه نا معتبر است.',
'309' => 'شماره شناسنامه وارد نگردیده است.',
'310' => 'ایمیل کاربر وارد نگردیده است.',
'311' => 'شماره تلفن وارد نگردیده است.',
'312' => 'تلفن به درستی وارد نگردیده است.',
'313' => 'آدرس شما وارد نگردیده است.',
'314' => 'شماره موبایل را وارد نکرده اید.',
'315' => 'شماره موبایل به نادرستی وارد گردیده است.',
'316' => 'سطح دسترسی به نادرستی وارد گردیده است.',
'317' => 'کلمه عبور وارد نگردیده است.',
'455' => 'ارسال در آینده برای کد بالک ارسالی لغو شد.',
'456' => 'کد بالک ارسالی نامعتبر است.',
'458' => 'کد تیکت نامعتبر است.',
'964' => 'شما دسترسی نمایندگی ندارید.',
'962' => 'نام کاربری یا کلمه عبور نادرست می باشد.',
'963' => 'دسترسی نامعتبر می باشد.',
'971' => 'پترن ارسالی نامعتبر است.',
'970' => 'پارامتر های ارسالی برای پترن نامعتبر است.',
'972' => 'دریافت کننده برای ارسال پترن نامعتبر می باشد.',
'992' => 'ارسال پیام از ساعت 8 تا 23 می باشد. برای ارسال پیامک در ۲۴ ساعت شبانه روز از وب سرویس پترن استفاده نمایید',
'993' => 'دفترچه تلفن باید یک آرایه باشد',
'994' => 'لطفا تصویری از کارت بانکی خود را از منو مدارک ارسال کنید',
'995' => 'جهت ارسال با خطوط اشتراکی سامانه، لطفا شماره کارت بانکیه خود را به دلیل تکمیل فرایند احراز هویت از بخش ارسال مدارک ثبت نمایید.',
'996' => 'پترن فعال نیست.',
'997' => 'شما اجازه ارسال از این پترن را ندارید.ه',
'998' => 'کارت ملی یا کارت بانکی شما تایید نشده است.',
'1001' => 'فرمت نام کاربری درست نمی باشد)حداقله ۵ کاراکتر، فقط حروف و اعداد(.',
'1002' => 'گذر واژه خیلی ساده می باشد)حداقل ۸ کاراکتر بوده و نام کاربری،',
'ایمی' => ' و شماره موبایل در آن وجود نداشته باشد(.',
'1003' => 'مشکل در ثبت، با پشتیبانی تماس بگیرید.',
'1004' => 'مشکل در ثبت، با پشتیبانی تماس بگیرید.',
'1005' => 'مشکل در ثبت، با پشتیبانی تماس بگیرید.',
'1006' => 'تاریخ ارسال پیام برای گذشته می باشد، لطفا تاریخ ارسال پیام را به درستی وارد نمایید.ه',
);
return (isset($errorCodes[$error])) ? $errorCodes[$error] : 'اشکال تعریف نشده با کد :' . $error;
}
}
