Подтверждение номера телефона по SMS

Широкое распространение на сайтах коммерческой тематики получили формы обратной связи типа "Заказать звонок". Пользователю сайта предлагается форма с полями: имя и телефон. Заполнив данные, пользователь ждет звонка на указанный номер телефона. А что если пользователь указал не свой телефон?

Или другая ситуация: пользователь сайта забыл свой пароль от учетной записи и в качестве альтернативы желает получить новый пароль на свой номер телефона (указанный в учетной записи). Естественно, он должен знать свой номер телефона и иметь его под рукой, так как SMS придет лишь на прикрепленный телефон.

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

Верификация телефона по SMS

Проверить принадлежность номера телефона пользователю достаточно просто: на номер телефона высылается одноразовый код в SMS сообщении с последующим подтверждением кода на сайте.

Форма для подтверждения телефона по SMS (которую мы сегодня сделаем собственноручно) выглядит примерно следующим образом:

Форма для подтверждения телефона по SMS
Форма для верификации телефона по одноразовому SMS

Принцип работы

Основная цель данного скрипта - проверить введенный пользователем одноразовый пароль, отправленный по SMS на его номер телефона. Если пользователь вводит правильный проверочный код, телефон считается верифицированным, и администратор сайта может продолжить выполнение скриптов. Схематически проверка номера телефона выглядит так:

  1. Пользователь указывает имя и номер телефона;
  2. После нажатия кнопки "Выслать код", на указанный номер телефона SMS-шлюз высылает сгенерированный числовой пароль - код подтверждения (пароль генерируется исходя из суммы секретной фразы и номера телефона и состоит из 5 цифр);
  3. Скрипт ожидает ввода пользователем кода подтверждения. Скрипт успешно продолжает работу, если пользователь вводит правильный код;

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

Использование SMS шлюза

Прежде всего, нам понадобится SMS шлюз, который будет отправлять SMS. Рекомендую "seozona.sms.ru" (проследуйте по ссылке для регистрации) - у него есть ежедневные бесплатные лимиты, что позволит в целом экономить на отправке SMS. Баланс шлюза всегда держите положительным, чтобы ваши SMS отрабатывали как часики!

После регистрации, в личном кабинете в меню найдите "Программистам", в этой вкладке найдете Ваш api_id. Он вам понадобится далее.

HTML форма валидации телефона

Создадим HTML форму для валидации телефона пользователя: модальное окно, поля для ввода и проверки данных (примерный вид как на скрине выше). Для этого создадим файл index.php c содержимым:

<html>
<head>
<meta charset="UTF-8">
<link rel='stylesheet' href='style.css' type='text/css' media='all' />
<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
</head>

<body>
<h1>Верификация телефона с помощью SMS</h1>

<label for="modal-1" id="popup_toggle" style="bottom:25px;right:10px;position:fixed;z-index: 9999;">
<div class="circlephone" style="transform-origin: center;"></div><div class="circle-fill" style="transform-origin: center;"></div><div class="img-circle" style="transform-origin: center;"><div class="img-circleblock" style="transform-origin: center;"></div></div></label>

<div class="modal">
<input class="modal-open" id="modal-1" type="checkbox" hidden>
<div class="modal-wrap" aria-hidden="true" role="dialog">
<label class="modal-overlay" for="modal-1"></label>
<div class="modal-dialog">
<div class="modal-header">
<h3>Верификация телефона по SMS</h3>
<label class="btn-close" for="modal-1" aria-hidden="true">×</label>
</div>
<center><label id="modal-ok">Спасибо. Авторизация прошла успешно</label></center>
<div class="modal-body">
<center>

<form method="post" action="act.php" target="ifr" id="fclose">
<table>
<tr><td>Ваше имя: <td><input name="names" maxlength="25" id=cyr>
<tr><td>Номер телефона: <td><input name="phone" id="input-callback-phone">&nbsp;
<input type="submit" name="sendsms" value="Выслать код" onmousedown="viewDiv()">
<tr><td><br/>
<tr id="div1"><td>Код подтверждения: <td><input name="code" maxlength="7" size="6" onkeyup="if (/\D/g.test(this.value)) this.value = this.value.replace(/\D/g,'')"> &nbsp; <input type="submit" name="ok" value="Подтвердить код">
<tr><td><br/>
<tr><td>
<td colspan="2" id="_out">
</table>
</form>
<iframe name="ifr" frameborder="0" height="0" width="0" style="visibility:hidden"></iframe>
</center>
</div>
</div>
</div>
</div>

<script type="text/javascript">
$(function() {
jQuery(function($) {
$('#cyr').on('keypress', function() {
var that = this;
setTimeout(function() {
var res = /[^a-zA-Zа-яА-ЯёЁ -]/g.exec(that.value);
that.value = that.value.replace(res, '');
}, 0);
});
});
})
function viewDiv(){
document.getElementById("div1").style.display = "table-row";
};
</script>
<script>!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):a("object"==typeof exports?require("jquery"):jQuery)}(function(a){var b,c=navigator.userAgent,d=/iphone/i.test(c),e=/chrome/i.test(c),f=/android/i.test(c);a.mask={definitions:{9:"[0-9]",a:"[A-Za-z]","*":"[A-Za-z0-9]"},autoclear:!0,dataName:"rawMaskFn",placeholder:"_"},a.fn.extend({caret:function(a,b){var c;if(0!==this.length&&!this.is(":hidden"))return"number"==typeof a?(b="number"==typeof b?b:a,this.each(function(){this.setSelectionRange?this.setSelectionRange(a,b):this.createTextRange&&(c=this.createTextRange(),c.collapse(!0),c.moveEnd("character",b),c.moveStart("character",a),c.select())})):(this[0].setSelectionRange?(a=this[0].selectionStart,b=this[0].selectionEnd):document.selection&&document.selection.createRange&&(c=document.selection.createRange(),a=0-c.duplicate().moveStart("character",-1e5),b=a+c.text.length),{begin:a,end:b})},unmask:function(){return this.trigger("unmask")},mask:function(c,g){var h,i,j,k,l,m,n,o;if(!c&&this.length>0){h=a(this[0]);var p=h.data(a.mask.dataName);return p?p():void 0}return g=a.extend({autoclear:a.mask.autoclear,placeholder:a.mask.placeholder,completed:null},g),i=a.mask.definitions,j=[],k=n=c.length,l=null,a.each(c.split(""),function(a,b){"?"==b?(n--,k=a):i[b]?(j.push(new RegExp(i[b])),null===l&&(l=j.length-1),k>a&&(m=j.length-1)):j.push(null)}),this.trigger("unmask").each(function(){function h(){if(g.completed){for(var a=l;m>=a;a++)if(j[a]&&C[a]===p(a))return;g.completed.call(B)}}function p(a){return g.placeholder.charAt(a<g.placeholder.length?a:0)}function q(a){for(;++a<n&&!j[a];);return a}function r(a){for(;--a>=0&&!j[a];);return a}function s(a,b){var c,d;if(!(0>a)){for(c=a,d=q(b);n>c;c++)if(j[c]){if(!(n>d&&j[c].test(C[d])))break;C[c]=C[d],C[d]=p(d),d=q(d)}z(),B.caret(Math.max(l,a))}}function t(a){var b,c,d,e;for(b=a,c=p(a);n>b;b++)if(j[b]){if(d=q(b),e=C[b],C[b]=c,!(n>d&&j[d].test(e)))break;c=e}}function u(){var a=B.val(),b=B.caret();if(o&&o.length&&o.length>a.length){for(A(!0);b.begin>0&&!j[b.begin-1];)b.begin--;if(0===b.begin)for(;b.begin<l&&!j[b.begin];)b.begin++;B.caret(b.begin,b.begin)}else{for(A(!0);b.begin<n&&!j[b.begin];)b.begin++;B.caret(b.begin,b.begin)}h()}function v(){A(),B.val()!=E&&B.change()}function w(a){if(!B.prop("readonly")){var b,c,e,f=a.which||a.keyCode;o=B.val(),8===f||46===f||d&&127===f?(b=B.caret(),c=b.begin,e=b.end,e-c===0&&(c=46!==f?r(c):e=q(c-1),e=46===f?q(e):e),y(c,e),s(c,e-1),a.preventDefault()):13===f?v.call(this,a):27===f&&(B.val(E),B.caret(0,A()),a.preventDefault())}}function x(b){if(!B.prop("readonly")){var c,d,e,g=b.which||b.keyCode,i=B.caret();if(!(b.ctrlKey||b.altKey||b.metaKey||32>g)&&g&&13!==g){if(i.end-i.begin!==0&&(y(i.begin,i.end),s(i.begin,i.end-1)),c=q(i.begin-1),n>c&&(d=String.fromCharCode(g),j[c].test(d))){if(t(c),C[c]=d,z(),e=q(c),f){var k=function(){a.proxy(a.fn.caret,B,e)()};setTimeout(k,0)}else B.caret(e);i.begin<=m&&h()}b.preventDefault()}}}function y(a,b){var c;for(c=a;b>c&&n>c;c++)j[c]&&(C[c]=p(c))}function z(){B.val(C.join(""))}function A(a){var b,c,d,e=B.val(),f=-1;for(b=0,d=0;n>b;b++)if(j[b]){for(C[b]=p(b);d++<e.length;)if(c=e.charAt(d-1),j[b].test(c)){C[b]=c,f=b;break}if(d>e.length){y(b+1,n);break}}else C[b]===e.charAt(d)&&d++,k>b&&(f=b);return a?z():k>f+1?g.autoclear||C.join("")===D?(B.val()&&B.val(""),y(0,n)):z():(z(),B.val(B.val().substring(0,f+1))),k?b:l}var B=a(this),C=a.map(c.split(""),function(a,b){return"?"!=a?i[a]?p(b):a:void 0}),D=C.join(""),E=B.val();B.data(a.mask.dataName,function(){return a.map(C,function(a,b){return j[b]&&a!=p(b)?a:null}).join("")}),B.one("unmask",function(){B.off(".mask").removeData(a.mask.dataName)}).on("focus.mask",function(){if(!B.prop("readonly")){clearTimeout(b);var a;E=B.val(),a=A(),b=setTimeout(function(){B.get(0)===document.activeElement&&(z(),a==c.replace("?","").length?B.caret(0,a):B.caret(a))},10)}}).on("blur.mask",v).on("keydown.mask",w).on("keypress.mask",x).on("input.mask paste.mask",function(){B.prop("readonly")||setTimeout(function(){var a=A(!0);B.caret(a),h()},0)}),e&&f&&B.off("input.mask").on("input.mask",u),A()})}})});</script>
<script>jQuery( function($){$("#input-callback-phone").mask("+38 (099) 999-99-99");});</script>
</body>
</html>

В этом файле обратим внимание на последние строчки, где указывается маска для ввода телефона. Для Украины: +38 (099) 999-99-99 для России: +7 (999) 999-99-99

И создадим файл со стилями CSS под названием "style.css" (положим его рядом с index.php)

#div1{
display: none;
}
#_out {
color: red;
}
#modal-ok {
display: none;
}
.modal-header h3 {
color: #555;
font-size: 20px;
font-weight: normal;
line-height: 1;
margin: 0;
}
.modal .btn-close {
color: #aaa;
cursor: pointer;
font-size: 50px;
text-decoration: none;
position: absolute;
right: 5px;
top: 0;
}
.modal .btn-close:hover {
color: red;
}
.modal-wrap:before {
content: "";
display: none;
background: rgba(0, 0, 0, .3);
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 101;
}
.modal-overlay {
bottom: 0;
display: none;
left: 0;
position: fixed;
right: 0;
top: 0;
z-index: 102;
}
.modal-open:checked ~ .modal-wrap:before,
.modal-open:checked ~ .modal-wrap .modal-overlay {
display: block;
}
.modal-open:checked ~ .modal-wrap .modal-dialog {
-webkit-transform: translate(-50%, 0);
-ms-transform: translate(-50%, 0);
-o-transform: translate(-50%, 0);
transform: translate(-50%, 0);
top: 20%;
}
.modal-dialog {
background: #fefefe;
border: none;
border-radius: 5px;
position: fixed;
width: 80%;
max-width: 500px;
left: 50%;
top: -100%;
-webkit-box-shadow: 0 15px 20px rgba(0,0,0,.22),0 19px 60px rgba(0,0,0,.3);
-moz-box-shadow: 0 15px 20px rgba(0,0,0,.22),0 19px 60px rgba(0,0,0,.3);
box-shadow: 0 15px 20px rgba(0,0,0,.22),0 19px 60px rgba(0,0,0,.3);
-webkit-transform: translate(-50%, -500%);
-ms-transform: translate(-50%, -500%);
-o-transform: translate(-50%, -500%);
transform: translate(-50%, -500%);
-webkit-transition: -webkit-transform 0.4s ease-out;
-moz-transition: -moz-transform 0.4s ease-out;
-o-transition: -o-transform 0.4s ease-out;
transition: transform 0.4s ease-out;
z-index: 103;
}
.modal-body {
padding: 20px;
}
.modal-body p {
margin: 0;
}
.modal-header,
.modal-footer {
padding: 20px 20px;
}
.modal-header {
border-bottom: #eaeaea solid 1px;
}
.modal-header h3 {
font-size: 20px;
margin: 0;
}
.btn {
background: #fff;
border: #555 solid 1px;
border-radius: 3px;
cursor: pointer;
display: inline-block;
font-size: 14px;
padding: 8px 15px;
text-decoration: none;
text-align: center;
min-width: 60px;
position: relative;
color: #2870a0;
}
.btn:hover, .btn:focus {
background: #f2f2f2;
color: #000000;
text-decoration: underline;
}
.btn-primary {
background: #428bca;
border-color: #357ebd;
color: #2870a0;
}
.btn-primary:hover{
background: #66A1D3;
text-decoration: underline;
}
.img-circle{background-color:#f2b026;box-sizing:content-box;-webkit-box-sizing:content-box;}
.circlephone{box-sizing:content-box;-webkit-box-sizing:content-box;border: 2px solid #f2b026;width:150px;height:150px;bottom:-25px;right:10px;position:absolute;-webkit-border-radius:100%;-moz-border-radius: 100%;border-radius: 100%;opacity: .5;-webkit-animation: circle-anim 2.4s infinite ease-in-out !important;-moz-animation: circle-anim 2.4s infinite ease-in-out !important;-ms-animation: circle-anim 2.4s infinite ease-in-out !important;-o-animation: circle-anim 2.4s infinite ease-in-out !important;animation: circle-anim 2.4s infinite ease-in-out !important;-webkit-transition: all .5s;-moz-transition: all .5s;-o-transition: all .5s;transition: all 0.5s;}
.circle-fill{box-sizing:content-box;-webkit-box-sizing:content-box;background-color:#f2b026;width:100px;height:100px;bottom:0px;right:35px;position:absolute;-webkit-border-radius: 100%;-moz-border-radius: 100%;border-radius: 100%;border: 2px solid transparent;-webkit-animation: circle-fill-anim 2.3s infinite ease-in-out;-moz-animation: circle-fill-anim 2.3s infinite ease-in-out;-ms-animation: circle-fill-anim 2.3s infinite ease-in-out;-o-animation: circle-fill-anim 2.3s infinite ease-in-out;animation: circle-fill-anim 2.3s infinite ease-in-out;-webkit-transition: all .5s;-moz-transition: all .5s;-o-transition: all .5s;transition: all 0.5s;}
.img-circle{box-sizing:content-box;-webkit-box-sizing:content-box;width:72px;height:72px;bottom: 14px;right: 49px;position:absolute;-webkit-border-radius: 100%;-moz-border-radius: 100%;border-radius: 100%;border: 2px solid transparent;opacity: .7;}
.img-circleblock{box-sizing:content-box;-webkit-box-sizing:content-box;width:72px;height:72px;background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABcAAAAnCAMAAADTjiM/AAAAkFBMVEUAAAD///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+WABnwAAAAL3RSTlMA/F/uDUwjB/esmHJTRjPl39fRzr+6sqeijn0E8cnEtq+FeWtjKh4YFdaciIE5FLd9ggsAAAEESURBVCjPbdPpdoIwEAVgQlgEZEdWrVat2vW+/9u1dJLDMO38/C4nZ2ZCHKqgL/WH86eSHIAOhHotAAW4ghvgN4hWHHbECurO3YVxhSv/vIQJgJb5BdYVctZRx5x3dAQrf/Hdojs+wBPZpkqyibdZkz/L1RzIt9IbqNkT6R35WfpAPkgfTY+h8FSp2Yub8EArGlV4WEH9O0BMXk3Ct2YRqfBbTkEvD4rI9y/CfUVBLHwyq9aZCFxQNeE8z+XdHujVJhiy61EDtcdapWbFDxnZgPzNerYHL/1YlrGq1LoXrfzk2Hq8ci++lvvZ8MBley2Yj2zs+7m0fPhcvyh/7E9tnPzc6Tc7fz7JKsL/WwAAAABJRU5ErkJggg==');background-position: center center;background-repeat:no-repeat;animation-name: tossing;-webkit-animation-name: tossing;animation-duration: 1.5s;-webkit-animation-duration: 1.5s;animation-iteration-count: infinite;-webkit-animation-iteration-count: infinite;}
.img-circle:hover{opacity: 1;}
@keyframes pulse {0% {transform: scale(0.9);opacity: 1;}
50% {transform: scale(1); opacity: 1; }
100% {transform: scale(0.9);opacity: 1;}}
@-webkit-keyframes pulse {0% {-webkit-transform: scale(0.95);opacity: 1;}
50% {-webkit-transform: scale(1);opacity: 1;}
100% {-webkit-transform: scale(0.95);opacity: 1;}}
@keyframes tossing {
0% {transform: rotate(-8deg);}
50% {transform: rotate(8deg);}
100% {transform: rotate(-8deg);}}
@-webkit-keyframes tossing {
0% {-webkit-transform: rotate(-8deg);}
50% {-webkit-transform: rotate(8deg);}
100% {-webkit-transform: rotate(-8deg);}}
@-moz-keyframes circle-anim {
0% {-moz-transform: rotate(0deg) scale(0.5) skew(1deg);opacity: .1;-moz-opacity: .1;-webkit-opacity: .1;-o-opacity: .1;}
30% {-moz-transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .5;-moz-opacity: .5;-webkit-opacity: .5;-o-opacity: .5;}
100% {-moz-transform: rotate(0deg) scale(1) skew(1deg);opacity: .6;-moz-opacity: .6;-webkit-opacity: .6;-o-opacity: .1;}}
@-webkit-keyframes circle-anim {
0% {-webkit-transform: rotate(0deg) scale(0.5) skew(1deg);-webkit-opacity: .1;}
30% {-webkit-transform: rotate(0deg) scale(0.7) skew(1deg);-webkit-opacity: .5;}
100% {-webkit-transform: rotate(0deg) scale(1) skew(1deg);-webkit-opacity: .1;}}
@-o-keyframes circle-anim {
0% {-o-transform: rotate(0deg) kscale(0.5) skew(1deg);-o-opacity: .1;}
30% {-o-transform: rotate(0deg) scale(0.7) skew(1deg);-o-opacity: .5;}
100% {-o-transform: rotate(0deg) scale(1) skew(1deg);-o-opacity: .1;}}
@keyframes circle-anim {
0% {transform: rotate(0deg) scale(0.5) skew(1deg);opacity: .1;}
30% {transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .5;}
100% {transform: rotate(0deg) scale(1) skew(1deg);
opacity: .1;}}
@-moz-keyframes circle-fill-anim {
0% {-moz-transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .2;}
50% {-moz-transform: rotate(0deg) -moz-scale(1) skew(1deg);opacity: .2;}
100% {-moz-transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .2;}}
@-webkit-keyframes circle-fill-anim {
0% {-webkit-transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .2; }
50% {-webkit-transform: rotate(0deg) scale(1) skew(1deg);opacity: .2; }
100% {-webkit-transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .2;}}
@-o-keyframes circle-fill-anim {
0% {-o-transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .2;}
50% {-o-transform: rotate(0deg) scale(1) skew(1deg);opacity: .2;}
100% {-o-transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .2;}}
@keyframes circle-fill-anim {
0% {transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .2;}
50% {transform: rotate(0deg) scale(1) skew(1deg);opacity: .2;}
100% {transform: rotate(0deg) scale(0.7) skew(1deg);opacity: .2;}}

Обработчик подтверждения номера телефона по SMS вынесем в отдельный файл "act.php". Его содержимое:

<?php
$api_id = "bs13a379-8599-c8e4-151d-5c4db6803dcc"; // Ваш api_id в sms.ru - берется в кабинете по ссылке ПРОГРАММИСТАМ
$secretfrase="moyafraza"; // секретная фраза для перегенерации уникального кода для телефонов
$tomail = "vash@mail.ru"; //мыло админа для отчета
$tophone = "795577984612"; //телефон админа для отчета
$tophone_sms = 1; // отправлять СМС админу = 0 - чтобы выключить
$tomail_sms = 1; // отправлять мыло админу = 0 - чтобы выключить

//ДАЛЬШЕ ТРОГАЕМ ЛИШЬ В СЛУЧАЕ ОСТРОЙ НЕОБХОДИМОСТИ

//обрабатываем последствия валидации номера
$sms_tel = preg_replace("/[^0-9]/", '', $_POST["phone"]);

echo "<script>parent.document.getElementById('_out').innerHTML = '";
//Заменяем пробелы в имени если указано ФИО
$sms_imeno = str_replace(' ','+', $_POST["names"]);

if (isset($_POST["sendsms"])) {

if (iconv_strlen($sms_tel)!==12) {
echo "Неверный номер телефона<br>";
echo "'</script>";
exit;
}

//отсылаем код
$body = file_get_contents("https://sms.ru/sms/send?api_id=".$api_id."&to=".$sms_tel."&msg=".ok_code($sms_tel)."&partner_id=17254&json=1");
$json = json_decode($body);
if ($json) { // Получен ответ от сервера
//print_r($json); // Для дебага
if ($json->status == "OK") {
foreach ($json->sms as $phone => $data) {
if ($data->status == "OK") {
echo "Код на номер $phone УСПЕШНО ОТПРАВЛЕН. ";
} else { // Ошибка в отправке
echo "Код на номер $phone НЕ ОТПРАВЛЕН. $data->status_text. ";
}
}
} else {
echo "Запрос не выполнился: $json->status_code. ";
}
} else {
echo "Запрос не выполнился. Не удалось установить связь с сервером. ";
}
echo "'</script>";
}

if (isset($_POST["ok"])) {
$oc = ok_code($sms_tel);
if ($oc == $_POST["code"]) { //если введенный код совпал с тем, что генерируется

//отправляем SMS админу
if ($tophone_sms == 1) {
$body = file_get_contents("https://sms.ru/sms/send?api_id=".$api_id ."&to=".$tophone."&msg=".$sms_imeno."+".$sms_tel."&partner_id=17254");
}

//отправляем на почту админу
if ($tomail_sms == 1) {
$headers = "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html; charset=UTF-8\r\n";
$headers .= "From: ".$_POST["names"]." <".$_POST["phone"].">"."\n";
$sub = "Заказ звонка";
$mes = "Заказан звонок от: ".$_POST["names"].": ".$_POST["phone"]."\n";
mail($tomail, $sub, $mes, $headers);
}
echo "'; parent.document.getElementById('fclose').style.display=\"none\"; parent.document.getElementById('modal-ok').style.display=\"block\"; </script>";
}
else
{ echo "Неверный код подтверждения";
echo "'</script>";
}
}

function ok_code($s) {
global $secretfrase;
$tel_plus_secret=$s.$secretfrase;
return hexdec(substr(md5($tel_plus_secret), 4, 4));
}
?>

В обработчике формы обратите внимание на конфигурацию параметров в первых строках: необходимо указать:

  • ваш api_id из личного кабинета SMS шлюза;
  • ваш номер телефона;
  • вашу почту;
  • возможность получения отчета по SMS или email (опционально);

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

Оцените материал:
Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (3 голоса, рейтинг: 5,00 из 5)
Загрузка...

Вячеслав - типичный интернетчикВячеслав Скоблей (ака files) - типичный интернетчик. Скитаюсь интернетом, пишу на PHP, увлекаюсь созданием веб-сайтов на Wordpress, решаю многочисленные проблемы, которые до появления интернета не существовали...

Специализируюсь на безопасности сайтов: защищаю сайты от атак и взломов, занимаюсь лечением вирусов на сайтах и профилактикой...

Наверняка у Вас есть вопросы, просьбы или пожелания. Не стесняйтесь спросить, я отвечаю всегда быстро...

9 комментарий

  1. Николай says:

    Здравствуйте! Всё отлично работает, спасибо за скрипт. А подскажите пожалуйста, после успешного введения кода смс так же во всплывающем окне появляется надпись Спасибо. Авторизация прошла успешно. Как сделать что бы она появлялась не в окне, а просто на странице сайта? Спасибо

    1. Вячеслав Скоблей says:

      На пальцах такое не объяснить! Скрипт выполняется в окне, все что вне окна, нужно делать на вашей стороне.

  2. Сергей says:

    Не рабочий вариант. А так было много надежд.

    1. Вячеслав Скоблей says:

      И что у Вас не работает? Какая ошибка и в какой части кода?

      1. Сергей says:

        Если взять этот код и заменить свои значения, то
        1. Выводится уведомление об отправке, но код не приходит. Через интерфейс sms.ru всё нормально.
        2. Даже при if (iconv_strlen($sms_tel)!==11) { не приходит,
        При использовании хотя при if (iconv_strlen($sms_tel)!==12) { и использовании российской маски ругается именно здесь на Неверный номер телефона;
        3. В sms.ru нет ни ошибок ни отправок.
        Как-то так.

        1. Вячеслав Скоблей says:

          1) Все верно, длина $sms_tel должна быть равна длине Вашего телефонного номера - сумма только цифр (хотя при желании, эту проверку можете отключить)
          2) Проверяется, нажата ли кнопка name "sendsms", поэтому в форме она должна быть (как в коде).
          3) Проверьте, не заблокирована ли на Вашем хостинге функция file_get_contents (и такое может быть), которая инициирует SMS отправку.
          4) В конце-концов, откройте консоль браузера и отследите момент отправки SMS, сразу увидите, на каком шаге ошибка.

          1. Александр says:

            Здравствуйте. у меня вопрос . для чего это надо кредитным организациям? Замучала она своими запросами... с Уважением Александр.

            1. Вячеслав Скоблей says:

              Для верификации вашего телефона, подтверждение, что он принадлежит именно Вам!

  3. says:

    Спасибо за код-)

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *