php实现手机短信验证
PHP实现手机短信验证的步骤
准备短信服务商API
选择可靠的短信服务商(如阿里云短信、腾讯云短信、Twilio等),注册账号并获取API密钥、API接口地址等必要信息。服务商通常会提供详细的API文档,包含发送短信的请求方式、参数说明等。
安装必要的PHP库
根据所选短信服务商的要求,可能需要安装特定的PHP SDK或HTTP请求库。例如,使用cURL发送HTTP请求:
// 示例:使用cURL发送POST请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, '短信服务商API地址');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'apikey' => '你的API密钥',
'mobile' => '目标手机号',
'text' => '验证码:123456'
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
生成并存储验证码
在服务端生成随机验证码,并将其与手机号关联存储(如Session、数据库或缓存):
// 生成6位随机验证码
$code = str_pad(mt_rand(0, 999999), 6, '0', STR_PAD_LEFT);
$_SESSION['sms_code'] = $code;
$_SESSION['sms_phone'] = '用户手机号';
$_SESSION['sms_expire'] = time() + 300; // 5分钟有效期
发送短信验证码
调用短信服务商API发送验证码到用户手机。示例代码(以阿里云短信为例):
require_once 'aliyun-php-sdk-core/Config.php';
use Dysmsapi\Request\V20170525 as Dysmsapi;
$profile = DefaultProfile::getProfile('cn-hangzhou', 'accessKeyId', 'accessSecret');
$client = new DefaultAcsClient($profile);
$request = new Dysmsapi\SendSmsRequest();
$request->setPhoneNumbers('手机号');
$request->setSignName('短信签名');
$request->setTemplateCode('短信模板ID');
$request->setTemplateParam(json_encode(['code'=>$code]));
$response = $client->getAcsResponse($request);
验证用户输入
用户提交验证码后,与服务端存储的验证码进行比对:
if ($_POST['code'] == $_SESSION['sms_code']
&& $_POST['phone'] == $_SESSION['sms_phone']
&& time() < $_SESSION['sms_expire']) {
echo '验证成功';
} else {
echo '验证码错误或已过期';
}
安全优化建议
- 限制同一手机号的发送频率(如1分钟1次)
- 验证码有效期建议5-10分钟
- 记录发送日志,防止恶意调用
- 对验证失败次数进行限制,防止暴力破解
完整流程示例
// 发送验证码
function sendSmsCode($phone) {
$code = generateCode();
saveCodeToSession($phone, $code);
$result = callSmsApi($phone, $code);
return $result;
}
// 验证用户输入
function verifyCode($phone, $inputCode) {
$storedCode = $_SESSION['sms_code'] ?? '';
$storedPhone = $_SESSION['sms_phone'] ?? '';
$expireTime = $_SESSION['sms_expire'] ?? 0;
return $inputCode === $storedCode
&& $phone === $storedPhone
&& time() < $expireTime;
}
以上方法可根据实际需求调整,建议结合数据库存储验证码信息以提高安全性和可靠性。







