ホームページ  >  記事  >  バックエンド開発  >  LaravelフレームワークでのPHP携帯電話SMS検証コード実装プロセス

LaravelフレームワークでのPHP携帯電話SMS検証コード実装プロセス

不言
不言オリジナル
2018-08-10 11:04:552303ブラウズ

この記事の内容は、laravel フレームワークにおける PHP 携帯電話 SMS 認証コードの実装プロセスに関するもので、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。

特定の SMS サービス プロバイダーを自由に選択できます。

1、実装プロセス

携帯電話番号を入力し、クリックして認証コードを取得します
正しいSMS認証コードを送信すると、登録が完了します

2 , 導入アイデアマップ

LaravelフレームワークでのPHP携帯電話SMS検証コード実装プロセス

3. クラウドフィルムの登録、開発情報認証、テンプレートの設定についてはここでは詳しく説明しません。 sms、easy-sms はい An Zhengchao によって作成された SMS 送信コンポーネント このコンポーネントを使用すると、SMS 送信機能を迅速に実装できます。

 composer require "overtrue/easy-sms"
    //新建配置文件
    touch config/easysms.php

次に、easysms.php ファイルに次の内容を追加します。

 <?php

   return [

       &#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 Illuminate\Support\ServiceProvider;
use Overtrue\EasySms\EasySms;

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

    /**
     * Register 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 を開き、プロバイダーに

 App\Providers\EasySmsServiceProvider::class,

5 を追加して API_KEY

を取得します。クラウド スライス。.env で YUNPIAN_API_KEY を構成します。以下を独自のキーに置き換える必要があることに注意してください。

6. コントローラー コードは検証コードを取得します (コードとキーをキャッシュに保存します)

public function getVerificationCode($request)
    {
        if(FALSE === $this->validateApiRequest($request->all(),
                [&#39;mobile&#39; => &#39;required|regex:/^1[34578]\d{9}$/|unique:users&#39;],[
                    &#39;mobile.required&#39;=>&#39;请输入手机号&#39;,
                    &#39;mobile.regex&#39;=>&#39;手机号格式不正确&#39;,
                    &#39;mobile.unique&#39;=>&#39;手机号已存在&#39;
                ])){
            return false;
        }

        $mobile = trim($request->get(&#39;mobile&#39;));
       $code = str_pad(random_int(1,9999),4,0,STR_PAD_LEFT);


        try{
             $easySms->send($mobile,
                [&#39;content&#39;=>"【UKNOW】您的验证码是{$code}。如非本人操作,请忽略本短信"]             );

        }catch(\GuzzleHttp\Exception\ClientException $exception){

            $response = $exception->getResponse();
            $result =json_decode($response->getBody()->getContents(),true);
            $this->setMsg($result[&#39;msg&#39;]?? &#39;短信发送异常&#39;);
            return false;
        }

        $key = &#39;verificationCode&#39;.str_random(15);
        $expiredAt = now()->addMinutes(1);
        Cache::put($key,[&#39;mobile&#39;=>$mobile,&#39;code&#39;=>$code],$expiredAt);

        return [
            &#39;verification_key&#39;=>$key,
            &#39;expiredAt&#39;=>$expiredAt->toDateTimeString(),
            &#39;verification_code&#39;=>$code
            ];
    }

7、確認コードを比較します

public function userStore($mobile, $verification_key,$code,$password,$password_confirmation)
    {

        $params = [
            &#39;mobile&#39;=>$mobile,
            &#39;verification_key&#39;=>$verification_key,
            &#39;code&#39;=>$code,
            &#39;password&#39;=>$password,
            &#39;password_confirmation&#39;=>$password_confirmation
        ];
        //参数判断
        if (
            FALSE === $this->validateApiRequest($params, [
                &#39;mobile&#39;  => &#39;required|regex:/^1[34578]\d{9}$/|unique:users&#39;,
                &#39;code&#39;    => &#39;required&#39;,
                &#39;verification_key&#39;=>&#39;required&#39;,
                &#39;password&#39;     => &#39;required|min:6|confirmed&#39;,
                &#39;password_confirmation&#39; => &#39;required&#39;,
            ], [
                &#39;mobile.required&#39; => &#39;请输入手机号&#39;,
                &#39;mobile.regex&#39;    => &#39;手机号格式不正确&#39;,
                &#39;mobile.unique&#39;   => &#39;手机号已存在&#39;,
                &#39;code.required&#39;   => &#39;请输入短信验证码&#39;,
                &#39;password.required&#39;    => &#39;请输入密码&#39;,
                &#39;password.min&#39;         => &#39;密码不得小于6位&#39;,
                &#39;password.confirmed&#39;   => &#39;密码前后不一致&#39;,
                &#39;password_confirmation.required&#39;=>&#39;请再次输入密码&#39;,
                &#39;verification_key.required&#39;=>&#39;请输入短信验证码&#39;
            ])
        ) {
            return false;
        }

        $verifyData = Cache::get($verification_key);
        if( !$verifyData){
            $this->setMsg(&#39;验证码已失效&#39;);
            return false;
        }
        if(!hash_equals($code,(string)$verifyData[&#39;code&#39;])){
            $this->setMsg(&#39;验证码错误&#39;);
            return false;
        }

        Cache::forget($verification_key);
        $user = User::create([
            &#39;mobile&#39;=>$mobile,
            &#39;password&#39;=>bcrypt($password)
        ]);
        if(!$user){
            $this->setMsg(&#39;注册失败&#39;);
            return false;
        }
        return true;
    }

関連する推奨事項:

thinkphp テンプレートが WeChat 携帯電話決済か WeChat スキャンコード決済かを判断する方法

PHP でページジャンプ機能を実装するにはどうすればよいですか? (機能ラベルの例)

以上がLaravelフレームワークでのPHP携帯電話SMS検証コード実装プロセスの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。