Часть вторая (или отправляем код подтверждения по SMS)

Опубликовано: 355 дней назад (4 июня 2011)
Рубрика: Без рубрики
Редактировалось: 2 раза — последний 4 июня 2011
+12
Голосов: 12
В первой части своего блога я рассказал, как нам создать собственный SMS-сервис. Сегодня я хотел рассказать, как отправлять код регистрации по SMS, а также ввести новое определение ID_SMS, которое может использоваться для отправки личных сообщений по средством SMS... Но описание процесса регистрации оказалось довольно большим, поэтому, приношу свои извинения, но описание ID_SMS я перенесу на один из следующих блогов.
Ну что ж... начнем "приучать" к SMS-сервису InstantCMS. Блог получился большой и в некоторых файлах придется прописывать много параметров, поэтому я сначала опишу общий план действий, а потом уже буду прописывать: что, где и для чего мы будем менять.
Общий план:
1. Прописать обработчик параметров, получаемых от InstantCMS (обработчик лежит на том же серваке, где и Ваш SMS-сервис).
2. Ввести новое поле "Номер телефона" в профиль (делаем его доступным при регистрации, а также для редактирования. Я в своем проекте не отображаю это поле в профиле, т.к. это "Конфиденциальная/личная информация", которая охраняется законом).
3. Изменяем систему регистрации и редактирования профиля.
4. Изменяем систему активации профиля (меняем механизм генерации и отправки кода подтверждения).
ОБРАЩАЮ ВАШЕ ВНИМАНИЕ, ЧТО ПЕРЕД НАЧАЛО ВСЕХ ДЕЙСТВИЙ РЕКОМЕНДУЕТСЯ СОХРАНИТЬ BACKUP ВСЕХ ДАННЫХ!!!

1. Самым простым будет прописать обработчик. Создаем в корневой директории Вашего веб-сервера (где настроен SMS-сервис) папку SMS. И создаем там файл, например, registration.php со следующим содержимым:
Код PHP:
<?php
$num=$_GET['to']; //получаем номер телефона, кому отправим смс
$pin=$_GET['msg']; //получаем код подтверждения
$datas="app=webservices&u=ВАШ_ЛОГИН_К_SMS-СЕРВИСУ&p=ВАШ_ПАРОЛЬ_К_SMS-СЕРВИСУ&ta=pv&to=$num&unicode=1&msg=Vash+kod+podtverzhdeniya+registracii:+$pin"; //формируем строку запроса в SMS-сервис
$fp = fsockopen("localhost", 80, $errno, $errstr, 10); //хост, где находится SMS-сервис
$out = "POST / HTTP/1.1\n";
$out .= "Host: localhost\n";
$out .= "Referer: localhost/\n";
$out .= "User-Agent: Opera\n";
$out .= "Content-Type: application/x-www-form-urlencoded\n";
$out .= "Content-Length: ".strlen($datas)."\n\n";
$out .= $datas."\n\n";
fputs($fp, $out); //отправляем запрос
fclose($fp);
?>
Данный обработчик получает из InstantCMS номер пользователя и код подтверждения регистрации и отправляет SMS.

2. Вводим новое поле в профиль.
В БД в таблице cms_users после столбца ICQ добавляем новый столбец NUMBER (text, cp1251_general_ci). В нем мы будем хранить номер телефона пользователя.

Далее я буду описывать в каких файлах и что будем менять (изменения будут относится как ко 2-му пункту, так и к 3-му, и к 4-му пунктам).

Открываем файл components/registration/frontend.php
1. Изменяем функцию генерации кода подтверждения:
Находим сроки:
Код PHP:
    $code = md5($user['email'].substr(md5(rand(0,9999)), 0, 8));
    $codelink = 'http://'.$_SERVER['HTTP_HOST'].'/activate/'.$code;
и меняем их на:
Код PHP:
    $alf="abcdefghijklmnopqrstuvwxyzABCDEFGHIGKLMNOPQRSTUVWXYZ";
    $cntalf=strlen($alf);
    $code="";
    for($i=0;$i<6; $i++){
       $code.=$alf[rand(0,$cntalf)];
       }
2. Заменяем функцию отправки письма, на функцию отправки SMS:
Находим строки:
Код PHP:
    $letter_path = PATH.'/includes/letters/activation.txt';
    $letter = file_get_contents($letter_path);
    foreach($user as $key=>$value){
        $letter= str_replace('{'.$key.'}', $value, $letter);
    }
    $letter= str_replace('{sitename}', $inConf->sitename, $letter);
    $letter= str_replace('{codelink}', $codelink, $letter);
    $inCore->mailText($user['email'], $_LANG['ACTIVATION_ACCOUNT'].' - '.$inConf->sitename, $letter);
и меняем их на:
Код PHP:
  $n=$user['number'];  //номер куда будем отправлять SMS
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, "http://ВАШ_IP/sms/registration.php?to=$n&msg=$code"); //IP-адрес Вашего SMS-сервиса и переменные отправляемые ему
  curl_setopt($ch, CURLOPT_HEADER, false);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
  curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (http://mysite.ru)');
  $data = curl_exec($ch);
  curl_close($ch);
3. Добавляем поле Номер телефона в форму регистрации:
Ищем:
Код PHP:
if ($cfg['ask_icq']){
            $icq = $inCore->request('icq', 'str', '');
            $icq = preg_replace('/([^0-9])/i', '', $icq);
        } else {
            $icq = '';
        }
И сразу после него вставляем:
Код PHP:
if($inCore->request('number', 'str', '')) { $number = $inCore->request('number', 'str', ''); } else { $msg .= 'Укажите номер телефона в формате 79ххуууууу'; }
4. Изменяем запрос в базу данных при регистрации пользователя:
Ищем:
Код PHP:
$sql = "INSERT INTO cms_users (group_id, login, nickname, password, email, icq, regdate, logdate, birthdate, is_locked, is_logged_once, invited_by)
 VALUES ('$group_id', '$login', '$nickname', '$pass', '$email', '$icq', NOW(), NOW(), '$birthdate', '$is_locked', 0, '{$invited_by}')";
заменяем на:
Код PHP:
$sql = "INSERT INTO cms_users (group_id, login, nickname, password, email, icq, number, regdate, logdate, birthdate, is_locked, is_logged_once, invited_by)
 VALUES ('$group_id', '$login', '$nickname', '$pass', '$email', '$icq', '$number', NOW(), NOW(), '$birthdate', '$is_locked', 0, '{$invited_by}')";
сохраняем файл components/registration/frontend.php .

Открываем файл components/registration/router.php
Здесь мы поменяем количество символов в коде при проверке.
Ищем:
Код PHP:
$routes[] = array(
'_uri'  => '/^registration\/activate\/([a-z0-9]{32})$/i',
'do'    => 'activate',
1       => 'code'
);
И заменяем на:
Код PHP:
$routes[] = array(
'_uri'  => '/^registration\/activate\/([a-z0-9]{6})$/i',
'do'    => 'activate',
1       => 'code'
);
с этим файлом тоже закончили работать...

Открываем файл components/users/frontend.php
1. Ищем секцию /////EDIT PROFILE////
Находим здесь следующие строки:
Код PHP:
if ($opt == 'save'){
	$errors = false;
и сразу поле них добавляем:
Код PHP:
$number = $inCore->request('number', 'str');
2. Теперь обновим запрос в БД. Ищем строки
Код PHP:
$sql = "UPDATE cms_users 
		SET birthdate='$birthdate',
		email='$email',
		icq='$icq',
и сразу после строки icq добавляем
Код PHP:
number='$number',
сохраняем файл components/users/frontend.php .
С "внутренностями" системы покончено. dance Теперь поправим все шаблоны.

Открываем файл templates/ВАШ_ШАБЛОН/components/com_registration.tpl
1. Добавим в форму регистрации новое поле.
Ищем такие строки:
Код PHP:
                {if $cfg.ask_icq}
                    <tr>
                        <td valign="top" class=""><strong>ICQ:</strong></td>
                        <td valign="top" class="">
                            <input name="icq" type="text" class="text-input" id="icq" value="{$icq}" size="30"/>
                        </td>
                    </tr>
                {/if}
и сразу после них добавляем:
Код PHP:
<tr>
<td valign="top" class=""><div><strong>Номер телефона :</strong></div><div><small>Внимание!!! Необходимо указать 11 цифр Вашего мобильного телефона начиная с 7. Например, <strong>79511234567.</strong></small></div></td>
<td valign="top" class=""><input name="number" type="text" id="number" size="30" value="{$number}"/><span class="regstar">*</span></td>
</tr>
сохраняем файл templates/ВАШ_ШАБЛОН/components/com_registration.tpl

Открываем файл templates/ВАШ_ШАБЛОН/components/com_users_edit_profile.tpl
1. Добавим поле "Номер телефона" в редактирование профиля.
Ищем код:
Код PHP:
                    <tr>
                        <td valign="top"><strong>{$LANG.NUMBER_ICQ} :</strong></td>
                        <td valign="top"><input name="icq" class="text-input" type="text" id="icq" style="width:300px" value="{$usr.icq}"/></td>
                    </tr>
и сразу после этих строк дописываем:
Код PHP:
<tr>
<td valign="top"><div><strong>Номер телефона :</strong></div><div><small>Внимание!!! Необходимо указать 11 цифр Вашего мобильного телефона начиная с 7. Например, <strong>79511234567.</strong></small></div></td>
<td valign="top"><input name="number" type="text" id="number" style="width:300px" value="{$usr.number}"/></td>
</tr>
сохраняем файл templates/ВАШ_ШАБЛОН/components/com_users_edit_profile.tpl

Теперь поправим шаблон активации пользователя:
Открываем файл templates/_default_/special/regactivate.php
В самом начале файла, до тега <html> добавляем:
Код PHP:
<?php
if (isset($_POST['subm'])) {      //проверяем нажималась ли кнопка Sumbit, если нет, то показываем шаблон; если да, то уходим на активацию...
        $ur = $_POST['key'];      //получаем код активации, введенный пользователем
        $URL="http://АДРЕС_ВАШЕГО_САЙТА/activate/$ur"; //здесь прописываем где проходит активация
        header ("Location: $URL"); //сама переадресация на активацию
        }
else {
?>
Удаляем код автоматической переадресации через 25 секунд, а именно вот эту строку:
Код PHP:
<meta http-equiv="refresh" content="25;URL=/">
Заменяем все, что идет после кода:
Код PHP:
<h2>Регистрация завершена</h2>
на следующий код:
Код PHP:
                                <p>На указанный вами номер телефона выслано SMS-сообщение с кодом подтверждения.</p>
<p><form action='/templates/ВАШ_ШАБЛОН/special/regactivate.php' method='POST'> //форма для ввода кода активации
Код активации: <input name='key' type='text' />

<input type="submit" name="subm" value='Активировать учетную запись'>
</form></p>
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
        </table>
    </body>
</html>
<?php
}
?>
Путем таких вот "несложных" доработок, мы добавили новое поле в профиль, а также научили IstantCMS отправлять код подтверждения путем отправки SMS. В следующем блоге, я расскажу, как с помощью SMS можно поменять стаусное сообщение, отображаемое в Профиле пользователя.
Часть первая (или готовим свой SMS-сервер)
lezginka.ru # 6 июня 2011 в 17:32 0
Петр, было интересно узнать, в общих чертах, как сделать рассылку сообщений одного юзера из группы "вип-смс" всем зарегистрированным юзерам.
lezginka.ru # 6 июня 2011 в 17:34 0
хотел сказать... юзер из группы "вип-смс" должен иметь возможность отправить смс всем зарегистрированным юзерам или какой-либо группе, например - "получатели-смс"
Нил # 16 июня 2011 в 22:56 0
интересная тема))
0 # 3 августа 2011 в 17:15 0
Вот здесь вариант попроще. ПК под виндой и sms сервер, никаких апачей и мускулов иметь не надо. Там же есть вариант отправки прямо из php для выделенного сервера.
0 # 3 августа 2011 в 17:28 0
Забыл добавить. Неограниченная лицензия на sms сервер - 5500р, но это ж вещь! Есть триал версия.
spacer # 24 апреля 2012 в 18:12 0
Для каких проектов целесообразно использовать СМС-сервер?
С каким объемом СМС-рассылок?
Сейчас ведь полно сторонних облачных сервисов, которые позволяют интегрироваться и рассылаться с их помощью.