php 实现扫码登录
实现扫码登录的基本流程
扫码登录的核心流程分为生成二维码、手机端扫码确认、服务端验证三个部分。用户访问网页时生成唯一二维码,手机扫码后发送确认信息,服务端验证通过后完成登录。
生成唯一二维码
使用PHP生成包含临时token的二维码图片,token需设置较短的有效期(如2分钟)。推荐使用endroid/qr-code库生成二维码:

composer require endroid/qr-code
use Endroid\QrCode\QrCode;
$token = bin2hex(random_bytes(16)); // 生成随机token
$_SESSION['scan_token'] = $token; // 存储到session
$qrCode = new QrCode('https://yoursite.com/scan?token='.$token);
header('Content-Type: '.$qrCode->getContentType());
echo $qrCode->writeString();
轮询检查登录状态
前端通过定时请求检查扫码状态:
function checkScan() {
fetch('/api/check_scan?token=<?=$token?>')
.then(res => res.json())
.then(data => {
if(data.status === 'confirmed') {
location.reload(); // 登录成功
}
});
}
setInterval(checkScan, 2000); // 每2秒检查一次
手机端处理逻辑
手机APP或微信小程序扫码后,调用确认接口:

// 手机端确认接口
if ($_POST['token'] === $_SESSION['scan_token']) {
$_SESSION['user'] = $_POST['userid']; // 绑定用户信息
file_put_contents("scan_{$token}.log", 'confirmed');
}
服务端验证处理
PHP检查token状态:
$status = 'waiting';
if (file_exists("scan_{$token}.log")) {
$status = file_get_contents("scan_{$token}.log");
}
echo json_encode(['status' => $status]);
安全注意事项
- 每个token只能使用一次,验证后立即失效
- 采用HTTPS协议传输防止中间人攻击
- 限制同一IP的频繁请求
- 二维码内容建议使用一次性URL而非直接包含token
完整实现建议
对于生产环境,建议:
- 使用Redis存储临时token状态
- 采用JWT替代session管理
- 添加扫码日志记录
- 实现二维码自动刷新机制
微信生态开发可直接使用官方提供的扫码登录接口,避免重复造轮子。






