Отправляем SMS.ru с удобством

02-08-2010

Было дело, проскакивала на хабре статься о сервисе sms.ru Попробовал, работает. Понравилось. Тогда на этом дело и закончилось. Но вот недавно потребовалось мне сделать отправку SMS подписавшимся клиентам. API на сайте сервиса хорошо документирован и приведены примеры, но не хватает удобства использования. В результате написал небольшой класс для взаимодействия с sms.ru.

 

Copy Source | Copy HTML
  1.  
  2. /**
     * Класс взаимодействия с сервисом sms.ru
     */
  3. class Z_Service_Sms {
  4.  
  5.     protected $_apiId = NULL;
  6.     protected $_responseCode = NULL;
  7.     protected $_lastAction = NULL;
  8.  
  9.     const HOST = 'http://sms.ru/';
  10.     const SEND = 'sms/send?';
  11.     const STATUS = 'sms/status?';
  12.     const BALANCE = 'my/balance?';
  13.     const LIMIT = 'my/limit?';
  14.  
  15.     protected $_responseCodeTranstale = array(
  16.         'send' => array(
  17.             '100' => 'Сообщение принято к отправке',
  18.             '200' => 'Неправильный api_id',
  19.             '201' => 'Не хватает средств на лицевом счету',
  20.             '202' => 'Неправильно указан получатель',
  21.             '203' => 'Нет текста сообщения',
  22.             '204' => 'Имя отправителя не согласовано с администрацией',
  23.             '205' => 'Сообщение слишком длинное (превышает 5 СМС)',
  24.             '206' => 'Превышен дневной лимит на отправку сообщений',
  25.             '207' => 'На этот номер нельзя отправлять сообщения',
  26.             '208' => 'Параметр time указан неправильно',
  27.             '210' => 'Используется GET, где необходимо использовать POST',
  28.             '211' => 'Метод не найден',
  29.             '220' => 'Сервис временно недоступен, попробуйте чуть позже.',
  30.         ),
  31.         'status' => array(
  32.             '-1' => 'Сообщение не найдено',
  33.             '100' => 'Сообщение находится в очереди',
  34.             '101' => 'Сообщение передается оператору',
  35.             '102' => 'Сообщение отправлено (в пути)',
  36.             '103' => 'Сообщение доставлено',
  37.             '104' => 'Не может быть доставлено: время жизни истекло',
  38.             '105' => 'Не может быть доставлено: удалено оператором',
  39.             '106' => 'Не может быть доставлено: сбой в телефоне',
  40.             '107' => 'Не может быть доставлено: неизвестная причина',
  41.             '108' => 'Не может быть доставлено: отклонено',
  42.             '200' => 'Неправильный api_id',
  43.             '210' => 'Используется GET, где необходимо использовать POST',
  44.             '211' => 'Метод не найден',
  45.             '220' => 'Сервис временно недоступен, попробуйте чуть позже',
  46.         ),
  47.         'balance' => array(
  48.             '100' => 'Запрос выполнен',
  49.             '200' => 'Неправильный api_id',
  50.             '210' => 'Используется GET, где необходимо использовать POST',
  51.             '211' => 'Метод не найден',
  52.             '220' => 'Сервис временно недоступен, попробуйте чуть позже.',
  53.         ),
  54.         'limit' => array(
  55.             '100' => 'Запрос выполнен',
  56.             '200' => 'Неправильный api_id',
  57.             '210' => 'Используется GET, где необходимо использовать POST',
  58.             '211' => 'Метод не найден',
  59.             '220' => 'Сервис временно недоступен, попробуйте чуть позже.',
  60.         ),
  61.     );
  62.  
  63.     /**
         *
         * Идентификатор api_id
         * @param string $id
         */
  64.     public function __construct($id)
  65.     {
  66.         $this->_apiId = $id;
  67.     }
  68.  
  69.     /**
         *
         * @param string $to телефон: 11 знаков. например 79060000000
         * @param string $text текст сообщение
         * @param string $from отправитель
         * @return string id сообщения
         */
  70.     public function send($to,$text,$from=NULL)
  71.     {
  72.         $apiParams['api_id'] = $this->_apiId;
  73.         $apiParams['to'] = $to;
  74.         $apiParams['text'] = $text;
  75.         if ($from)
  76.             $apiParams['from'] = $from;
  77.         $url = self::HOST.self::SEND.http_build_query($apiParams);;
  78.         $body = file_get_contents($url);
  79.         @list($code,$smsId) = explode("\n", $body);
  80.         $this->_lastAction = 'send';
  81.         $this->_responseCode = $code;
  82.         return $smsId;
  83.     }
  84.  
  85.     /**
         *
         * @param string $id id сообщения
         * @return string код статуса сообщения.
         */
  86.     public function status($id)
  87.     {
  88.         $apiParams['api_id'] = $this->_apiId;
  89.         $apiParams['id'] = $id;
  90.         $url = self::HOST.self::STATUS.http_build_query($apiParams);
  91.         $body = file_get_contents($url);
  92.         $status = $body;
  93.         $this->_lastAction = 'status';
  94.         $this->_responseCode = $status;
  95.         return $status;
  96.     }
  97.  
  98.     /**
         *
         * @return string Баланс в рублях
         */
  99.     public function balance()
  100.     {
  101.         $apiParams['api_id'] = $this->_apiId;
  102.         $url = self::HOST.self::BALANCE.http_build_query($apiParams);
  103.         $body = file_get_contents($url);
  104.         @list($code,$balance) = explode("\n", $body);
  105.         $this->_lastAction = 'balance';
  106.         $this->_responseCode = $code;
  107.         return $balance;
  108.     }
  109.  
  110.     /**
         *
         * @return int количество оставшихся сообщений
         */
  111.     public function limit()
  112.     {
  113.         $apiParams['api_id'] = $this->_apiId;
  114.         $url = self::HOST.self::LIMIT.http_build_query($apiParams);
  115.         $body = file_get_contents($url);
  116.         @list($code,$count,$limit) = explode("\n", $body);
  117.         $this->_lastAction = 'limit';
  118.         $this->_responseCode = $code;
  119.         return (int)($count - $limit);
  120.     }
  121.  
  122.  
  123.     /**
         *
         * @return string код результата выполнения последней операции
         */
  124.     public function getResponseCode()
  125.     {
  126.         return $this->_responseCode;
  127.     }
  128.  
  129.     /**
         *
         * @return string расшифровка кода результата выполнения последней операции
         */
  130.     public function getResponseMessage()
  131.     {
  132.         if ($this->_lastAction)
  133.             return $this->_responseCodeTranstale[$this->_lastAction][$this->getResponseCode()];
  134.         else
  135.             return 'Нет данных для возврата сообщения';
  136.     }
  137.  
  138. }
  139.  

Прошу пользоваться и давать советы по улучшению.

Вернуться в блог

Оставить комментарий