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

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

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

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

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

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

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

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

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

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

Теперь поправим шаблон активации пользователя:
Открываем файл templates/_default_/special/regactivate.php
В самом начале файла, до тега <html> добавляем:
  1.  
  2. <?php
  3. if (isset($_POST['subm'])) { //проверяем нажималась ли кнопка Sumbit, если нет, то показываем шаблон; если да, то уходим на активацию...
  4. $ur = $_POST['key']; //получаем код активации, введенный пользователем
  5. $URL="http://АДРЕС_ВАШЕГО_САЙТА/activate/$ur"; //здесь прописываем где проходит активация
  6. header ("Location: $URL"); //сама переадресация на активацию
  7. }
  8. else {
  9. ?>
  10.  
Удаляем код автоматической переадресации через 25 секунд, а именно вот эту строку:
  1.  
  2. <meta http-equiv="refresh" content="25;URL=/">
  3.  
Заменяем все, что идет после кода:
  1.  
  2. <h2>Регистрация завершена</h2>
  3.  
на следующий код:
  1.  
  2. <p>На указанный вами номер телефона выслано SMS-сообщение с кодом подтверждения.</p>
  3. <p><form action='/templates/ВАШ_ШАБЛОН/special/regactivate.php' method='POST'> //форма для ввода кода активации
  4. Код активации: <input name='key' type='text' />
  5.  
  6. <input type="submit" name="subm" value='Активировать учетную запись'>
  7. </form></p>
  8. </td>
  9. </tr>
  10. </table>
  11. </td>
  12. </tr>
  13. </table>
  14. </body>
  15. </html>
  16. <?php
  17. }
  18. ?>
  19.  
Путем таких вот "несложных" доработок, мы добавили новое поле в профиль, а также научили IstantCMS отправлять код подтверждения путем отправки SMS. В следующем блоге, я расскажу, как с помощью SMS можно поменять стаусное сообщение, отображаемое в Профиле пользователя.
0
lezginka.ru lezginka.ru 12 лет назад #
Петр, было интересно узнать, в общих чертах, как сделать рассылку сообщений одного юзера из группы "вип-смс" всем зарегистрированным юзерам.
0
lezginka.ru lezginka.ru 12 лет назад #
хотел сказать... юзер из группы "вип-смс" должен иметь возможность отправить смс всем зарегистрированным юзерам или какой-либо группе, например - "получатели-смс"
0
Нил™ Нил™ 12 лет назад #
интересная тема))
0
12 лет назад #
Вот здесь вариант попроще. ПК под виндой и sms сервер, никаких апачей и мускулов иметь не надо. Там же есть вариант отправки прямо из php для выделенного сервера.
0
12 лет назад #
Забыл добавить. Неограниченная лицензия на sms сервер - 5500р, но это ж вещь! Есть триал версия.
0
spacer spacer 11 лет назад #
Это как-то можно использовать на VPS или только на дедике?
0
spacer spacer 11 лет назад #
Для каких проектов целесообразно использовать СМС-сервер?
С каким объемом СМС-рассылок?
Сейчас ведь полно сторонних облачных сервисов, которые позволяют интегрироваться и рассылаться с их помощью.

Еще от автора

Часть первая (или готовим свой SMS-сервер)
Всем привет! Много вопросов возникает по поводу интеграции InstantCMS с любым SMS-сервисом.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.