You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QZ Tray连接成功后调用函数仍弹出警告弹窗,求解决方案

QZ Tray 打印时反复弹出授权警告的解决方案

问题根源

既然你能正常连接QZ Tray并获取打印机列表,说明基础签名和连接流程没问题。printAndReadTest()触发授权弹窗,大概率是操作权限未正确声明或证书信任度不足导致的——QZ Tray对涉及硬件交互的printAndRead操作有更严格的权限校验。

具体修复步骤

1. 确保签名请求包含printAndRead权限

QZ Tray要求每个敏感操作的签名必须明确声明对应权限,否则会触发安全弹窗。检查你的PHP签名接口:

// PHP签名接口核心代码
$postData = json_decode(file_get_contents('php://input'), true);
$request = $postData['request'];

// 强制添加printAndRead权限到请求参数
if (!isset($request['permissions'])) {
    $request['permissions'] = [];
}
if (!in_array('printAndRead', $request['permissions'])) {
    $request['permissions'][] = 'printAndRead';
}

// 后续生成签名的逻辑(比如用openssl_sign处理)

前端调用前也要主动请求权限:

// 先请求printAndRead权限,再执行打印读取操作
async function printAndReadTest() {
    try {
        // 请求权限
        await qz.api.requestPermissions(
            { permissions: ['printAndRead'] },
            { certificate: '/api/get-cert.php', signature: '/api/sign-request.php' }
        );
        // 执行打印读取
        const config = qz.configs.create('目标打印机名称');
        const data = [{ type: 'text', data: '测试内容' }];
        const response = await qz.printAndRead(config, data);
        console.log('打印机返回数据:', response);
    } catch (err) {
        console.error('操作失败:', err);
    }
}

2. 把证书加入客户端系统信任列表

如果用的是自签名证书,客户端系统默认不认可,QZ Tray会每次弹窗提示。解决方法:

  • 导出你的签名证书(.crt或.pem格式)
  • 在客户端机器上,打开「证书管理器」,把证书导入到「受信任的根证书颁发机构」存储区
  • 确保证书的CN字段和你的网站域名一致(本地测试可设为localhost)

3. 清除QZ Tray的旧权限缓存

QZ Tray会缓存已授权的权限,但如果之前的权限配置有误,缓存可能导致弹窗反复出现:

  • 右键点击系统托盘的QZ Tray图标
  • 选择Settings → Permissions
  • 删除对应网站的权限记录,然后重新触发授权流程

4. 检查printAndRead请求格式

如果请求参数格式错误(比如打印机名称不存在、打印数据格式不合法),QZ Tray也可能触发安全校验弹窗。确保你的请求符合官方规范,比如打印机名称正确、数据结构合法。

关键提醒

printAndRead属于高权限操作,QZ Tray的安全机制会严格校验权限声明和证书有效性,这三个步骤里权限声明是最容易出错的点,优先排查。

内容的提问来源于stack exchange,提问作者Jam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 18:42:19