thinkphp5实现用户手机号利用阿里云验证码登录

在 ThinkPHP 5 中实现用户手机号利用阿里云验证码登录,可以按照以下步骤进行:

1. 安装阿里云短信服务 SDK

首先,你需要安装阿里云短信服务的 PHP SDK。你可以使用 Composer 来安装:

composer require alibabacloud/sdk

2. 配置阿里云短信服务

config.php 文件中添加阿里云短信服务的相关配置:

'alisms' => [
    'access_key_id'    => 'your_access_key_id',
    'access_key_secret' => 'your_access_key_secret',
    'sign_name'        => 'your_sign_name',
    'template_code'    => 'your_template_code',
],

3. 创建发送验证码的服务

创建一个服务类来处理发送验证码的逻辑。可以在 application/common/service 目录下创建 SmsService.php 文件:

namespace app\common\service;

use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;

class SmsService
{
    protected $accessKeyId;
    protected $accessKeySecret;
    protected $signName;
    protected $templateCode;

    public function __construct()
    {
        $this->accessKeyId = config('alisms.access_key_id');
        $this->accessKeySecret = config('alisms.access_key_secret');
        $this->signName = config('alisms.sign_name');
        $this->templateCode = config('alisms.template_code');

        AlibabaCloud::accessKeyClient($this->accessKeyId, $this->accessKeySecret)
            ->regionId('cn-hangzhou')
            ->asDefaultClient();
    }

    public function sendSms($phone, $code)
    {
        try {
            $result = AlibabaCloud::rpc()
                ->product('Dysmsapi')
                ->scheme('https') // https | http
                ->version('2017-05-25')
                ->action('SendSms')
                ->method('POST')
                ->host('dysmsapi.aliyuncs.com')
                ->options([
                    'query' => [
                        'PhoneNumbers' => $phone,
                        'SignName' => $this->signName,
                        'TemplateCode' => $this->templateCode,
                        'TemplateParam' => json_encode(['code' => $code]),
                    ],
                ])
                ->request();

            return $result->toArray();
        } catch (ClientException $e) {
            return ['success' => false, 'message' => $e->getErrorMessage()];
        } catch (ServerException $e) {
            return ['success' => false, 'message' => $e->getErrorMessage()];
        }
    }
}

4. 创建控制器处理登录逻辑

application/index/controller 目录下创建 LoginController.php 文件:

namespace app\index\controller;

use think\Controller;
use think\Request;
use think\Session;
use app\common\service\SmsService;

class LoginController extends Controller
{
    public function sendCode(Request $request)
    {
        $phone = $request->post('phone');
        if (!$phone) {
            return json(['status' => 0, 'message' => '手机号不能为空']);
        }

        // 生成随机验证码
        $code = rand(1000, 9999);

        // 发送验证码
        $smsService = new SmsService();
        $result = $smsService->sendSms($phone, $code);

        if ($result['success']) {
            // 将验证码存储到 session 中
            Session::set('verify_code_' . $phone, $code);
            return json(['status' => 1, 'message' => '验证码已发送']);
        } else {
            return json(['status' => 0, 'message' => $result['message']]);
        }
    }

    public function login(Request $request)
    {
        $phone = $request->post('phone');
        $code = $request->post('code');

        if (!$phone || !$code) {
            return json(['status' => 0, 'message' => '手机号和验证码不能为空']);
        }

        // 从 session 中获取验证码
        $sessionCode = Session::get('verify_code_' . $phone);

        if ($sessionCode && $sessionCode == $code) {
            // 验证码正确,进行登录逻辑
            // 这里可以添加用户登录的具体逻辑,例如查找用户并生成 token
            return json(['status' => 1, 'message' => '登录成功']);
        } else {
            return json(['status' => 0, 'message' => '验证码错误']);
        }
    }
}

5. 创建前端页面

创建一个简单的 HTML 页面来处理用户输入和提交:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>手机号登录</title>
    <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script>
</head>
<body>
    <div>
        <input type="text" id="phone" placeholder="请输入手机号">
        <button id="sendCodeBtn">发送验证码</button>
    </div>
    <div>
        <input type="text" id="code" placeholder="请输入验证码">
        <button id="loginBtn">登录</button>
    </div>
    <div id="message"></div>

    <script>
        $(document).ready(function() {
            $('#sendCodeBtn').click(function() {
                var phone = $('#phone').val();
                $.post('/index/login/sendCode', {phone: phone}, function(response) {
                    $('#message').text(response.message);
                });
            });

            $('#loginBtn').click(function() {
                var phone = $('#phone').val();
                var code = $('#code').val();
                $.post('/index/login/login', {phone: phone, code: code}, function(response) {
                    $('#message').text(response.message);
                });
            });
        });
    </script>
</body>
</html>

6. 配置路由

route/route.php 文件中添加路由配置:

use think\Route;

Route::post('index/login/sendCode', 'index/LoginController/sendCode');
Route::post('index/login/login', 'index/LoginController/login');

7. 测试

启动你的 ThinkPHP 项目,并访问前端页面进行测试。确保手机号和验证码的发送和验证逻辑正常工作。

通过以上步骤,你就可以在 ThinkPHP 5 中实现用户手机号利用阿里云验证码登录的功能。如果有任何问题,欢迎继续提问。

0 条评论

还没有人发表评论

发表评论 取消回复

记住我的信息,方便下次评论
有人回复时邮件通知我