一个没有营业执照、域名没备案的个人站长,是怎么给博客接上"微信扫码一键登录/注册"的。全程不花一分钱,不用备案,不用企业资质。
一、我遇到的问题
博客用的是 ZBlogPHP(1.7.5),想让读者用微信扫码就能登录、评论、下载,而不是填邮箱密码注册。
听起来很简单,实际一问才知道,微信官方的"网站应用扫码登录"门槛极高:
要求 | 说明 | 我能不能满足 |
企业/个体工商户资质 | 需要营业执照,个人主体办不了 | ❌ |
域名 ICP 备案 | 未备案域名不支持 | ❌ |
微信认证 300 元/年 | 认证费年年交 | ❌ |
个人站长三座大山全踩中。于是开始调研替代方案。
二、三条路线对比
方案 | 原理 | 成本 | 优点 | 结论 |
① 微信官方网站应用登录 | 微信开放平台 OAuth 授权 | 300元/年+企业资质+备案 | 官方正规 | 排除 |
② 第三方聚合登录(如彩虹等) | 第三方中间站代接微信登录 | 免费/付费 | 接入最快 | 排除 |
③ 个人小程序中转扫码登录 | 网站出小程序码→微信扫码进小程序→确认→网站拿 openid 登录 | 0 元 | 自己的小程序、自己的数据、完全正规 | ✅ 采用 |
方案③是我最终选的:个人本来就有一个不用的小程序,捡起来复用即可。它的本质是——微信允许小程序免费获取用户 openid,那就让"扫码确认"这一步发生在自己的小程序里,网站再通过云函数拿到 openid,完成登录。
三、整体流程
读者在网站点「微信扫码登录」│▼网站调用云函数 createLoginQr 生成会话 uuid│▼网站服务器用 uuid 调用微信接口生成小程序码(图片)显示给读者│▼读者用微信扫码 → 打开小程序确认登录页 → 点「确认」│▼小程序调用云函数 bindLogin:把 openid 和 uuid 绑定│▼网站轮询 queryLogin?uuid=xxx → 拿到 openid│▼网站按 openid 查找用户(没有就自动注册一个)→ 写入登录态 → 读者自动登录
整条链路的关键设计:openid 从不下发给浏览器,只在网站服务器和云函数之间流转;浏览器只持有一次性 uuid,扫完即废。
四、各部分组成
4.1 需要准备的东西
项 | 说明 | 费用 |
微信小程序 | 个人主体即可(微信公众平台注册) | 免费 |
微信云开发 | 小程序里开通 CloudBase,用免费额度 | 免费 |
ZBlog 插件 | 自己写的一个小插件(出码、轮询、登录) | 免费 |
云函数 ×3 | 部署在云开发环境 | 免费额度内 |
4.2 云函数(3 个)
云函数 | 作用 | 对外接口 |
createLoginQr | 在数据库集合 login_sessions 建一条会话,返回 uuid | GET /createLoginQr → {uuid} |
bindLogin | 小程序端调用,把 openid 绑到指定 uuid | 小程序内部调用 |
queryLogin | 网站轮询,返回会话状态 + openid | GET /queryLogin?uuid=xxx → pending/confirmed/expired |
数据库集合 login_sessions 权限设为"所有用户不可读写",只能靠云函数访问。
4.3 网站插件做了什么
ZBlog 插件只有一个入口做三件事:
接口(ajax.php) | 作用 |
?do=qr | 调云函数拿 uuid → 服务器端调微信 getwxacodeunlimit 生成小程序码,base64 返回给前端 |
?do=check&uuid=xxx | 轮询云函数;confirmed 时按 openid 自动注册用户并写入登录态 cookie |
?do=selfcheck | 自检诊断(开发时用) |
为什么小程序码要由网站服务器生成? 这是踩过的坑:腾讯云函数的出口 IP 是共享的,调微信接口容易被风控(返回 412);而网站服务器有固定公网 IP,调微信接口稳定。
五、最大的坑:ZBlog 1.7.5 改了登录机制
前面几版插件一直显示"登录成功",但刷新后根本没登录上。最后翻官方源码才发现——1.7.5 版本换了整套登录机制:
旧版(1.7.0 之前) | 1.7.5(现在) | |
登录 cookie | username + password(密码值) | username_<hash> + token_<hash>(hash 由站点 GUID 算出) |
密码存储 | md5 或简单哈希 | md5(md5(明文) + 用户 GUID) 双重加密加盐 |
登录验证 | 比对 cookie 里的密码 | 用官方 CreateWebToken 签发 token,VerifyWebToken 校验 |
所以正确的"免密登录"写法是调用官方方法:
$token = $zbp->GenerateUserToken($member, time() + 3600*24*30);$k = hash('crc32b', $zbp->guid);setcookie('username_' . $k, $member->Name, $expire, $zbp->cookiespath);setcookie('token_' . $k, $token, $expire, $zbp->cookiespath);这一段耗了最多时间,记在这里供同样升级到 1.7.5 的站长参考。

六、最终效果
前台登录弹窗(主题 footer)里,密码框下方多了一个绿色「微信扫码登录」按钮,点开即出小程序码;读者扫码确认后页面自动刷新完成登录。整个过程不到 5 秒,新读者自动注册、无需填资料。
后台登录页也通过 ZBlog 官方钩子 Filter_Plugin_Login_Header 内嵌了同样的扫码面板。

七、小结
环节 | 结论 |
个人能不能做 | 能,只要有一个闲置的小程序 |
花了多少钱 | 0 元(云开发免费额度足够) |
需要备案吗 | 不需要 |
需要营业执照吗 | 不需要 |
隐私安全 | openid 只在服务器间流转,不经过浏览器,也不经过第三方 |
完整代码(ZBlog 插件 + 云函数 + 小程序前端 + 主题改动)已打包,文末附获取方式。