Larave如何實現簡訊註冊

不言
發布: 2023-04-01 06:28:02
原創
1342 人瀏覽過

這篇文章主要介紹了Laravel實現簡訊註冊的範例程式碼,使用雲片簡訊平台,內容挺不錯的,現在分享給大家,也給大家做個參考。

正在公司做一個商城項目,由於只有一個後台,所以註冊用短信註冊也就輪到我來做的。剛開始,我內心還是有點虛的,還好有 Laravel-china 社群的 summer 大神,寫的書。在裡面參考了它的寫法和思路,並且用了 easy-sms 包,這才用了半個下午的時間,順利的做出來了,晚上趕緊和大家分享一波了。

1、確定簡訊運營商

我看到大佬都是用的雲片,我也就毫不猶豫的大力推薦公司用這個簡訊平台了,不過其他的也可以咯。

首先自己註冊一個帳號,然後找到這個

 

點擊開始接入,完成新手引導過程。

 

第二部的簽章和範本必須填寫,類似我下面填寫的這樣

## 

值得注意的是這個模板必須和你到時候用

easy-sms 包的時候,設定的短信內容必須和這個一模一樣,不然會報錯的。

還有就是記得一定要拿到APIKEY。到時候,在env裡進行配置。

# 云片
YUNPIAN_API_KEY=9c60bdd**********
登入後複製

2、安裝 easy-sms 套件

利用這個包,可以快速的實作簡訊傳送功能。

composer require "overtrue/easy-sms"
登入後複製

由於這個元件還沒有 Laravel 的

ServiceProvider ,為了方便使用,我們可以自己封裝一下。

首先在 config 目錄中增加

easysms.php 檔案

#在

config/easysms.php 填入下列內容。

<?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;),
  ],
 ],
];
登入後複製

然後建立一個ServiceProvider

php artisan make:provider EasySmsServiceProvider
登入後複製

修改檔案

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;);
 }
}
登入後複製

最後在

config/app.php providers 裡增加剛剛建立的服務寫進去,App\Providers\EasySmsServiceProvider::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、建立路由和對應的控制器

首先建立路由,我們需要一個ajax請求簡訊驗證碼的方法,和一個確認註冊的邏輯方法,如下:

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;);
 });
登入後複製

路由創建好了,我們用指令產生controller了

php artisan make:controller Home\VerificationCodesController
登入後複製

再直接在裡面寫

registerajaxregister 方法了

#程式碼邏輯

修改檔案

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);
 }
登入後複製

這樣,使用者就能收到短信,並且前端應該要保存這個

key ,提交註冊表單的時候傳遞給後台,判斷是否已經過期。以下就是判斷是否過期,驗證碼是否錯誤。

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;);
 
}
登入後複製

上面的

hash_equals 是可防止時序攻擊的字串比較的~##以上就是我整個的過程。

以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!

相關推薦:

使用Laravel產生Gravatar頭像位址


如何透過laravel來建立自訂artisan make的指令新建類別檔案

#

以上是Larave如何實現簡訊註冊的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板