Maak een sms-aanmeldingsformulier deel 2

Welkom bij deel twee van deze tutorial over het gebruik van sms-technologie om een ​​aanmeldingsformulier te maken. Vorige, in deel een van deze serie, gebruikten we HTML, JavaScript, MySQL en PHP om een ​​aanmeldingsformulier te maken. In deze zelfstudie bespreken we de integratie met een SMS-gateway en de code die nodig is om het aanmeldingsformulier te verwerken.


Stap 1: waar we zijn gebleven

In het eerste deel van deze serie hebben we twee functies gecreëerd: aanmelden en activeren. Zoals de namen aangeven, wordt de eerste gebruikt voor het aanmelden van formulieren en de tweede voor het invoeren van de activeringscode. We gaan verder met demonstreren hoe we twee verschillende sms-gatewayservices kunnen gebruiken voor het verzenden van berichten. Wat is een sms-gateway? Het is in wezen een service die toegang biedt tot mobiel netwerkverkeer met een of meerdere gsm-providers. Dus waarom zou u twee verschillende diensten gebruiken? Mijn eerste keuze was Clickatell, maar om in de VS sms-berichten te verzenden zonder een shortcode, moest ik een andere dienst zoeken. SmsMatrix is ​​een geweldige service die berichten kan verzenden in veel verschillende landen, waaronder de VS. Ik had zojuist alleen SmsMatrix kunnen gebruiken, maar in plaats daarvan zal ik beide services gebruiken om te demonstreren hoe je de server in staat zou stellen een service te selecteren op basis van het land waar je bent gericht op. Dit kan in de echte wereld gebeuren, omdat u van gateways kunt variëren om de kosten per bericht te besparen of als back-up voor het geval de eerste service die u probeert reageert met een foutcode.


Stap 2: De Clickatell-klasse

Clickatell is een van de grootste beschikbare online sms-gateways. Volgens de informatie op hun website ondersteunt Clickatell momenteel 221 landen en territoria. Ze hebben veel functies, waaronder eenvoudige sms, tweerichtings-sms en shortcode-sms. Ze hebben ook een indrukwekkende gebruikersbasis en bedienen meer dan 10.000 klanten over de hele wereld. Sommige van deze klanten zijn CNN, Continental Airlines, Vodafone, Oracle, Nokia en andere grote spelers in IT en business. Het leuke van Clickatell is dat je je kunt aanmelden voor een gratis account en 10 gratis credits kunt gebruiken voor het verzenden van sms-berichten terwijl je aan het leren bent. SMS-gateways werken meestal met credits die u koopt om sms-berichten te verzenden. Het aantal credits dat een sms-bericht kost, is afhankelijk van waar (geografisch) het bericht is verzonden. Ga naar Clickatell en meld je aan voor een gratis account. Wanneer u met de testcredits verzendt, wordt de inhoud van het bericht vervangen door informatie over testen, maar dat zou goed moeten werken voor onze behoeften. Wanneer u zich aanmeldt, moet u voorzichtig zijn om u aan te melden voor Clickatell Central en selecteert u Coverage met uitzondering van de VS, omdat u een speciaal shortcode-nummer nodig hebt voor verzending naar de VS..

Nadat u uw account hebt geactiveerd en bent aangemeld, klikt u op de koppeling 'klik hier om een ​​nieuwe verbinding te maken'. Hiermee wordt een api_id ingesteld waarmee je een sms kunt versturen.

Selecteer HTTP als verbindingstype. Clickatell biedt veel opties voor het verzenden van sms-berichten, waarvan de gemakkelijkste is om een ​​e-mail naar een bepaald adres te sturen. Ze ondersteunen een heleboel protocollen zoals XML, SOAP en zelfs FTP voor bulkberichten. De HTTP-verbinding is alles wat we nodig hebben.

Ga door en klik op API-ID ophalen. U krijgt een pagina met een voorbeeldstring. Kopieer de voorbeeldstring naar uw browser en vervang de gebruikersnaam, het wachtwoord en de parameters door uw gebruikersnaam, wachtwoord en mobiele telefoonnummer. Je krijgt een resultaat in de browser met een "OK" of "ERR" bericht gevolgd door een code. Dit is wat we nodig hebben om onze Clickatell-bibliotheek te bouwen.

Maak een nieuw bestand met de naam om te beginnen met het maken van de Clickatell-bibliotheek Clickatell_api.php in de application / bibliotheken map. Voer de volgende code in:

 class Clickatell_api // verander dit naar de daadwerkelijke gebruiker en het wachtwoord private $ username = 'username'; privé $ wachtwoord = 'wachtwoord'; private $ api_id = 'api id'; privé $ url = 'http://api.clickatell.com/http/sendmsg'; openbare functie send_sms ($ phone, $ text) $ url = $ this-> url. '? user ='. $ this-> gebruikersnaam. '& wachtwoord ='. $ dit-> wachtwoord. '& api_id ='. $ this-> api_id. '& to ='. $ telefoon. '& text ='. urlencode ($ tekst); $ r = @bestand ($ url); $ res = substr ($ r [0], 0, 2); if ($ res == 'ER') return false;  return true; 

De code is vrij duidelijk, maar voordat we deze gaan beoordelen, moet u er rekening mee houden dat dit script zich in een productieomgeving in een map buiten de webroot moet bevinden of op uw serverconfiguratie moet vertrouwen om openbare toegang te voorkomen. Het laatste dat u wilt, is dat iemand dit script rechtstreeks vanuit een browser of een ander script kan aanroepen.

In het bovenstaande voorbeeld maken we een klasse Clickatell_api aan met een paar leden: gebruikersnaam, wachtwoord, api_id en de URL waarop we zullen bouwen. Vervang door uw eigen gebruikersnaam, wachtwoord en api_id. In de klas hebben we een single verstuur sms() functie die een telefoonnummer en het te verzenden SMS-bericht accepteert. De klasse bouwt de URL op door de groepsleden aan elkaar te plakken en een laatste URL te vormen. We gebruiken urlencode () om de tekst in de URL te coderen en deze later door te geven het dossier(). Natuurlijk, voor servers waarop de functie bestand () is geblokkeerd, kunt u CURL gebruiken, maar dat is niet het punt van de zelfstudie. We krijgen dan het resultaat en gebruiken subtr () om de eerste twee tekens van de eerste regel te krijgen. Als de reactie 'ER' is, die afkomstig is van ERROR, geven we false terug, anders keren we true terug. Dit is alles wat de klasse doet, maar het is nog steeds beter om een ​​klasse te gebruiken, omdat je deze later in elke toepassing kunt hergebruiken.


Stap 3: De SmsMatrix-klasse

SmsMatrix is ​​een andere krachtige service. Deze heeft veel meer geavanceerde dingen, zoals tekst-naar-stem conversie, programmeerbare respons ("druk alsjeblieft op 2 voor ja of 1 voor nee"), en stemberichten, maar het belangrijkste voor ons is dat het niet vereisen dat je een shortcode hebt om sms-berichten te verzenden in de VS Ze hebben ook een gratis accountoptie waarmee je 5 credits krijgt om je sms-app te testen. De installatie met SmsMatrix is ​​eenvoudiger dan Clickatell: u maakt het account en vervolgens gebruikt u uw gebruikersnaam en wachtwoord om het SMS-bericht te verzenden. Je hebt de sms-verzendgids nodig, maar het idee is hetzelfde: je vormt een speciale URL en hebt toegang tot PHP. Laten we hiervoor een smsmatrix_api-bibliotheek maken. Maak een bestand met de naam Smsmatrix_api.php in de application / bibliotheken map en schrijf het volgende:

 class Smsmatrix_api // verander dit naar de daadwerkelijke gebruiker en het wachtwoord private $ username = 'username'; privé $ wachtwoord = 'wachtwoord'; privé $ url = 'http://www.smsmatrix.com/matrix'; openbare functie send_sms ($ phone, $ text) $ url = $ this-> url. '? gebruikersnaam ='. urlencode ($ this-> gebruikersnaam). '& wachtwoord ='. urlencode ($ dit-> wachtwoord). '& phone ='. $ telefoon. '& txt ='. urlencode ($ tekst); $ r = @bestand ($ url); $ res = substr ($ r [2], 11); if ($ res> 399) return false;  return true; 

Nogmaals, we maken een klasse met de gebruikersnaam, het wachtwoord en de leden en maken hetzelfde verstuur sms() functie. We noemden het hetzelfde, zodat de klassen onderling uitwisselbaar waren. We maken de laatste URL, waartoe we toegang hebben het dossier() en we krijgen de resultaatcode. De resultaatcode staat in de 3e regel van de resultaatstring, dus gebruiken we subtrs ($ r [2], 11) om het getal achter de string 'STATUSCODE =' te krijgen. Ik kreeg de foutcodes uit de pdf-gids en eigenlijk is elke code onder 399 succesvol, dus we keren terug naar waar, anders keren we false terug.


Stap 4: Controller-integratie

Ok, het is tijd om terug te gaan naar onze aanmeldingscontroller. Ga naar de functie werkwijze() en voer de volgende code in na het invoegen van de database:

 // verstuur auth SMS als in US if ($ this-> input-> post ('country') == 1) $ this-> load-> library ('smsmatrix_api'); $ this-> smsmatrix_api-> send_sms ($ signup ['mobiel'], $ signup ['activation']);  else // when not USA $ this-> load-> library ('clickatell_api'); $ this-> clickatell_api-> send_sms ($ signup ['mobiel'], $ signup ['activation']); 

Eerst controleren we de landcode. Als deze 1 is (dat wil zeggen Verenigde Staten), gebruiken we SmsMatrix, dus we laden het met $ This-> load-> library ( 'smsmatrix_api'). Als het land geen Verenigde Staten is, laden we het clickatell_api. Hoe dan ook, we gebruiken verstuur sms() om de activeringscode naar het mobiele nummer te verzenden. U ziet dat het mobiele nummer eerder in de database is ingevoegd door de landwaarde (die het voorvoegsel voor dat land bevat) samen te voegen met het mobiele nummer. We kunnen de tweede parameter in de bibliotheekbelasting eigenlijk voltooien om deze met een bepaalde naam te openen, en alleen send in de bibliotheek gebruiken:

 // stuur auth sms als 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 ['mobiel'], $ signup ['activation']);

Op deze manier laden we alleen de juiste bibliotheek met dezelfde naam, die het benadert met 'sms_api', maar het is hetzelfde. Eigenlijk delen de twee bibliotheken dezelfde interface. Verder, als u false krijgt als een retourwaarde, kunt u de sms met de andere bibliotheek als back-up verzenden.


Stap 5: Cookie doorverwijzing

Als we een 'ondertekend' cookie instellen na het verzenden van het SMS-bericht, kunnen we dit later gebruiken om te voorkomen dat meerdere berichten worden verzonden. We moeten het op zo'n manier doen dat wanneer de gebruiker weg navigeert van het aanmeldingsformulier en later teruggaat om te proberen opnieuw in te loggen, we hem automatisch doorverwijzen naar de activeringsfunctie. Voeg dit toe aan de bovenkant van de inschrijven() functie:

 function index () if (get_cookie ('signed')) redirect ('signup / activate');  $ this-> config-> load ('countries', true); $ data ['landen'] = $ this-> config-> item ('landen'); $ this-> load-> view ('signup', $ data); 

Op deze manier, als u zich eenmalig aanmeldt en u probeert opnieuw toegang te krijgen tot het aanmeldingsformulier, krijgt u dezelfde activeringsfunctie die aangeeft dat u de activeringscode moet invoeren. Laten we eerst de activering verzorgen.


Stap 6: De activeringsfunctie

We maken nu het activeringsproces:

 function activate () if (! get_cookie ('signed')) redirect ('signup');  $ data ['error'] = "; if ($ this-> input-> post ('signup')) // indien verzonden $ where = array ('uid' => get_cookie ('signed'), ' activatie '=> $ this-> input-> post (' code ')); $ result = $ this-> db-> where ($ where) -> count_all_results (' users '); if ($ result < 1 ) $data['error'] = '
De autorisatiecode is niet correct!
'; else delete_cookie ('signed'); $ this-> db-> set (array ('active' => 1, 'activation' => ")) -> where ('uid', get_cookie ('signed')) -> update ('gebruikers'); redirect ('signup / success'); $ this-> load-> view ('activate', $ data);

Laat me uitleggen wat hier aan de hand is: ik doe het omgekeerde, als de cookie niet is ingesteld, word ik doorverwezen naar het aanmelden. Vervolgens heb ik de foutmelding ingesteld op ", omdat we nu geen fout hebben. Als het inschrijfpostveld is ingesteld (dat wil zeggen als het formulier is ingediend), zoek ik een item in de tabel met het ID van de cookie en de activering gelijk aan de ingediende code Het is belangrijk om nooit een ID van 0 in de database te hebben, omdat dit de cookie zou faken, en er zou een omleidingslus zijn. Deze controle kan worden gedaan, maar het is beter om zet het in de database.

Ik tel de geretourneerde rijen en als ik er geen krijg, toon ik een foutmelding dat de autorisatie niet correct is. Omdat de gebruiker alleen een bepaalde activeringscode kan hebben, zal de database bij het invoeren van de verkeerde code geen rij vinden en 0 retourneren. Als we een rij vinden, verwijderen we de cookie, omdat we deze niet meer nodig hebben, we zetten de actieve kolom op 1 en de activering op "en werken de tabel bij. Vanaf dit punt is de gebruiker geactiveerd en we weten zeker dat het zijn telefoon is en we kunnen waarschijnlijk een speciale aanbieding als sms versturen. stuur de gebruiker door naar de succes() functie, wat een eenvoudige weergave is met dit succesbericht:

    
Activeren

Succes

Bedankt, je account is geactiveerd!

Stap 7: De definitieve controlecode

Dit is de code voor de definitieve aanmeldingscontroller:

 class Signup breidt Controller uit function Signup () parent :: Controller ();  function index () if (get_cookie ('signed')) redirect ('signup / activate');  $ this-> config-> load ('countries', true); $ data ['landen'] = $ this-> config-> item ('landen'); $ 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 ('land'); $ signup ['mobiel'] = $ this-> input-> post ('land'). $ this-> input-> post ('mobiel'); // genereer de unieke activeringscode mt_rand (); $ signup ['activation'] = rand (11111, 99999); // invoegen in db $ this-> db-> insert ('users', $ signup); // stuur auth sms // if in United States if ($ this-> input-> post ('country') == 1) $ this-> load-> library ('smsmatrix_api'); $ this-> smsmatrix_api-> send_sms ($ signup ['mobiel'], $ signup ['activation']);  else $ this-> load-> library ('clickatell_api'); $ this-> clickatell_api-> send_sms ($ signup ['mobiel'], $ signup ['activation']);  set_cookie ('signed', $ this-> db-> insert_id (), 86500); // redirect redirect ('signup / activate');  else $ this-> config-> load ('countries', true); $ data ['landen'] = $ this-> config-> item ('landen'); $ this-> load-> view ('signup', $ data);  functie check_email_exists ($ email) $ rs = $ this-> db-> where ('email', $ email) -> count_all_results ('users'); $ this-> form_validation-> set_message ('check_email_exists', 'Sorry, deze e-mail bestaat al!'); als ($ rs < 1 ) return true;  return false;  function activate() if( !get_cookie('signed') ) redirect('signup');  $data['error'] ="; if( $this->input-> post ('signup')) // indien verzonden $ where = array ('uid' => get_cookie ('signed'), 'activation' => $ this-> input-> post ('code') ); $ result = $ this-> db-> where ($ where) -> count_all_results ('users'); if ($ resultaat < 1 ) $data['error'] = '
De autorisatiecode is niet correct!
'; else delete_cookie ('signed'); $ this-> db-> set (array ('active' => 1, 'activation' => ")) -> where ('uid', get_cookie ('signed')) -> update ('gebruikers'); redirect ('signup / success'); $ this-> load-> view ('activate', $ data); function success () $ this-> load-> view ('success');

Conclusie

Bedankt voor het lezen van deze tutorial! Omdat de uitkomst van deze tutorial klein is en testen duur is, hebben we geen preview, maar u kunt dit uitvoeren vanuit de bronnen die bij uw eigen testaccounts zijn geleverd. Dit is slechts een klein deel van wat gedaan kan worden met Clickatell en SmsMatrix. Er zijn veel dingen die u kunt proberen, zoals het verzenden naar meerdere telefoons, massale reclame, e-mailen van een spraakbestand om een ​​spraakbericht te maken, TTS-berichten, enzovoort. Ik hoop dat je mijn tutorial leuk vond en ik hoop dat je het gebruikt in je sms-applicatie van de volgende generatie! Bedankt voor het volgen van mijn tutorial en schrijf in de comments wat je bedacht hebt!