Содержание
Широкое распространение на сайтах коммерческой тематики получили формы обратной связи типа "Заказать звонок". Пользователю сайта предлагается форма с полями: имя и телефон. Заполнив данные, пользователь ждет звонка на указанный номер телефона. А что если пользователь указал не свой телефон?
Или другая ситуация: пользователь сайта забыл свой пароль от учетной записи и в качестве альтернативы желает получить новый пароль на свой номер телефона (указанный в учетной записи). Естественно, он должен знать свой номер телефона и иметь его под рукой, так как SMS придет лишь на прикрепленный телефон.
Подобных ситуаций в современных интернет-реалиях множество, если вы администратор сайта, имеющий дело с учетными записями пользователей, Вам наверняка будет полезной такая функция как подтверждение номера (валидация) мобильного телефона по SMS.
Верификация телефона по SMS
Проверить принадлежность номера телефона пользователю достаточно просто: на номер телефона высылается одноразовый код в SMS сообщении с последующим подтверждением кода на сайте.
Форма для подтверждения телефона по SMS (которую мы сегодня сделаем собственноручно) выглядит примерно следующим образом:

Принцип работы
Основная цель данного скрипта - проверить введенный пользователем одноразовый пароль, отправленный по SMS на его номер телефона. Если пользователь вводит правильный проверочный код, телефон считается верифицированным, и администратор сайта может продолжить выполнение скриптов. Схематически проверка номера телефона выглядит так:
- Пользователь указывает имя и номер телефона;
- После нажатия кнопки "Выслать код", на указанный номер телефона SMS-шлюз высылает сгенерированный числовой пароль - код подтверждения (пароль генерируется исходя из суммы секретной фразы и номера телефона и состоит из 5 цифр);
- Скрипт ожидает ввода пользователем кода подтверждения. Скрипт успешно продолжает работу, если пользователь вводит правильный код;
Данный скрипт не является "готовым продуктом", он лишь иллюстрирует механизм верификации телефона по 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"> <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,'')"> <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 = "[email protected]"; //мыло админа для отчета $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 (опционально);
В коде обработчика, в случае успешной валидации телефона, изменяете код под свои нужды.
Все работает, спасибо!!! Подскажите, как сделать в act.php возможность ограничить отправку более 1 смс на один номер.
Это можно сделать на стороне СМС-шлюза. Перейдите в НАСТРОЙКИ - ТЕХНИЧЕСКИЕ НАСТРОЙКИ. Здесь можно задать лимиты:
- количество одинаковых сообщений на один номер в сутки
- количество любых сообщений на один номер в сутки
- включить защиту от мошенников, отправляющих большое количество кодов авторизации в короткое время
Здравствуйте! Всё отлично работает, спасибо за скрипт. А подскажите пожалуйста, после успешного введения кода смс так же во всплывающем окне появляется надпись Спасибо. Авторизация прошла успешно. Как сделать что бы она появлялась не в окне, а просто на странице сайта? Спасибо
На пальцах такое не объяснить! Скрипт выполняется в окне, все что вне окна, нужно делать на вашей стороне.
Не рабочий вариант. А так было много надежд.
И что у Вас не работает? Какая ошибка и в какой части кода?
Если взять этот код и заменить свои значения, то
1. Выводится уведомление об отправке, но код не приходит. Через интерфейс sms.ru всё нормально.
2. Даже при if (iconv_strlen($sms_tel)!==11) { не приходит,
При использовании хотя при if (iconv_strlen($sms_tel)!==12) { и использовании российской маски ругается именно здесь на Неверный номер телефона;
3. В sms.ru нет ни ошибок ни отправок.
Как-то так.
1) Все верно, длина $sms_tel должна быть равна длине Вашего телефонного номера - сумма только цифр (хотя при желании, эту проверку можете отключить)
2) Проверяется, нажата ли кнопка name "sendsms", поэтому в форме она должна быть (как в коде).
3) Проверьте, не заблокирована ли на Вашем хостинге функция file_get_contents (и такое может быть), которая инициирует SMS отправку.
4) В конце-концов, откройте консоль браузера и отследите момент отправки SMS, сразу увидите, на каком шаге ошибка.
Здравствуйте. у меня вопрос . для чего это надо кредитным организациям? Замучала она своими запросами... с Уважением Александр.
Для верификации вашего телефона, подтверждение, что он принадлежит именно Вам!
Спасибо за код-)