没有公众号认证无法调用微信 scanQRCode 接口,必须使用已认证服务号/企业号并完成 JS-SDK 配置;无公众号时推荐 @zxing/library 纯前端扫码,需 HTTPS、用户手势触发及手动实现 UI 和解析逻辑。

微信 H5 页面调用 scanQRCode 前必须有公众号认证和 JS-SDK 配置
没有公众号,就别想走官方 weixin-js-sdk 路线——scanQRCode 接口根本不会生效,连 config:ok 都看不到。很多人卡在第一步:域名没备案、JS 安全域没填、signature 签名过期或计算错误。哪怕你本地调试 debug: true 看到弹窗,真机扫出来仍是“该功能不可用”。这不是代码问题,是微信平台硬性门槛。
- 必须是已认证的服务号或企业号(订阅号不行)
- 当前网页域名需在公众号后台「JS 接口安全域名」中显式添加
-
timestamp和nonceStr必须和服务端签名时一致,且 7200 秒内有效 - 签名必须用公众号的
appId+appSecret获取access_token,再用jsapi_ticket计算,不能硬编码
不依赖公众号的替代方案:用 @zxing/library 实现纯前端扫码
如果你只是想让用户扫二维码(比如关注链接、活动页、优惠券码),又没有公众号,@zxing/library 是目前最稳定、兼容性最好的选择。它不调用微信 API,直接用设备摄像头解码,iOS/Android 微信内置浏览器都支持(需 HTTPS + 用户授权摄像头)。
- 安装:
npm install @zxing/library@^0.21.3 - 关键限制:必须在用户手势触发后启动(如点击按钮),不能页面一加载就自动开摄像头
- 扫码结果是原始字符串,比如
https://mp.weixin.qq.com/mp/qrcode?scene=xxx,你要自己解析跳转或提取参数 - 需手动加遮罩层和扫描框 UI,否则体验差;注意
video元素要设playsinline,否则 iOS 会全屏
扫码后跳转关注页的 URL 构造不能写死
微信公众号的「带参数二维码」URL 有固定格式:https://mp.weixin.qq.com/qrcode?scene=xxxx,但直接放这个链接扫码,用户扫完只会看到空白页或提示“该公众号未认证”。真正起作用的是公众号后台生成的永久二维码,其 URL 形如:https://mp.weixin.qq.com/s?__biz=Mzxxxxxxxxxx&scene=1000004&sn=xxxxxxxxx。你不能手动生成,必须调用公众号接口 /cgi-bin/qrcode/create 获取。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- 临时二维码有效期最长 7 天,适合活动页;永久二维码无时效限制,但总数上限 10 万个
- scene 值必须是整数(
scene_id)或字符串(scene_str),后者更灵活,可传user_id=123这类信息 - 扫码后微信服务器会推送
SCAN事件,你得在自己的服务端监听并处理,不是前端能控制的
弹窗本身用原生 dialog 或简单 CSS 就够了,别堆库
所谓“扫码关注弹窗”,本质就是个带二维码图片的模态框。用 <dialog> 元素最轻量,兼容性也足够(Chrome 97+/Edge 97+/Safari 15.4+);老版本 Safari 可 fallback 到 position: fixed + display: none/block 控制显隐。
立即学习“前端免费学习笔记(深入)”;
- 二维码图建议用后端生成(含 logo、尺寸可控),不要前端用 jsqrcode 等库动态画,清晰度和容错率差
- 弹窗关闭按钮必须显式绑定
click事件调用dialog.close(),否则 iOS 微信里点蒙层不关闭 - 别用
alert或confirm模拟弹窗——它们会阻塞 JS,且样式无法定制,用户感知极差


















