公众号带参数二维码的“参数”不是靠图片上传到自己的接口,而是在创建二维码时指定场景,再在平台事件中取回。2018 年做扫码统计时,我最初一直在找查询扫描次数的接口,后来才理清这个事件推送关系。
先创建场景,再取得二维码
旧流程分两步:调用创建接口取得 ticket,再凭 ticket 获取二维码图片。下面是临时整型场景的请求体结构:
{
"expire_seconds": 600,
"action_name": "QR_SCENE",
"action_info": {
"scene": { "scene_id": 123 }
}
}
字符串场景使用另一类 action_name 和字段:
{
"expire_seconds": 600,
"action_name": "QR_STR_SCENE",
"action_info": {
"scene": { "scene_str": "campaign-demo" }
}
}
场景值由开发者定义,用于关联渠道或业务记录。永久类型在旧协议中使用 QR_LIMIT_SCENE、QR_LIMIT_STR_SCENE;有效期、数量和字段限制应以账号对应的当前文档为准,不沿用旧笔记中的限额作为今天的承诺。带参数二维码文档入口
ticket 与业务 scene 是不同对象。旧流程的 showqrcode 请求把 ticket 作为参数,需正确 URL 编码;不能拿 scene_id 直接替换 ticket,也不应公开实际绑定业务的临时票据。
事件不是自己轮询出来的
旧明文接入中,GET 用于配置地址验证,POST 用于接收平台消息和事件。扫码相关事件也发送到配置的接收地址,但不是所有 POST 都是扫码,必须解析消息类型和事件类型。
对于历史的场景二维码流程,需要区分:
| 用户及动作 | 事件与场景线索 |
|---|---|
| 未关注用户扫码后关注 | subscribe 事件,EventKey 中可能带 qrscene_ 前缀 |
| 已关注用户扫描场景码 | SCAN 事件,EventKey 表示相应场景 |
| 普通关注、其他事件 | 不应默认当作场景扫码 |
场景创建时叫 scene_id 或 scene_str,事件里却通过 EventKey 等字段表达,这是原项目最容易混淆的地方。普通二维码也可以编码 URL;这里讨论的是公众号平台的场景事件能力,不能说“普通二维码无法传递任何参数”。
统计口径由业务定义
收到一次事件,不一定等于一个独立用户,也不一定能证明一次真实转化。网络重试可能造成重复推送;同一用户也可能多次扫描。应先验签、按所用模式解密,再定义去重、事件次数、人数及渠道归因口径。
做账号绑定时,场景应有有效期并绑定待确认的业务会话,不能只凭可猜测的数字就完成绑定。服务器接入与权限排查见回调验证和事件接收。