php 实现扫码登录
PHP 实现扫码登录的步骤
扫码登录通常涉及生成二维码、轮询验证和状态更新。以下是实现扫码登录的核心步骤:
生成二维码
使用 PHP 生成包含唯一 token 的二维码。可以使用 endroid/qr-code 库生成二维码:

require 'vendor/autoload.php';
use Endroid\QrCode\QrCode;
$token = bin2hex(random_bytes(16));
$qrCode = new QrCode('https://yourdomain.com/auth?token=' . $token);
header('Content-Type: ' . $qrCode->getContentType());
echo $qrCode->writeString();
存储 token 状态 将生成的 token 存入数据库或缓存(如 Redis),并标记为未扫描状态:
$redis = new Redis();
$redis->connect('127.0.0.1');
$redis->setex('scan_token:' . $token, 300, 'pending'); // 5分钟过期
移动端扫码处理 用户扫码后,移动端应请求后端验证 token 有效性并更新状态:

if ($redis->exists('scan_token:' . $_POST['token'])) {
$redis->set('scan_token:' . $_POST['token'], 'scanned');
echo json_encode(['status' => 'success']);
}
网页端轮询检查 网页端通过 AJAX 轮询检查 token 状态变化:
$status = $redis->get('scan_token:' . $_GET['token']);
if ($status === 'scanned') {
$redis->set('scan_token:' . $_GET['token'], 'confirmed');
echo json_encode(['status' => 'confirmed']);
}
完成登录 确认状态后创建会话并返回用户信息:
if ($redis->get('scan_token:' . $_GET['token']) === 'confirmed') {
$user = getUserByToken($_GET['token']); // 自定义用户查询逻辑
$_SESSION['user'] = $user;
$redis->del('scan_token:' . $_GET['token']);
echo json_encode(['user' => $user]);
}
安全注意事项
- 使用 HTTPS 确保通信安全
- 限制 token 有效期(如 5 分钟)
- 每个 token 只能使用一次
- 验证扫码请求的来源 IP 或设备信息
扩展功能
- 添加扫码后的用户确认步骤
- 集成 WebSocket 替代轮询
- 记录扫码日志用于审计
实现扫码登录需要前后端协作,核心是 token 的状态管理和安全验证机制。






