cUrl и API

Главные вкладки

Аватар пользователя mu_vi mu_vi 24 июня 2015 в 9:42

Доброе утро всем. Недавно закончил создание простенького модуля отправки смс, где функция отправки смс цеплялась на submit пользовательских форм, как дополнительный callback для модуля WebForms.

Проблема состоит в том, что смс отправляются нормально, но только во время тестирования написанного мной модуля. После того как пройдет немного времени, смс не отправляются. Может кто то сталкивался с этой проблемой. В какую сторону мне смотреть? Что делать? Я предполагаю, что это кэш, хотя не уверен. Спасибо.

Дополнительно:

  1. кэширование CMS отключено
  2. использую API сервиса SMSFly
  3. запрос к серверу сервиса производится по средством curl

Комментарии

Аватар пользователя t1mm1 t1mm1 24 июня 2015 в 11:09

Если курл работает, то с этой частью все ок.
Сделайте через watchdog запись того, что отправляете, и того что принимаете + добавьте обработку исключений через try {...}.
Возможно, наличие кавычек как минимум, и как максимум не стабильный коннект (таймаут).
Но без логов не о чем даже говорить, так как может быть все что угодно.

Лично я склоняюсь к таймауту (если то работает, то нет).
Курлу все равно, есть кеширование или нет. Разве только если вы не отправляете смс из формы, которая и кешируется (но и при этом не должна, так как токен для формы динамичен).

Аватар пользователя mu_vi mu_vi 24 июня 2015 в 11:27

t1mm1 wrote:
Если курл работает, то с этой частью все ок.
Сделайте через watchdog запись того, что отправляете, и того что принимаете + добавьте обработку исключений через try {...}.
Возможно, наличие кавычек как минимум, и как максимум не стабильный коннект (таймаут).
Но без логов не о чем даже говорить, так как может быть все что угодно.

Лично я склоняюсь к таймауту (если то работает, то нет).
Курлу все равно, есть кеширование или нет. Разве только если вы не отправляете смс из формы, которая и кешируется (но и при этом не должна, так как токен для формы динамичен).

Настроил логирование. Немного позже отпишу, что получаю от сервиса на выходе.

Аватар пользователя t1mm1 t1mm1 24 июня 2015 в 12:05

+ вспомнил.
я сталкивался вот еще с чем на подобных сервисах. Это ограничение на размер передаваемого текста. Если оно больше разрешенного, будет возвращать ошибку. Проверьте и это.
Так как если у вас то оправляет, то нет, то возможно, где-то кривит валидация.

Аватар пользователя Orion76 Orion76 24 июня 2015 в 11:33

Полностью согласен с предыдущими ораторами-)

Расставте в "контрольных" точках отправку отладочных сообщений в журнал Drupal (фуникция watchdog()).

Прямо с момента добавления callback в форму webform, до получения ответа от сервиса.

И сразу станет все понятно..

Аватар пользователя Chyvakoff Chyvakoff 24 июня 2015 в 13:58

"mu_vi" wrote:
Проверил. В логи ничего не попадает.

До запроса курлом добавь логирование. Может до курла вообще дело не доходит.

Аватар пользователя Orion76 Orion76 24 июня 2015 в 14:43

"mu_vi" wrote:

Проверил. В логи ничего не попадает


В код модуля в нужных местах вставте отправку отладочного сообщения в лог:

<?php
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 1');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 2');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 3');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 4');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 5');
// ... какой-то код ...
?>

Потом уже смотрите логи, какие "шаги" не отрабатывыают.

Аватар пользователя mu_vi mu_vi 24 июня 2015 в 16:11

orion76 wrote:
"mu_vi" wrote:

Проверил. В логи ничего не попадает


В код модуля в нужных местах вставте отправку отладочного сообщения в лог:

<?php
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 1');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 2');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 3');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 4');
// ... какой-то код ...
watchdog('CMC_debug','ШАГ 5');
// ... какой-то код ...
?>

Потом уже смотрите логи, какие "шаги" не отрабатывыают.

Хорошо. Сейчас попробую. Опишу что было.

Аватар пользователя mu_vi mu_vi 25 июня 2015 в 9:27

Вот, что получается. Такое ощущение, что функция которую я прикрепил на обработчик формы не срабатывает. Логирование по шагам не работает вовсе. Что подскажете сделать?

Аватар пользователя Chyvakoff Chyvakoff 25 июня 2015 в 10:14

"mu_vi" wrote:
Такое ощущение, что функция которую я прикрепил на обработчик формы не срабатывает.

Как прикрепляли? Код.

Аватар пользователя Orion76 Orion76 25 июня 2015 в 10:37

"mu_vi" wrote:
функция отправки смс цеплялась на submit пользовательских форм

Имя и код хука, в котором колбэк к сабмиту "цепляли"..

Аватар пользователя mu_vi mu_vi 25 июня 2015 в 11:15

orion76 wrote:
"mu_vi" wrote:
функция отправки смс цеплялась на submit пользовательских форм

Имя и код хука, в котором колбэк к сабмиту "цепляли"..

"themes_form_alter" в $form['#submit']

Аватар пользователя t1mm1 t1mm1 25 июня 2015 в 13:02

Я так понимаю, у вас сабмит вообще не там, где нужно.
Подозреваю, что определяя альтер для формы через ее айди - вы не учитываете, что этот айди по какой либо причине мог меняться (как предположение), если он не указан явно.

+
Не делайте так альтер. Делайте его через явный form_id. Если, конечно, я вас правильно понимаю.

У вас ошибка не в работе отправки смс, а в том, что не корректно прикреплен сабмит.

Аватар пользователя mu_vi mu_vi 25 июня 2015 в 14:45

Chyvakoff wrote:
"mu_vi" wrote:
"themes_form_alter"

модуль называется themes?
Где вы хук определяете?

function webform_sms_form_alter(&$form, &$form_state, $form_id) {
....
}

Аватар пользователя mu_vi mu_vi 25 июня 2015 в 15:40

t1mm1 wrote:
webform_sms - это модуль.

ну а сама функция внутри?

Да модуль.

Вот исходники.

<?php
function webform_sms_send($form, &$form_state){
        
        
        
$message 'Заказ с номера: ';        
        
$message .= $form_state['values']['submitted']['phone'];
        
        
watchdog('SMS_Debug''Номер телефона: '$form_state['values']['submitted']['phone']);        
        
        
$date date('Y-m-d H:i:s');
        
$start_time date("Y-m-d H:i:s");
        
$end_time date("Y-m-d H:i:s"time() + 10800); // плюс 3 часа
        
$rate 120;
        
$description 'Message DataCall';
        
$livetime 1;
        
$source '';                                    
        
$user '';
        
$password '';
        
$myXML      "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
        
$myXML     .= "<request>";
        
$myXML     .= "<operation>SENDSMS</operation>";
        
$myXML     .= '<message start_time="'.$start_time.'" end_time="'.$end_time.'" livetime="'.$livetime.'" rate="'.$rate.'" desc="'.$description.'" source="'.$source.'">'."\n";
        
$myXML     .= "<body>".$message."</body>";
        
        
watchdog('SMS_Debug''До ввода номеров телефона'$myXML);
        
        
$phones db_select('webform_sms''n')
            ->
fields('n', array('id''Phone''LastName''FirstName'))
            ->
execute()->fetchAll();            
        
        if (
$phones) {
            foreach (
$phones as $phone) {                                
                
$myXML .= "<recipient>".$phone->Phone."</recipient>";
            }
        }
        
        
$myXML     .=  "</message>";
        
$myXML     .= "</request>";
        
        
watchdog('SMS_Debug''После ввода номеров телефона'$myXML);    
        
        
$ch curl_init();
        
curl_setopt($chCURLOPT_USERPWD $user.':'.$password);
        
curl_setopt($chCURLOPT_SSL_VERIFYPEERFALSE);
        
curl_setopt($chCURLOPT_POST1);
        
curl_setopt($chCURLOPT_URL'http://sms-fly.com/api/api.php');
        
curl_setopt($chCURLOPT_HTTPHEADER, array("Content-Type: text/xml""Accept: text/xml"));
        
curl_setopt($chCURLOPT_RETURNTRANSFER1);
        
curl_setopt($chCURLOPT_POSTFIELDS$myXML);
        
$xml curl_exec($ch);
        
        
watchdog('SMS_Debug''Ответ сервера: '$myXML);
        
        
curl_close($ch);        
    }
   
    function 
webform_sms_form_alter(&$form, &$form_state$form_id) {        
        if(
strpos($form_id'webform_client_form_') === 0){
            
$form['#submit'] = array('webform_sms_send''webform_client_form_pages''webform_client_form_submit');
        }
    }    
?>
Аватар пользователя mu_vi mu_vi 25 июня 2015 в 16:00

t1mm1 wrote:
Затри логин/пароль. А то не удобно как-то...

Сейчас попробуем разобраться.

Уже сделал. На радостях) Случайно закинул))

Аватар пользователя t1mm1 t1mm1 25 июня 2015 в 15:48

Есть два момента.
1. Кеш. Вы используете вебформы? Есть подозрение, что один раз закешировав обрабочик не вызывает его после. Выход - кастомная форма. И проще, и быстрее.
2. Распечатайте, что приходит в webform_sms_form_alter в качестве form_id.
Это только в том случае, если не проходят вотчдоги в самом сабмите.

С самим сабмитом у вас все ок (за исключением, что вы выложили все сначала с логином и паролем, и советую их поменять сейчас). Я думаю, если вы его написали, то и кастомную форму осилите. Просто в этом случае вам не нужно будет пилить альтер.

Аватар пользователя mu_vi mu_vi 25 июня 2015 в 15:59

t1mm1 wrote:
Есть два момента.
1. Кеш. Вы используете вебформы? Есть подозрение, что один раз закешировав обрабочик не вызывает его после. Выход - кастомная форма. И проще, и быстрее.
2. Распечатайте, что приходит в webform_sms_form_alter в качестве form_id.
Это только в том случае, если не проходят вотчдоги в самом сабмите.

С самим сабмитом у вас все ок (за исключением, что вы выложили все сначала с логином и паролем, и советую их поменять сейчас). Я думаю, если вы его написали, то и кастомную форму осилите. Просто в этом случае вам не нужно будет пилить альтер.

Спасибо. По делу сказано. Завтра переделаю посмотрю на результат и отпишу. Кастомная форма выход. Я думал, что получится сделать с WebForms но понимаю что увы.

Аватар пользователя t1mm1 t1mm1 25 июня 2015 в 16:08

Фебформы хороши, если вы можете без лишнего сделать на них необходимое.
В вашем же случае - лучше кастом. Вы сможете сами все контролировать + при подобных моментах меньше головной боли. Тем более, уверен, ваш скил с легкостью решит эти моменты.

Аватар пользователя t1mm1 t1mm1 25 июня 2015 в 16:17

кстати, с удовольствем бы почитал про отправку смс.
Может, запилим модулем простой с формой (или цепляемый сабмит через id формы) для отправки уведомлений на смс?

Аватар пользователя mu_vi mu_vi 25 июня 2015 в 16:40

t1mm1 wrote:
кстати, с удовольствем бы почитал про отправку смс.
Может, запилим модулем простой с формой (или цепляемый сабмит через id формы) для отправки уведомлений на смс?

Немного не понял Вас.

Аватар пользователя t1mm1 t1mm1 25 июня 2015 в 17:23

Хм...
Я имел ввиду - напишите статью тут (у себя в блоге на д ру) о том, как пользоваться/сделать такую отправку, что для этого нужно знать и где регистрироваться.
И я напишу простой модуль, который будет через админку цепляться к форме (или айди формы) и отправлять смс.

Аватар пользователя t1mm1 t1mm1 26 июня 2015 в 10:43

Ну, для меня например чек hook_boot - велосипед, или работа с 10ю млн. терминами таксономии или сущностями, или перепелить все полня на кастом, включая составные поля и запихнуть их в серч апи индекс..
но за всю историю с отправкой смс и не работал (

Аватар пользователя Orion76 Orion76 26 июня 2015 в 11:19

"t1mm1" wrote:
Ну, для меня например чек hook_boot - велосипед,

Я про то, что модулей про СМС уже куча..
Есть целые "комбайны" - один модуль на пару десятков операторов.(правда, последний раз когда смотрел, были только для заграничных операторов)

Похвастаюсь, я тоже подобный писал(для конкретного оператора):
отправка СМС - action для модуля Rules.
Цепляй к любому событию Rules и отправляй что хошь.
И ни каких заморочек с сабмитами.-))

А вот сделать "комбайн" для местных операторов наверное было бы полезно, и чтоб операторы добавлялись плагинами, а то и вовсе "настройками" в базе.

Аватар пользователя t1mm1 t1mm1 26 июня 2015 в 12:24

Quote:

А вот сделать "комбайн" для местных операторов наверное было бы полезно, и чтоб операторы добавлялись плагинами, а то и вовсе "настройками" в базе.

хорошая мысль.

просто я с смс не работал. про рулес - а есть статейка, или заметка на этот счет?

Аватар пользователя t1mm1 t1mm1 26 июня 2015 в 14:45

о, спасибо.

а сразу наперед.
настройки работу gateway у них +- одинаковые?
это я к тому, что если делать универсальный модуль - то есть ли единый стандарт у сервисов, что предоставляют доступ?

Аватар пользователя Orion76 Orion76 26 июня 2015 в 16:37

"t1mm1" wrote:
настройки работу gateway у них +- одинаковые?

Эту информацию надо собирать, но я не думаю, что много очень "разных" вариантов настроек и "способов" отправки.
1.URL
2.Ключ авторизации.
3.Поле сообщения
4.Поле ответа.

Заводите проект на github, помогу чем смогу.. Интересно же-)

Кстати.. А откуда такая заинтересованность?
Я пробовал изучить спрос, вроде большого спроса не выявил..

Аватар пользователя t1mm1 t1mm1 26 июня 2015 в 17:28

Явного спроса нет. Как и готовых решений из коробки.
А вот любителям ос коммерца (например) или любых других инет магазов на друпале - думаю, было бы интересно.