Heim > Backend-Entwicklung > PHP-Tutorial > So implementieren Sie die SMS-Registrierung in Larav

So implementieren Sie die SMS-Registrierung in Larav

不言
Freigeben: 2023-04-01 06:28:02
Original
1348 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich der Beispielcode für die SMS-Registrierung mit Laravel unter Verwendung der Yunpian SMS-Plattform vorgestellt. Der Inhalt ist ziemlich gut und dient als Referenz.

Ich arbeite in meinem Unternehmen an einem Einkaufszentrum-Projekt. Da es nur ein Backend gibt, bin ich an der Reihe, mich per SMS zu registrieren. Am Anfang war ich innerlich noch etwas schwach, aber zum Glück gab es ein Buch, geschrieben vom Laravel-chinaMeister der Communitysummer. Ich habe darin auf die Schreibmethode und die Ideen hingewiesen und das easy-sms-Paket verwendet. Es hat nur einen halben Nachmittag gedauert, bis ich es am Abend mit allen geteilt habe.

1. Bestimmen Sie den SMS-Betreiber

Ich habe gesehen, dass die Großen alle Yunqian verwenden, also habe ich nicht gezögert, es zu verwenden Wir empfehlen Unternehmen, diese SMS-Plattform zu nutzen, es sind jedoch auch andere verfügbar.

Registrieren Sie zunächst selbst ein Konto und suchen Sie dann dieses

Klicken Sie hier, um den Zugriff zu starten und den Anfängerberatungsprozess abzuschließen.

Die zweite Unterschrift und die Vorlage müssen ausgefüllt werden, ähnlich wie ich es unten ausgefüllt habe

Es ist zu beachten, dass diese Vorlage genau mit dem Textnachrichteninhalt übereinstimmen muss, den Sie bei Verwendung des easy-sms-Pakets festgelegt haben, andernfalls wird ein Fehler gemeldet.

Denken Sie außerdem daran, APIKEY zu besorgen. Konfigurieren Sie es zu diesem Zeitpunkt in env.

# 云片
YUNPIAN_API_KEY=9c60bdd**********
Nach dem Login kopieren

2. Installieren Sie das easy-sms-Paket

Verwenden Sie dieses Paket, um die SMS-Versandfunktion schnell zu implementieren.

composer require "overtrue/easy-sms"
Nach dem Login kopieren

Da diese Komponente noch nicht über Laravels ServiceProvider verfügt, können wir sie aus Gründen der Benutzerfreundlichkeit selbst kapseln.

Fügen Sie zunächst die Datei easysms.php im Konfigurationsverzeichnis hinzu.

Fügen Sie in config/easysms.php den folgenden Inhalt ein.

<?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;),
  ],
 ],
];
Nach dem Login kopieren

Dann erstellen Sie einen ServiceProvider

php artisan make:provider EasySmsServiceProvider
Nach dem Login kopieren

Ändern Sie die Datei 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;);
 }
}
Nach dem Login kopieren

Endlich in config/app.php in providers Fügen Sie den gerade erstellten Dienst hinzu und schreiben Sie ihn ein, 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
Nach dem Login kopieren

3 Erstellen Sie die Route und den entsprechenden Controller

Erstellen Sie zuerst die Route, wir Wir benötigen eine Ajax-Methode, um den SMS-Bestätigungscode anzufordern, und eine logische Methode, um die Registrierung zu bestätigen, wie folgt:

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;);
 });
Nach dem Login kopieren

Die Route wird erstellt, wir verwenden den Befehl, um den Controller zu generieren

php artisan make:controller Home\VerificationCodesController
Nach dem Login kopieren

und dann direkt darin schreiben register und ajaxregister Methoden

Codelogik

Ändern Sie die Datei

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);
 }
Nach dem Login kopieren

Auf diese Weise kann der Benutzer die Textnachricht empfangen, und das Frontend sollte diese speichern key und beim Absenden des Registrierungsformulars zur Ermittlung an das Backend übergeben ob es abgelaufen ist. Im Folgenden wird festgestellt, ob es abgelaufen ist und ob der Bestätigungscode falsch ist.

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;);
 
}
Nach dem Login kopieren

Das Obige hash_equals ist ein String-Vergleich, der Timing-Attacken verhindern kann~

Das Obige ist mein gesamter Prozess.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Verwenden Sie Laravel, um die Gravatar-Avatar-Adresse zu generieren

So erstellen Sie einen benutzerdefinierten Handwerker-Make-Befehl über Laravel Erstellen Sie eine neue Klassendatei

Das obige ist der detaillierte Inhalt vonSo implementieren Sie die SMS-Registrierung in Larav. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage