Перейти к содержимому


пнтеграция СМС рассылки с сервисом Nexmo

смс

Сообщений в теме: 10

#1 davnozdu

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 11 Декабрь 2013 - 18:54

Здравствуйте, интересует тема интеграции СМС рассылки со сторонними шлюзами
Я хотел бы добавить для своей версии КБ СМС шлюз от компании Nexmo
Образец кода для ручного добавления я взял из соседней ветки и перебил ссылку под Nexmo
Заранее извиняюсь за ошибки, я не программист.
Код у меня не работает и все созданые СМС просто весят в очереди на отправку, CRON настроен и работает корректно.
Что еще интересно, что после ручного добавления сервера и кода отправки в модуль СМС рассылки то сам код не сохраняется.
Приходится нажимать Редактировать и в редакторе кода вставлять код заново и сохранять, тогда он там появляется

Документация для Nexmo доступна тут https://docs.nexmo.c...pi/send-message
Если нужны реальные API ключи для теста СМС, моглу выслать в личку

function send_sms()
{
	global $sms;
	$apikey = '123456';
	$apikeysec = '123456';
	$snoopy = new Snoopy;
	$snoopy->fetch('https://rest.nexmo.com/sms/json?api_key='.$apikey.'&api_secret=$apikeysec'.'&to='.$sms['phone'].'&text='.urlencode($sms['text']).'&signature='.$sms['sender']);
	$json = json_decode($snoopy->results, true);
	if ('ok' == $json['status'] ) {
			$message = "OK";
	} else {
			$message = "ERROR:".$json['message'];
	}
	return $message;
}

Версия КБ 1.9.9

#2 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 12 Декабрь 2013 - 09:58

Весьма странно, что по вашим словам "все созданые СМС просто весят в очереди на отправку". Это говорит о том, что обработка не идет вообще. Попробуйте открыть лог задания крон и посмотреть что там написано, есть ли отчет о работе задания или нет. С версии 1.9.9 должно выходить также число обработанных сообщений там же.

Кроме того, пробовали ли Вы запускать функцию на отдельном скрипте, по инструкции в соседней теме? Сообщения уходят? По ссылке что вы дали, вроде бы совершенно другой алгоритм, там сообщение, насколько я понял, должно отсылаться по xml через curl, а не прямой ссылкой. И у вас опечатка в самой ссылке, должно быть '&api_secret='.$apikeysec.'&to=' (переменная у вас слилась со строкой).

#3 davnozdu

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 12 Декабрь 2013 - 17:31

Сделал CRON,
Теперь он корректно обрабатывает задания, но теперь сообщения попадают в очередь проваленых

Пробовал такой скрипт



<?
function send_sms() {
                global $sms;
                $apikey = '123456';
                $apikeysec = '123456';
                $json = file_get_contents('https://rest.nexmo.com/sms/json?api_key='.$apikey.'&api_secret='.$apikeysec.'&to='.$sms['phone'].'&text='.urlencode($sms['text']));
                $json = json_decode($json, true);
                if ('ok' == $json['staus'] ) {
                                                $message = "OK";
                } else {
                                                $message = "ERROR:".$json['message'];
                }
                return $messge;

}

$sms['phone'] = "420608210867"; // здесь вводите нужный номер получателя
$sms['text'] = "test"; // здесь вводите нужный текст сообщения
$result = send_sms(); // отправляем сообщение
echo $result; // вывод
?>

Но ничего не выдается, скрипт выполняется но никаких сообщений не приходит в терпинал, в логах тоже все чисто

#4 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 13 Декабрь 2013 - 10:43

Я же вам написал, что по вашей ссылке на инструкцию, алгоритм отправки совершенно иной (насколько я понял), и копирование кода с другого шлюза из соседней темы тут вряд ли поможет. Попробуйте для начала хотя бы просто отослать по прямой ссылке в браузере смс. Если не получится - значит явно не подходит то что вы выше написали. Собственно, связь с провайдером стороннего шлюза в нашу компетенцию не входит, это вы должны решать самостоятельно с ним. Вот как наладите связь и уже после этого будете пытаться внедрить ее в КБ - тогда другое дело. Либо, альтернативный вариант (если сами не сможете) - обратиться к нам уже за платной услугой подключения.

#5 davnozdu

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 14 Декабрь 2013 - 02:36

По прямой ссылке в браузере и через CURL SMS сообщение уходит.
Достаточно ли тогда вставить в модуль прямую ссылку для отправки сообщения с необходимыми переменными ?

#6 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 14 Декабрь 2013 - 11:45

То что вы выше делали, как раз и есть отправка по прямой ссылке. Отправьте заявку в техподдержку со всеми данными для проверки. Тут либо я что-то не понимаю, либо вы.

#7 davnozdu

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 14 Декабрь 2013 - 17:42

У меня работает такой PHP скрипт на отправку через CURL

<?php
//$url = "https://rest.nexmo.com/sms/json?api_key=123456&api_secret=123456&from=MyCompany20&to=420608210867&text=message";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
$result = curl_exec($ch); // run the whole process
curl_close($ch);
echo $result;
?>

Как в этот код вставить переменные, чтобы номер отправителя и сообщение бралось из КБ ?
Если я правильно понимаю, то за эти параметры отвечают переменные


$sms['phone'] = "420608210867"; // здесь вводите нужный номер получателя
$sms['text'] = "test"; // здесь вводите нужный текст сообщения
К сожалению я к программированию имею удаленное отношение и поэтому прошу помощи

#8 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 15 Декабрь 2013 - 11:43

Цитата

Как в этот код вставить переменные, чтобы номер отправителя и сообщение бралось из КБ ?

Также, как вы их и раньше вставляли:

$url = "https://rest.nexmo.com/sms/json?api_key=123456&api_secret=123456&from=".$sms['sender']."&to=".$sms['phone']."&text=".urlencode($sms['text'];

Очевидно, в прошлый раз вы просто забыли добавить параметр &from=".$sms['sender']." в строку запроса.

#9 davnozdu

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 16 Декабрь 2013 - 16:18

Спасибо, все заработало
Единственное что не идет - это отправка сообщений на русском языке.
В документации сказано, что для отправки сообщения его необходимо перекодировать

Цитата

Required when type='text'. Body of the text message (with a maximum length of 3200 characters),UTF-8 and URL encoded value. Ex: "Déjà vu" content would be "D%c3%a9j%c3%a0+vu"

Если я правильно понял, то за перекодировку отвечает этот параметр
"&text=".urlencode($sms['text']);


Но в место русского языка посылаются вопросительные знаки

Сейчас у меня вписано такой рабочий код

function send_sms()
{
  global $sms;
$url = "https://rest.nexmo.com/sms/json?api_key=1234546&api_secret=123456&from=".$sms['sender']."&to=".$sms['phone']."&text=".urlencode($sms['text']);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url); // set url to post to
$result = curl_exec($ch); // run the whole process
curl_close($ch);
}


#10 davnozdu

    Новичок

  • Пользователи
  • Pip
  • 7 сообщений

Отправлено 16 Декабрь 2013 - 16:36

И еще такой вопрос, в вашей системе есть возможность отслеживания статуса SMS
Сервис NEXMO в ответ сообщает такую информацию для каждого отправления
Ответ есть в формате JSON или XML
Мне приходит JSON


Цитата

{"message-count":"1","messages":[{"to":"420608210867","message-id":"020000001D181029","status":"0","remaining-balance":"1.75500000","message-price":"0.03500000","network":"23003"}]}1

Если я правильно понял, то за определение статуса отвечает этот кусок кода

  if ('ok' == $json['status'] ) {
                                                $message = "OK";
                } else {
                                                $message = "ERROR:".$json['message'];
                }
                return $message;                
}

У сервиса NEXMO статус передается в виде кода, 0 значит OK
Я сделал такой код, но статус не заработал, подскажите что не так


  if ('0' == $json['status'] ) {
                                                $message = "OK";
                } else {
                                                $message = "ERROR:".$json['message'];
                }
                return $message;                
}


#11 CbCoder

    Активный участник

  • Программист ООО "КБ"
  • PipPipPip
  • 8 759 сообщений
  • Пол:Мужчина
  • Город:Казань

Отправлено 24 Декабрь 2013 - 11:50

Прошу прощения, уходил в отпуск, сразу не мог ответить.

Цитата

Если я правильно понял, то за перекодировку отвечает этот параметр
"&text=".urlencode($sms['text']);

Да, все правильно. Странно, почему у вас вопрос.знаки, не должно такого быть по идее. Кодировка у нас в программе utf-8, вроде бы так и требуется, судя по цитате. Затрудняюсь сказать в чем тут дело.

Цитата

Я сделал такой код, но статус не заработал, подскажите что не так

Во-первых, нужно для начала декодировать json ответ в массив php:

$json = json_decode($result, true);

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

if ('0' == $json['messages'][0]['status'] )






Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных