微信二维码需分临时码(7天有效期,支持scene_str)和永久码(无过期,仅限1–100000整数scene_id);生成时校验参数合规性,扫码后正确解析EventKey前缀,结合openid等做分层统计。

微信公众号开发中,二维码生成与场景统计是用户引流和行为分析的关键环节。PHP 微信开发框架(如 EasyWeChat、overtrue/wechat)已封装官方 API,但实际使用时仍需理解参数逻辑、场景值限制、缓存策略及数据回传机制,否则易出现扫码无响应、场景 ID 重复、统计漏埋等问题。
一、二维码类型选择:临时码 vs 永久码
微信提供两种带参二维码:临时二维码(有效期最长达 7 天,支持字符串或数字型 scene_id)、永久二维码(仅支持 1–100000 的整数型 scene_id,无过期限制)。选错类型会导致扫码失效或无法创建。
- 推广活动、裂变海报等短期引流用临时码,scene_str 可设为
invite_20240515_user123,便于业务标识 - 公众号菜单、线下物料等长期展示位用永久码,scene_id 建议由数据库自增主键或业务编码映射生成,避免手动维护冲突
- 注意:永久码不支持 scene_str,若强行传入会报错“invalid parameter”
二、生成流程与关键参数处理
以 EasyWeChat v5.x 为例,生成需先获取 access_token,再调用 app->qrcode->temporary() 或 permanent() 方法。重点不是调用本身,而是参数合规性校验:
- scene_id 必须为整数且在有效范围:临时码支持 1–100000,永久码同;超出则返回 “invalid scene” 错误
- scene_str 长度不能超 64 字节:中文按 UTF-8 计,一个汉字占 3 字节,建议控制在 21 字以内
- 生成后返回 ticket,需拼接为
https://mp.weixin.qq.com/qrcode?ticket=xxx才可访问,直接存 ticket 无意义 - 推荐将 ticket + expire_seconds + create_time 存入数据库,用于后续缓存判断与重发逻辑
三、扫码事件接收与场景值解析
用户扫码后,微信服务器会向开发者配置的服务器地址推送 event = scan 事件(临时码)或 event = subscribe + event_key(关注后首次扫码永久码)。关键点在于正确提取 scene 值:
立即学习“PHP免费学习笔记(深入)”;
- 临时码扫码:从 XML 中取
EventKey,格式为qrscene_XXX,需截取后缀;若为 scene_str,则EventKey是完整字符串(如qrscene_invite_abc) - 永久码扫码:未关注时推送
subscribe事件,EventKey为qrscene_XXX;已关注用户直接触发scan,EventKey同样含前缀 - 务必做
str_replace('qrscene_', '', $eventKey)解析,避免把前缀当业务 ID 使用
四、场景统计落地建议
单纯记录“某场景被扫了几次”意义有限,需结合用户身份、时间、渠道做分层统计:
- 在接收扫码事件时,立即写入日志表:scene_id / scene_str、openid、create_time、ip、user_agent(可识别是否微信内/安卓/iOS)
- 对同一 scene_str 的多次扫码,可通过 openid 去重统计“独立用户数”,比总扫码量更能反映传播效果
- 若需实时看板,可用 Redis 对 scene_id 做
INCR计数,再定时同步到 MySQL;避免高并发下数据库写压力 - 注意:测试号或开发者工具扫码不会触发事件,必须用真实微信客户端扫描正式 ticket 生成的二维码
不复杂但容易忽略——二维码不是生成完就结束,它是一条从生成、分发、扫码、事件接收、到数据归因的完整链路。每一步的参数约束和边界情况,都直接影响统计准确性和运营决策质量。



















