1. 前言
现如今,手机注册登录已经成为了主流的注册登录方式,因为手机验证更加安全、方便、快捷。PHP作为一种广泛应用的服务器端脚本语言,可以实现多种登录注册方式,本文将介绍如何使用PHP实现手机验证登录注册。
2. 确定技术方案
2.1 确定前端技术
前端开发应该使用一套成熟的框架库,建议选择Bootstrap或Semantic UI等框架。这些框架可以提供基于响应式设计的UI组件,也有移动端的适配。
2.2 确定后端技术
后端开发应该选择一个成熟、高效、稳定的PHP框架,如Laravel或Yii,其都提供了面向对象的服务端开发方式,也支持RESTful API,方便前后端分离等技术需求。
3. 数据库设计
首先需要设计数据库,建议包含表:用户表、短信验证码表。
3.1 用户表设计
我们需要为用户表设置索引,以方便后续查询操作。
CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL,
`password` varchar(50) NOT NULL,
`phone` varchar(20) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
3.2 短信验证码表设计
我们需要保存每次发送的验证码以及验证码的过期时间。
CREATE TABLE `sms_code` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`phone` varchar(20) NOT NULL,
`code` varchar(20) NOT NULL,
`expire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `phone_index` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4. 短信验证
4.1 发送短信验证码
发送短信验证码需要调用第三方服务提供商的接口。在这里,我们使用阿里云短信服务的API进行开发,API调用示例代码如下:
$phoneNumbers = "15300000001"; // 接收短信的手机号码
$code = mt_rand(100000,999999); // 生成六位验证码
// 使用阿里云短信服务的SDK发送验证码短信
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;
AlibabaCloud::accessKeyClient($accessKeyId, $accessKeySecret)
->regionId('cn-hangzhou')
->asDefaultClient();
try {
$result = AlibabaCloud::rpc()
->product('Dysmsapi')
->version('2017-05-25')
->action('SendSms')
->method('POST')
->host('dysmsapi.aliyuncs.com')
->options([
'query' => [
'RegionId' => "cn-hangzhou",
'PhoneNumbers' => $phoneNumbers,
'SignName' => "XXX", // 签名
'TemplateCode' => "XXX", // 模板
'TemplateParam' => '{"code": "'.$code.'"}',
],
])
->request();
} catch (ClientException $e) {
return $e->getMessage();
} catch (ServerException $e) {
return $e->getMessage();
}
// 存储验证码到数据库
$expiredAt = 300; // 验证码有效期,单位为秒
$now = date('Y-m-d H:i:s');
\DB::table('sms_code')->insert([
'phone' => $phoneNumbers,
'code' => $code,
'expire_time' => date('Y-m-d H:i:s', strtotime($now) + $expiredAt),
]);
4.2 验证短信验证码
用户输入完手机号和验证码后,我们需要从数据库中取出刚才存储的验证码,判断是否在有效期内,并且是否和用户输入的验证码一致。
$smsCode = \DB::table('sms_code')
->where('phone', $phone)
->orderBy('id', 'desc')
->first(); // 取出指定手机号最新发送的验证码
if (!$smsCode) {
return response(['status' => 'fail', 'message' => '未获取到验证码!']);
}
if ($smsCode->code != $code) {
return response(['status' => 'fail', 'message' => '验证码不正确!']);
}
if ($smsCode->expire_time < date('Y-m-d H:i:s')) {
return response(['status' => 'fail', 'message' => '验证码已过期!']);
}
// 清除已验证的验证码
\DB::table('sms_code')
->where('id', $smsCode->id)
->delete();
5. 用户注册
用户注册需要先获取用户的手机号和验证码,前端调用接口验证,通过后将手机作为唯一的账户名,生成随机密码作为初始密码,记录到用户表中。
$user = new User;
$user->username = $phone;
$user->password = \Hash::make(str_random()); // str_random() 用于生成随机字符串作为初始密码
$user->phone = $phone;
$user->save();
6. 用户登录
用户登录需要验证用户输入的手机号和密码,如果符合则设置登录状态,否则返回错误提示。
$user = User::where('username', $phone)->first(); // 使用手机号作为账户名
if (!$user) {
return response(['status' => 'fail', 'message' => '手机号未注册!']);
}
if (!\Hash::check($password, $user->password)) {
return response(['status' => 'fail', 'message' => '密码不正确!']);
}
\Auth::login($user); // 设置登录状态
7. 注意事项
7.1 安全性
短信验证码可以在短时间内被不断尝试,因此需要设置验证码有效期。同时,在服务器端要做好防范措施,避免SQL注入等攻击。
7.2 短信服务商选择
选择短信验证服务商时要注意服务商的稳定性、服务质量、验证码可达性、价格等因素。
8. 总结
本文为大家介绍了如何使用PHP实现手机验证登录和注册,并且对相应的技术要点和注意事项进行了详细的描述。希望对大家有所帮助!