PHP SMS Sendler

Это упрощенная клиентская библиотека SMPP для отправки или получения sms через SMPP v3.4 .
В дополнение к клиенту, эта библиотека также содержит кодировщик для преобразования текста UTF-8 в кодировку GSM 03.38 и оболочку сокета. Оболочка сокета предоставляет пул соединений, IPv6 и функции контроля таймаута поверх расширения сокета PHP.
Этот lib значительно изменился с первого выпуска, который потребовал пространства имен и включил некоторые рабочие компоненты. Вы найдете этот выпуск на 1.0.1-namespaced
Эта библиотека требует сокетов PHP-расширения и не поддерживается в Windows. Окна-совместимая версия также доступна.

Основной пример использования

Чтобы отправить SMS, вы можете:
<? PHP
require_once  ' smppclient.class.php ' ; 
require_once  ' gsmencoder.class.php ' ; 
require_once  ' sockettransport.class.php ' ;

// Конструкция транспорта и клиента 
$ transport  =  новый  SocketTransport ( массив ( ' smpp.provider.com ' ), 2775 ); 
$ transport -> setRecvTimeout ( 10000 ); 
$ smpp  =  новый  SmppClient ( $ transport );

// Активация двоичного шестнадцатеричного вывода взаимодействия с сервером 
$ smpp -> debug  =  true ; 
$ transport -> debug  =  true ;

// Открыть соединение 
$ transport -> open (); 
$ smpp -> bindTransmitter ( " USERNAME " , " PASSWORD " );

// Необязательные связанные с подключением переопределения 
// SmppClient :: $ sms_null_terminate_octetstrings = false; 
// SmppClient :: $ csms_method = SmppClient :: CSMS_PAYLOAD; 
// SmppClient :: $ sms_registered_delivery_flag = SMPP :: REG_DELIVERY_SMSC_BOTH;

// Подготовить сообщение 
$ message  =  ' H € llo world ' ; 
$ encodedMessage  =  GsmEncoder :: utf8_to_gsm0338 ( $ message ); 
$ from  =  new  SmppAddress ( « SMPP Test » , SMPP :: TON_ALPHANUMERIC ); 
$ to  =  new  SmppAddress ( 4512345678 , SMPP :: TON_INTERNATIONAL , SMPP :: NPI_E164 );

// Отправить 
$ smpp -> sendSMS ( $ from , $ to , $ encodedMessage , $ tags );

// Закрытие соединения 
$ smpp -> close ();
Получить SMS (или квитанцию о доставке):
<? PHP
require_once  ' smppclient.class.php ' ; 
require_once  ' sockettransport.class.php ' ;

// Конструкция транспорта и клиента 
$ transport  =  новый  SocketTransport ( массив ( ' smpp.provider.com ' ), 3600 ); 
$ transport -> setRecvTimeout ( 60000 ); // для этого примера подождите до 60 секунд для данных 
$ smpp  =  new  SmppClient ( $ transport );

// Активация двоичного шестнадцатеричного вывода взаимодействия с сервером 
$ smpp -> debug  =  true ; 
$ transport -> debug  =  true ;

// Открыть соединение 
$ transport -> open (); 
$ smpp -> bindReceiver ( " USERNAME " , " PASSWORD " );

// Чтение SMS и вывод 
$ sms  =  $ smpp -> readSMS (); 
echo  " SMS: \ n " ; 
var_dump ( $ sms );

// Закрытие соединения 
$ smpp -> close ();

Пулы подключений

Вы можете указать список подключений, чтобы каждая попытка SocketTransport выполнялась последовательно или случайным образом. Кроме того, если вы дадите ему имя хоста с несколькими записями A / AAAA, он попробует каждый из них. Если вы хотите отслеживать поиск DNS, установите для параметра defaultDebug значение true перед конструированием транспорта.
Тайм-аут отправки (настраиваемый) определяет, как долго он будет ждать таймаута каждого сервера. В зависимости от таймаута может потребоваться много времени, чтобы попробовать длинный список серверов. Вы можете изменить таймаут как до, так и после попытки подключения.
Транспорт поддерживает IPv6 и предпочитает IPv6-адреса по IPv4, когда они доступны. Вы можете изменить эту функцию, установив forceIpv6 или forceIpv4, чтобы заставить ее использовать только IPv6 или IPv4.
В дополнение к поисковым запросам DNS он также ищет локальные адреса IPv4 с помощью gethostbyname (), поэтому «localhost» работает для IPv4. Для IPv6 localhost укажите «:: 1».

Замечания по реализации

  • Вы не можете подключиться в качестве трансивера, в противном случае поддерживается SMPP v.3.4
  • Операция SUBMIT_MULTI SMPP, которая отправляет SMS в список получателей, не поддерживается atm. Вы можете легко добавить его, хотя.
  • Сокеты вернут false, если таймаут достигнут при чтении () (но не readAll или записи). Вы можете использовать эту функцию для реализации политики enquire_link. Если вам нужно отправить enquire_link каждые 30 секунд бездействия, установите тайм-аут в 30 секунд и отправьте команду enquire_link после того, как readSMS () вернет false.
  • В приведенных выше примерах предполагается, что стандартное datacoding для SMSC является GSM 03.38 .
  • Не забудьте активировать зарегистрированную доставку, если вам нужны квитанции о доставке (установлены на SMPP :: REG_DELIVERY_SMSC_BOTH / 0x01).
  • Оба компонента SmppClient и транспортные компоненты поддерживают обратный вызов отладки, который по умолчанию является error_log . Используйте это для перенаправления отладочной информации.

Часто задаваемые вопросы

Могу ли я использовать это для отправки сообщений с моего сайта? 
Не по себе, нет. После того как PHP обрабатывает запрос на веб-сайте, он закрывает все подключения. Большинство поставщиков SMPP не хотят, чтобы вы открывали и закрывали соединения, вы должны сохранять их в живых и периодически отправлять команды enquire_link. Это означает, что вам, вероятно, потребуется какой-то долговременный процесс, т.е. используя функции управления процессом и реализуя форму системы очередей, которую вы можете нажать с веб-сайта. Для этого требуется доступ к серверу на уровне оболочки и знание процессов unix.
Как получить квитанции о доставке или SMS? 
Чтобы получить квитанцию о доставке или SMS, вы должны подключить приемник в дополнение к передатчику. Этот приемник должен ждать получения квитанции о доставке, что означает, что вам, вероятно, необходимо использовать функции управления процессом .
У нас есть реализация с открытым исходным кодом у php-smpp-worker, на которую вы можете смотреть на вдохновение, но мы не можем помочь вам создать свой собственный. Возможно, вам стоит изучить, может ли ваш провайдер SMSC предоставить вам API на основе HTTP или использовать программное обеспечение под ключ, такое как kannel , этот проект обеспечивает только реализацию протокола и базовую оболочку.
Я не могу отправить более 160 символов.
Есть три встроенных метода отправки Concatenated SMS (csms); CSMS_16BIT_TAGS, CSMS_PAYLOAD, CSMS_8BIT_UDH. CSMS_16BIT_TAGS по умолчанию, если он не работает, попробуйте другой.
Является ли это lib совместимым с PHP 5.2.x? 
Он протестирован на PHP 5.3, но, как известно, также работает с 5.2.
Может ли он работать на окнах? 
Для этого требуется расширение сокетов, которое доступно в окнах, но является неполным. Вместо этого используйте версию, совместимую с окнами , которая использует функции fsockopen и stream.
Почему я не вижу выхода отладки? 
Не забудьте реализовать обратный вызов отладки для SocketTransport и SmppClient для использования. В противном случае они по умолчанию выдают error_log,который может или не может печатать на экране.
Почему я получаю «res_nsend () failed» или «Не удалось подключиться к ошибкам указанных узлов»? 
Вероятно, DNS-сервер вашего провайдера имеет проблемы с адресами IPv6 (записи AAAA). Попробуйте установить SocketTransport::$forceIpv4=true;. Вы также можете попробовать указать IP-адрес (или список IP-адресов). Настройка SocketTransport:$defaultDebug=true;перед конструированием транспорта также полезна при решении проблем подключения.
Я пытался заставить IPv4 и / или указывать IP-адрес, но я все еще получаю сообщение «Не удалось подключиться к любому из указанных хостов»? 
Это проблема межсетевого экрана, которая предотвращает ваше соединение или что-то еще. Убедитесь, что вывод отладки включен и отображается. Если вы видите что-то вроде «Socket connect to 1.2.3.4:2775 failed; «Истекло время ожидания» означает, что соединение не может быть установлено. Если это не проблема с брандмауэром, попробуйте увеличить время ожидания подключения. SendTimeout также определяет тайм-аут подключения, $transport->setSendTimeout(10000);чтобы установить 10-секундный тайм-аут.
Почему я получаю сообщение «Не удалось прочитать ответ на команду: 0x4», «Длина сообщения недействительна» или «Ошибка в необязательной части»? 
Скорее всего, ваш провайдер SMPP не поддерживает NULL-завершение поля сообщения. Спецификации не ясны по этой проблеме, поэтому есть переключатель. Установите SmppClient::$sms_null_terminate_octetstrings = false;и повторите попытку.
Что означает «Bind Failed»? 
Обычно это означает, что ваш поставщик SMPP отклонил ваши учетные данные, т. Е. ваше имя пользователя или пароль.
Можно ли протестировать клиентскую библиотеку без сервера SMPP? 
Многие поставщики услуг могут предоставить вам демонстрационную учетную запись, но вы также можете использовать утилиту logica opensmpp simulator (java) или smsforum client test tool (linux binary). В дополнение к ряду реальных серверов SMPP эта библиотека протестирована против этих симуляторов.
У меня есть проблема, которая не упоминается здесь, что мне делать? 
Получите полную отладочную информацию и откройте проблему здесь, на github. Не включайте шестнадцатеричные коды Send PDU для вызова BindTransmitter, так как он будет содержать ваше имя пользователя и пароль. Другой шестиступенчатый выход является прекрасным и сильно обдуманным. Любые предупреждения или уведомления о PHP также могут быть важными. Пожалуйста, укажите информацию о том, к чему подключен SMPP-сервер, и какие-либо особенности.скачать dle 11.3

Комментарии 1

Garik от 25 ноября 2018 08:17
Пример реализации отправки sms через протокол SMPP v 3.4

?https://infostart.ru/public/319296/???

Добавить комментарий

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