Добро пожаловать во вторую часть этого руководства по использованию технологии SMS для создания формы регистрации. Ранее в первой части этой серии мы использовали HTML, JavaScript, MySQL и PHP для создания формы регистрации. В этом уроке мы рассмотрим интеграцию с SMS-шлюзом и код, необходимый для завершения обработки формы регистрации.
Шаг 1: Где мы остановились
В первой части этой серии мы создали две функции: зарегистрироваться и активировать. Как видно из названия, первое используется для регистрации формы, а второе — для ввода кода активации. Мы продолжим, покажем, как использовать две разные службы SMS-шлюза для отправки сообщений. Что такое SMS-шлюз? По сути, это услуга, которая обеспечивает доступ к трафику мобильной сети с одним или несколькими операторами сотовой связи. Итак, зачем использовать два разных сервиса? Моим первым выбором был Clickatell , но для отправки SMS-сообщений в США без шорткода мне нужно было найти другую услугу. SmsMatrix — это отличный сервис, который может отправлять сообщения во многих разных странах, включая США. Я мог бы использовать только SmsMatrix, но вместо этого я буду использовать оба сервиса, чтобы продемонстрировать, как вы позволите серверу выбирать сервис в зависимости от страны, в которой вы находитесь. таргетинг. Это вполне может произойти в реальном мире, так как вы можете варьировать шлюзы, чтобы сэкономить на стоимости сообщения или в качестве резервной копии на случай, если первая пробная служба ответит кодом ошибки.
Шаг 2: Класс Clickatell
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. Это все, что делает класс, но все же лучше использовать класс, так как вы можете использовать его позже в любом приложении.
Шаг 3: Класс SmsMatrix
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.
Шаг 4: Интеграция контроллера
Хорошо, пришло время вернуться к нашему контроллеру регистрации. Перейдите к функции 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 с другой библиотекой в качестве резервной копии.
Шаг 5: перенаправление файлов cookie
Если после отправки 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 );
}
|
Таким образом, если вы зарегистрируетесь один раз и попытаетесь снова получить доступ к форме регистрации, вы получите ту же функцию активации, которая говорит вам ввести код активации. Давайте позаботимся об активации дальше.
Шаг 6: Функция активации
Теперь мы создадим процесс активации:
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>
|
Шаг 7: Окончательный код контроллера
Это последний код контроллера регистрации:
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-приложении следующего поколения! Спасибо за следование моему уроку и напишите в комментариях, что вы придумали!