Статьи

Создать форму для регистрации по SMS: часть 2

Добро пожаловать во вторую часть этого руководства по использованию технологии SMS для создания формы регистрации. Ранее в первой части этой серии мы использовали HTML, JavaScript, MySQL и PHP для создания формы регистрации. В этом уроке мы рассмотрим интеграцию с SMS-шлюзом и код, необходимый для завершения обработки формы регистрации.


В первой части этой серии мы создали две функции: зарегистрироваться и активировать. Как видно из названия, первое используется для регистрации формы, а второе — для ввода кода активации. Мы продолжим, покажем, как использовать две разные службы SMS-шлюза для отправки сообщений. Что такое SMS-шлюз? По сути, это услуга, которая обеспечивает доступ к трафику мобильной сети с одним или несколькими операторами сотовой связи. Итак, зачем использовать два разных сервиса? Моим первым выбором был Clickatell , но для отправки SMS-сообщений в США без шорткода мне нужно было найти другую услугу. SmsMatrix — это отличный сервис, который может отправлять сообщения во многих разных странах, включая США. Я мог бы использовать только SmsMatrix, но вместо этого я буду использовать оба сервиса, чтобы продемонстрировать, как вы позволите серверу выбирать сервис в зависимости от страны, в которой вы находитесь. таргетинг. Это вполне может произойти в реальном мире, так как вы можете варьировать шлюзы, чтобы сэкономить на стоимости сообщения или в качестве резервной копии на случай, если первая пробная служба ответит кодом ошибки.


Clickatell является одним из крупнейших онлайн-шлюзов SMS. Согласно информации на их сайте, в настоящее время Clickatell поддерживает 221 страны и территории. Они имеют множество функций, включая простые SMS, двусторонние SMS и короткие SMS. У них также есть впечатляющая база пользователей, обслуживающая более 10 000 клиентов по всему миру. Некоторые из этих клиентов включают CNN, Continental Airlines, Vodafone, Oracle, Nokia и других крупных игроков в сфере ИТ и бизнеса. Приятной особенностью Clickatell является то, что вы можете зарегистрировать бесплатную учетную запись и использовать 10 бесплатных кредитов для отправки SMS-сообщений во время обучения. SMS-шлюзы обычно работают с кредитами, которые вы покупаете для отправки SMS-сообщений. Количество кредитов, которое будет стоить одно SMS-сообщение, зависит от того, куда (географически) отправлено сообщение. Перейдите на Clickatell и зарегистрируйтесь для бесплатной учетной записи . Когда вы отправляете с тестовыми кредитами, содержание сообщения будет заменено информацией о тестировании, но это должно работать для наших нужд. Когда вы регистрируетесь, будьте внимательны, чтобы зарегистрироваться в Clickatell Central и выбрать «Покрытие», за исключением США, так как вам нужен специальный номер шорткода для отправки в США.

После того, как вы успешно активировали свою учетную запись и вошли в систему, нажмите ссылку «нажмите здесь, чтобы создать новое подключение». Это установит api_id, с помощью которого вы можете отправлять SMS.

Выберите HTTP в качестве типа подключения. Clickatell предлагает множество вариантов отправки SMS, наиболее простым из которых является отправка электронного письма на определенный адрес. Они поддерживают множество протоколов, таких как XML, SOAP и даже FTP для массовых сообщений. HTTP-соединение — это все, что нам нужно.

Продолжите и нажмите Get API ID. Вы получите страницу с примером строки. Скопируйте пример строки в ваш браузер и замените имя пользователя, пароль и параметры на ваши имя пользователя, пароль и номер мобильного телефона. Вы получите результат в браузере с сообщением «ОК» или «ОШИБКА», за которым следует код. Это то, что нам нужно для создания нашей библиотеки Clickatell.

Чтобы начать создание библиотеки Clickatell, создайте новый файл с именем Clickatell_api.php в папке приложения / библиотеки . Введите следующий код:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Clickatell_api {
     
    //change this to the actual user and password
    private $username = ‘username’;
    private $password = ‘password’;
    private $api_id = ‘api id’;
    private $url = ‘http://api.clickatell.com/http/sendmsg’;
     
    public function send_sms( $phone, $text ){
        $url = $this->url .
        ‘&password=’ .
        ‘&api_id=’ .
        ‘&to=’ .
        ‘&text=’ .
         
        $r = @file( $url );
        $res = substr( $r[0], 0, 2);
         
        if( $res == ‘ER’ ){
            return false;
        }
        return true;
    }
     
}

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

В приведенном выше примере мы создаем класс Clickatell_api, который имеет несколько членов: имя пользователя, пароль, api_id и URL-адрес, на котором мы будем основываться. Замените своим именем пользователя, паролем и api_id. Внутри класса у нас есть одна функция send_sms (), которая принимает номер телефона и текстовое сообщение для отправки. Класс строит URL, объединяя членов класса и формируя окончательный URL. Мы используем urlencode () для кодирования текста в URL, а затем передаем его в file () . Конечно, для серверов, у которых заблокирована функция file (), вы можете использовать CURL, но не в этом уроке. Затем мы получаем результат и используем subtr (), чтобы получить первые два символа из первой строки. Если ответ «ER», который приходит из ERROR, мы возвращаем false, в противном случае мы возвращаем true. Это все, что делает класс, но все же лучше использовать класс, так как вы можете использовать его позже в любом приложении.


SmsMatrix — еще один мощный сервис. У этого есть намного более продвинутые вещи, такие как преобразование текста в голос, программируемый ответ («пожалуйста, нажмите 2 для да или 1 для нет»), и голосовые сообщения, но самое главное для нас — это не Вам необходимо иметь короткий номер для отправки SMS-сообщений в США. У них также есть опция бесплатной учетной записи, которая дает вам 5 кредитов для тестирования вашего приложения SMS. Начать настройку с помощью SmsMatrix проще, чем Clickatell: вы создаете учетную запись, а затем используете свое имя пользователя и пароль для отправки SMS-сообщения. Вам понадобится руководство по отправке смс , но идея та же: вы создаете специальный URL и получаете к нему доступ с помощью PHP. Давайте создадим для этого библиотеку smsmatrix_api. Создайте файл с именем Smsmatrix_api.php в папке application / library и напишите следующее:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Smsmatrix_api {
 
    //change this to the actual user and password
    private $username = ‘username’;
    private $password = ‘password’;
    private $url = ‘http://www.smsmatrix.com/matrix’;
     
     
    public function send_sms( $phone, $text ){
        $url = $this->url .
        ‘&password=’ .
        ‘&phone=’ .
        ‘&txt=’ .
         
        $r = @file( $url );
        $res = substr( $r[2], 11);
        if( $res > 399 ){
            return false;
        }
        return true;
    }
 
}

Опять же, мы создаем класс с именем пользователя, паролем и членами и создаем ту же функцию send_sms () . Мы назвали это одинаково, чтобы классы могли быть взаимозаменяемыми. Мы создаем окончательный URL, получаем доступ к нему с помощью file () и получаем код результата. Код результата находится в 3-й строке строки результата, поэтому мы используем subtrs ($ r [2], 11), чтобы получить число после строки ‘STATUSCODE =’. Я получил коды ошибок из руководства в формате pdf, и любой код ниже 399 является успешным, поэтому мы возвращаем true, в противном случае мы возвращаем false.


Хорошо, пришло время вернуться к нашему контроллеру регистрации. Перейдите к функции process () и введите следующий код после вставки базы данных:

1
2
3
4
5
6
7
8
// send auth SMS if in US
if( $this->input->post(‘country’) == 1 ){
    $this->load->library(‘smsmatrix_api’);
    $this->smsmatrix_api->send_sms( $signup[‘mobile’], $signup[‘activation’] );
} else { // when not USA
    $this->load->library(‘clickatell_api’);
    $this->clickatell_api->send_sms( $signup[‘mobile’], $signup[‘activation’] );
}

Сначала мы проверяем код страны, если он равен 1 (т. Е. США), мы будем использовать SmsMatrix, поэтому мы загружаем его с помощью $ this-> load-> library (‘smsmatrix_api’) . Если страна не США, мы загружаем clickatell_api. В любом случае, мы используем send_sms () для отправки кода активации на номер мобильного телефона. Вы заметите, что номер мобильного телефона ранее вставлен в базу данных, соединив значение страны (которое содержит префикс для этой страны) с номером мобильного телефона. На самом деле мы могли бы завершить второй параметр в загрузке библиотеки, чтобы получить к нему доступ с определенным именем, и использовать только отправку в библиотеке:

1
2
3
4
5
6
7
// send auth sms if in US
if( $this->input->post(‘country’) == 1 ){
    $this->load->library(‘smsmatrix_api’, ‘sms_api’);
} else { // when not in US
    $this->load->library(‘clickatell_api’, ‘sms_api’);
}
$this->sms_api->send_sms( $signup[‘mobile’], $signup[‘activation’] );

Таким образом, мы загружаем только соответствующую библиотеку с тем же именем, получая к ней доступ через sms_api, но это одно и то же. В основном две библиотеки имеют один и тот же интерфейс. Кроме того, если вы получите false в качестве возвращаемого значения, вы можете отправить SMS с другой библиотекой в ​​качестве резервной копии.


Если после отправки SMS-сообщения мы установили «подписанный» файл cookie, мы сможем использовать его позже, чтобы предотвратить отправку нескольких сообщений. Нам нужно сделать это таким образом, чтобы, когда пользователь отходит от формы регистрации, а затем возвращается, чтобы попытаться снова зарегистрироваться, мы автоматически перенаправим его в функцию активации. Добавьте это в начало функции signup () :

1
2
3
4
5
6
7
8
9
function index(){
    if( get_cookie(‘signed’) ){
        redirect(‘signup/activate’);
    }
    $this->config->load(‘countries’, true);
    $data[‘countries’] = $this->config->item(‘countries’);
         
    $this->load->view(‘signup’, $data );
}

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


Теперь мы создадим процесс активации:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
function activate(){
    if( !get_cookie(‘signed’) ){
        redirect(‘signup’);
    }
         
    $data[‘error’] = »;
         
    if( $this->input->post(‘signup’) ){
        //if sent
        $where = array(‘uid’=>get_cookie(‘signed’),’activation’=>$this->input->post(‘code’) );
        $result = $this->db->where( $where )->count_all_results(‘users’);
        if( $result < 1 ){
             $data[‘error’] = ‘<div class=»error»>The authorization code is not correct!</div>’;
        } else {
            delete_cookie(‘signed’);
            $this->db->set( array(‘active’=>1, ‘activation’=>») )->where(‘uid’, get_cookie(‘signed’) )->update(‘users’);
            redirect(‘signup/success’);
        }
    }
     
    $this->load->view(‘activate’, $data );
}

Позвольте мне объяснить, что здесь происходит: я делаю наоборот, если cookie не установлен, я перенаправляю на регистрацию. Затем я установил сообщение об ошибке », потому что сейчас у нас нет ошибок. Если поле записи для регистрации было установлено (то есть, если форма была отправлена), я ищу запись в таблице с идентификатором из файла cookie и активацией, равной представленному коду. Важно, чтобы в базе данных никогда не было идентификатора 0, так как это сделало бы cookie ложным, и был бы цикл перенаправления. Эту проверку можно сделать, но лучше установить ее в базе данных.

Я считаю возвращенные строки, и если я не получаю, я показываю ошибку, что авторизация не верна. Поскольку у пользователя может быть только определенный код активации, при вводе неправильного кода база данных не найдет ни одной строки и вернет 0. Если мы находим строку, мы удаляем cookie, поскольку он нам больше не нужен, мы устанавливаем активный столбец в 1 и активацию в » и обновляем таблицу. С этого момента пользователь активируется, и мы точно знаем, что это его телефон, и мы, вероятно, можем отправить специальное предложение в виде смс. Я также перенаправляю пользователя к функции success () , которая представляет собой простое представление с этим сообщением об успехе:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<!DOCTYPE html PUBLIC «-//W3C//DTD XHTML 1.0 Transitional//EN» «http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»>
  <html xmlns=»http://www.w3.org/1999/xhtml»>
  <head>
  <meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ /><br />
  <title>Activate</title>
  <link rel=»stylesheet» href=»<?php echo base_url(); ?>css/reset.css» type=»text/css» />
  <link rel=»stylesheet» href=»<?php echo base_url(); ?>css/design.css» type=»text/css» />
  <script type=»text/javascript» src=»http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js»></script>
  <script type=»text/javascript» src=»http://ajax.microsoft.com/ajax/jquery.validate/1.7/jquery.validate.min.js»></script>
  <script type=»text/javascript» src=»<?php echo base_url(); ?>js/jquery.metadata.js»></script>
  <script type=»text/javascript»>
  $(document).ready( function(){
  $(‘.ok’).hide().fadeIn(800);
  });
  </script>
  </head>
  <body>
  <div id=»wrap»>
  <h2>Success</h2>
  <div class=»ok»>Thank you, your account has been activated!</div>
  </div>
  </body>
  </html>

Это последний код контроллера регистрации:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
class Signup extends Controller {
 
    function Signup(){
        parent::Controller();
    }
     
    function index(){
        if( get_cookie(‘signed’) ){
            redirect(‘signup/activate’);
        }
        $this->config->load(‘countries’, true);
        $data[‘countries’] = $this->config->item(‘countries’);
         
        $this->load->view(‘signup’, $data );
    }
     
    function process(){
        $this->load->library(‘form_validation’);
         
        if ( $this->form_validation->run() ){
         
            $signup = array();
            $signup[‘name’] = $this->input->post(‘name’);
            $signup[’email’] = $this->input->post(’email’);
            $signup[‘country’] = $this->input->post(‘country’);
            $signup[‘mobile’] = $this->input->post(‘country’).$this->input->post(‘mobile’);
            //generate the unique activation code
            mt_rand();
            $signup[‘activation’] = rand( 11111, 99999 );
             
            //insert into db
            $this->db->insert(‘users’, $signup );
             
            //send auth sms
            //if in United States
            if( $this->input->post(‘country’) == 1 ){
                $this->load->library(‘smsmatrix_api’);
                $this->smsmatrix_api->send_sms( $signup[‘mobile’], $signup[‘activation’] );
            } else {
                $this->load->library(‘clickatell_api’);
                $this->clickatell_api->send_sms( $signup[‘mobile’], $signup[‘activation’] );
            }
             
            set_cookie(‘signed’, $this->db->insert_id(), 86500 );
            //redirect
            redirect(‘signup/activate’);
             
        } else {
            $this->config->load(‘countries’, true);
            $data[‘countries’] = $this->config->item(‘countries’);
             
            $this->load->view(‘signup’, $data );
        }
    }
         
    function check_email_exists( $email ){
        $rs = $this->db->where( ’email’, $email )->count_all_results(‘users’);
        $this->form_validation->set_message(‘check_email_exists’, ‘We\’re sorry, this email already exists!’);
        if( $rs < 1 ){
            return true;
        }
        return false;
    }
     
    function activate(){
        if( !get_cookie(‘signed’) ){
            redirect(‘signup’);
        }
         
        $data[‘error’] = »;
         
        if( $this->input->post(‘signup’) ){
            //if sent
            $where = array(‘uid’=>get_cookie(‘signed’),’activation’=>$this->input->post(‘code’) );
            $result = $this->db->where( $where )->count_all_results(‘users’);
            if( $result < 1 ){
                $data[‘error’] = ‘<div class=»error»>The authorization code is not correct!</div>’;
            } else {
                delete_cookie(‘signed’);
                $this->db->set( array(‘active’=>1, ‘activation’=>») )->where(‘uid’, get_cookie(‘signed’) )->update(‘users’);
                 
                redirect(‘signup/success’);
            }
        }
         
        $this->load->view(‘activate’, $data );
    }
     
    function success(){
        $this->load->view(‘success’);
    }
}

Спасибо за чтение этого урока! Поскольку результаты этого руководства невелики, а тестирование дорогое, у нас нет предварительного просмотра, но вы можете запустить его из источников, предоставленных с вашими собственными тестовыми аккаунтами. Это только малая часть того, что можно сделать с помощью Clickatell и SmsMatrix. Вы можете попробовать множество вещей, таких как отправка на несколько телефонов, массовая реклама, отправка голосового файла по электронной почте для создания голосового сообщения, сообщения TTS и т. Д. Я надеюсь, вам понравился мой урок, и я надеюсь, что вы используете его в своем SMS-приложении следующего поколения! Спасибо за следование моему уроку и напишите в комментариях, что вы придумали!