生成二维码时需动态控制纠错等级、智能切换输出格式、安全拼接内容并映射http状态码:根据scene参数选high/medium/low纠错级;按user-agent或accept头选png/svg/pdf格式;用空合并运算符过滤空值;用三元链式判断错误类型返回对应http码。

生成二维码时动态控制纠错等级
当用户扫码环境不可控(如户外强光、打印模糊、手机老旧),需根据业务场景自动匹配纠错强度,避免硬编码导致容错不足或文件臃肿。
第一步:从请求参数提取业务类型标识,注册页默认高容错,营销页可降级以缩小码体尺寸。
$bizType = $_GET['scene'] ?? 'default';
第二步:用三元运算符映射纠错等级常量,【必须使用endroid/qr-code官方定义的ErrorCorrectionLevel类常量,传字符串会静默失败】。
$level = $bizType === 'register' ? ErrorCorrectionLevel::High : ($bizType === 'promo' ? ErrorCorrectionLevel::Medium : ErrorCorrectionLevel::Low);
第三步:将$level直接注入QRCode实例链式调用,无需if分支包裹。
$qrcode = QRCode::create($data)->setErrorCorrectionLevel($level)->setSize(300);
输出格式按终端智能切换
移动端扫码率远高于PC端,但部分后台系统仍需PDF存档;用三元判断User-Agent决定渲染格式,省去冗余HTTP头解析逻辑。
方法一:简单UA关键词匹配
$isMobile = strpos($_SERVER['HTTP_USER_AGENT'] ?? '', 'Mobile') !== false;
$format = $isMobile ? new PngWriter() : new PdfWriter();
方法二:结合Accept头做双重保险——若客户端明确声明只接受image/*,强制PNG,否则走UA路径
$accept = $_SERVER['HTTP_ACCEPT'] ?? '';
$writer = stripos($accept, 'image/') !== false ? new PngWriter() : ($isMobile ? new SvgWriter() : new PdfWriter());
二维码内容拼接时安全过滤空值
用户昵称、订单号等动态字段可能为空,直接拼接会导致二维码内容失效或泄露内部结构。
① 提取原始字段:
$nick = $_POST['nickname'] ?? '';
$order = $_GET['order_id'] ?? '';
② 用三元+空合并运算符组合清洗:
$payload = 'https://app.example.com/u/' . ($nick ?: 'guest') . '?id=' . ($order ?: 'unknown');
这一步不能跳过——【若仅用isset($nick) ? $nick : 'guest',当$nick为'0'时会被误判为false而替换,实际应保留数字0】
③ 传入QRCode创建:
$qrcode = QRCode::create($payload);
错误处理中快速映射HTTP状态码
生成失败时前端需区分是参数错误还是服务异常,三元可压缩判断链。
$error = $qrcode->getErrors()[0] ?? null;
$httpCode = $error && str_contains($error, 'size') ? 400 : ($error ? 500 : 200);
header('HTTP/1.1 ' . $httpCode . ' ' . (['200'=>'OK','400'=>'Bad Request','500'=>'Internal Server Error'][$httpCode] ?? 'Error'));
echo $httpCode === 200 ? $qrcode->writeString(new PngWriter()) : json_encode(['error'=>$error]);
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











