首頁 後端開發 php教程 Larave如何實現簡訊註冊

Larave如何實現簡訊註冊

Jun 13, 2018 pm 04:31 PM
laravel

這篇文章主要介紹了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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在Laravel中如何獲取郵件發送失敗時的退信代碼? 在Laravel中如何獲取郵件發送失敗時的退信代碼? Apr 01, 2025 pm 02:45 PM

Laravel郵件發送失敗時的退信代碼獲取方法在使用Laravel開發應用時,經常會遇到需要發送驗證碼的情況。而在實�...

Laravel計劃任務不執行:schedule:run命令後任務未運行怎麼辦? Laravel計劃任務不執行:schedule:run命令後任務未運行怎麼辦? Mar 31, 2025 pm 11:24 PM

Laravel計劃任務運行無響應排查在使用Laravel的計劃任務調度時,不少開發者會遇到這樣的問題:schedule:run...

在 Laravel 中,如何處理郵件發送驗證碼失敗的情況? 在 Laravel 中,如何處理郵件發送驗證碼失敗的情況? Mar 31, 2025 pm 11:48 PM

Laravel郵件發送驗證碼失敗時的處理方法在使用Laravel...

在dcat admin中如何實現點擊添加數據的自定義表格功能? 在dcat admin中如何實現點擊添加數據的自定義表格功能? Apr 01, 2025 am 07:09 AM

在dcatadmin(laravel-admin)中如何實現自定義點擊添加數據的表格功能在使用dcat...

Laravel Redis連接共享:為何select方法會影響其他連接? Laravel Redis連接共享:為何select方法會影響其他連接? Apr 01, 2025 am 07:45 AM

Laravel框架中Redis連接的共享與select方法的影響在使用Laravel框架和Redis時,開發者可能會遇到一個問題:通過配置...

Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Laravel多租戶擴展stancl/tenancy:如何自定義租戶數據庫連接的主機地址? Apr 01, 2025 am 09:09 AM

在Laravel多租戶擴展包stancl/tenancy中自定義租戶數據庫連接使用Laravel多租戶擴展包stancl/tenancy構建多租戶應用時,...

Bangla 部分模型檢索中的 Laravel Eloquent ORM) Bangla 部分模型檢索中的 Laravel Eloquent ORM) Apr 08, 2025 pm 02:06 PM

LaravelEloquent模型檢索:輕鬆獲取數據庫數據EloquentORM提供了簡潔易懂的方式來操作數據庫。本文將詳細介紹各種Eloquent模型檢索技巧,助您高效地從數據庫中獲取數據。 1.獲取所有記錄使用all()方法可以獲取數據庫表中的所有記錄:useApp\Models\Post;$posts=Post::all();這將返回一個集合(Collection)。您可以使用foreach循環或其他集合方法訪問數據:foreach($postsas$post){echo$post->

Laravel數據庫遷移遇到類重複定義:如何解決遷移文件重複生成及類名衝突? Laravel數據庫遷移遇到類重複定義:如何解決遷移文件重複生成及類名衝突? Apr 01, 2025 pm 12:21 PM

Laravel數據庫遷移過程中出現類重複定義問題在使用Laravel框架進行數據庫遷移時,開發者可能會遇到“類已使用�...

See all articles