Maison  >  Article  >  développement back-end  >  Comment mettre en œuvre l'enregistrement SMS dans Larav

Comment mettre en œuvre l'enregistrement SMS dans Larav

不言
不言original
2018-06-13 16:31:271342parcourir

Cet article présente principalement l'exemple de code pour l'enregistrement SMS à l'aide de Laravel, en utilisant la plateforme SMS Yunpian. Le contenu est assez bon, je vais le partager avec vous maintenant et le donner comme référence.

Je travaille sur un projet de centre commercial dans mon entreprise Comme il n'y a qu'un seul backend, c'est à mon tour de m'inscrire par SMS. Au début, j'étais encore un peu faible intérieurement, mais heureusement il y avait un livre écrit par le Laravel-chinamaître de la communauté summer. J'y ai fait référence à sa méthode d'écriture et à ses idées, et j'ai utilisé le package easy-sms. Cela ne m'a pris qu'une demi-après-midi pour le réaliser en douceur. Je le partagerai avec tout le monde dans la soirée.

1. Déterminer l'opérateur SMS

J'ai vu que les grands utilisent tous Yunqian, donc je n'ai pas hésité à l'utiliser C'est Il est recommandé aux entreprises d'utiliser cette plateforme de messagerie texte, mais d'autres sont également disponibles.

Enregistrez d'abord un compte vous-même, puis trouvez ceci

Cliquez pour commencer à accéder et terminer le processus d'orientation des novices.

La deuxième signature et le modèle doivent être remplis, similaire à ce que j'ai rempli ci-dessous

Il est à noter que ce modèle doit être exactement le même que le contenu du message texte que vous avez défini lors de l'utilisation du package easy-sms, sinon une erreur sera signalée.

N'oubliez pas non plus de vous procurer APIKEY. À ce moment-là, configurez-le dans env.

# 云片
YUNPIAN_API_KEY=9c60bdd**********

2. Installez le package easy-sms

Utilisez ce package pour implémenter rapidement la fonction d'envoi de SMS.

composer require "overtrue/easy-sms"

Comme ce composant n'a pas encore le ServiceProvider de Laravel, pour la commodité d'utilisation, nous pouvons l'encapsuler nous-mêmes.

Ajoutez d'abord le fichier easysms.php dans le répertoire de configuration

Dans config/easysms.php remplissez le contenu suivant.

<?php
return [
 // HTTP 请求的超时时间(秒)
 &#39;timeout&#39; => 5.0,

 // 默认发送配置
 &#39;default&#39; => [
  // 网关调用策略,默认:顺序调用
  &#39;strategy&#39; => \Overtrue\EasySms\Strategies\OrderStrategy::class,

  // 默认可用的发送网关
  &#39;gateways&#39; => [
   &#39;yunpian&#39;,
  ],
 ],
 // 可用的网关配置
 &#39;gateways&#39; => [
  &#39;errorlog&#39; => [
   &#39;file&#39; => &#39;/tmp/easy-sms.log&#39;,
  ],
  &#39;yunpian&#39; => [
   &#39;api_key&#39; => env(&#39;YUNPIAN_API_KEY&#39;),
  ],
 ],
];

Créez ensuite un ServiceProvider

php artisan make:provider EasySmsServiceProvider

Modifiez le fichier app/providers/EasySmsServiceProvider.php

<?php

namespace App\Providers;

use Overtrue\EasySms\EasySms;
use Illuminate\Support\ServiceProvider;

class EasySmsServiceProvider extends ServiceProvider
{
 /**
  * Bootstrap the application services.
  *
  * @return void
  */
 public function boot()
 {
  //
 }

 /**
  * Register the application services.
  *
  * @return void
  */
 public function register()
 {
  $this->app->singleton(EasySms::class, function ($app) {
   return new EasySms(config(&#39;easysms&#39;));
  });

  $this->app->alias(EasySms::class, &#39;easysms&#39;);
 }
}

Enfin config/app.php Ajoutez le service que vous venez de créer dans providers et écrivez-le, AppProvidersEasySmsServiceProvider::class,

App\Providers\AppServiceProvider::class,
App\Providers\AuthServiceProvider::class,
// App\Providers\BroadcastServiceProvider::class,
App\Providers\EventServiceProvider::class,
App\Providers\RouteServiceProvider::class,

App\Providers\EasySmsServiceProvider::class, //easy-sms

3. Créez des itinéraires et les contrôleurs correspondants

.

Créez d'abord l'itinéraire. Nous avons besoin d'une méthode ajax pour demander le code de vérification SMS et d'une méthode logique pour confirmer l'enregistrement, comme suit :

Route::group([&#39;prefix&#39; => &#39;verificationCodes&#39;, &#39;as&#39; => &#39;verificationCodes.&#39;], function() {
  Route::post(&#39;register&#39;, &#39;VerificationCodesController@register&#39;)->name(&#39;register&#39;);
  Route::get(&#39;ajaxregister&#39;, &#39;VerificationCodesController@ajaxregister&#39;)->name(&#39;ajaxregister&#39;);
 });

Une fois l'itinéraire créé, nous utilisons la commande. pour générer le contrôleur

php artisan make:controller Home\VerificationCodesController

Ecrivez les méthodes register et ajaxregister directement dedans

Code logique

Modifier le fichier

app/Home/VerificationCodesController.php

<?php
.
.
.
use Overtrue\EasySms\EasySms;
use App\Models\System\User;
class VerificationCodesController extends Controller
{
 // 这里验证就不写了。
 public function ajaxregister(VerificationCodeRequest $request, EasySms $easySms)
 {
  //获取前端ajax传过来的手机号
  $phone = $request->phone;
  
  // 生成4位随机数,左侧补0
  $code = str_pad(random_int(1, 9999), 4, 0, STR_PAD_LEFT);
  
  try {
   $result = $easySms->send($mobile, [
    &#39;content&#39; => "【安拾商城】您的验证码是{$code}。如非本人操作,请忽略本短信"
   ]);
  } catch (Overtrue\EasySms\Exceptions\NoGatewayAvailableException $exception) {
   $response = $exception->getExceptions();
   return response()->json($response);
  }
  
  //生成一个不重复的key 用来搭配缓存cache判断是否过期
  $key = &#39;verificationCode_&#39; . str_random(15);
  $expiredAt = now()->addMinutes(10);
  
  // 缓存验证码 10 分钟过期。
  \Cache::put($key, [&#39;mobile&#39; => $mobile, &#39;code&#39;=> $code], $expiredAt);
  
  return response()->json([
   &#39;key&#39; => $key,
   &#39;expired_at&#39; => $expiredAt->toDateTimeString(),
  ], 201);
 }

De cette façon, l'utilisateur peut recevoir le message texte, et le front-end doit l'enregistrer key et transmettez-le au backend pour jugement lors de la soumission du formulaire d’inscription. A-t-il expiré ? Ce qui suit consiste à déterminer s'il a expiré et si le code de vérification est erroné.

public function register(VerificationCodeRequest $request)
{
 //获取刚刚缓存的验证码和key
 $verifyData = \Cache::get($request->verification_key);
 
 //如果数据不存在,说明验证码已经失效。
 if(!$verifyData) {
  return response()->json([&#39;status&#39; =>0, &#39;message&#39;=> &#39;短信验证码已失效&#39;], 422);
 }
 
 // 检验前端传过来的验证码是否和缓存中的一致
 if (!hash_equals($verifyData[&#39;code&#39;], $request->verification_code) {
  return redirect()->back()->with(&#39;warning&#39;, &#39;短信验证码错误&#39;);
 }
 
 $user = User::create([
  &#39;mobile&#39; => $verifyData[&#39;mobile&#39;],
  &#39;password&#39; => bcrypt($request->password),
 ]);

 // 清除验证码缓存
 \Cache::forget($request->verification_key);

 return redirect()->route(&#39;login&#39;)->with(&#39;success&#39;, &#39;注册成功!&#39;);
 
}

Ce qui précède hash_equals est une comparaison de chaînes qui peut empêcher les attaques temporelles~

Ce qui précède est l'ensemble de mon processus.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'étude de chacun. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Utilisez Laravel pour générer l'adresse de l'avatar Gravatar

Comment créer une commande de création artisanale personnalisée via Laravel Créer un nouveau fichier de classe

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn