如何获取openid:依托后端中转微信官方接口调取唯一用户标识
前段时间做微信小程序功能迭代,卡了整整一下午的核心问题就是如何获取openid,网上一堆新旧混杂的教程,错的对的揉在一起,跟着瞎试反复报错,差点耽误项目迭代进度。
最开始完全凭直觉操作,以为前端代码直接调用微信授权,就能直接抓取到用户的openid。当时随便找了两篇短视频教程,复制了现成的前端授权代码,反复调试页面,点击授权弹窗、刷新页面、清空缓存来回试,页面每次都显示授权成功,但后台打印出来的参数里,始终没有固定有效的openid,只有一串临时的匿名参数。
完全摸不着头脑。
折腾好久才搞明白,微信的安全机制早就封堵了前端直取openid的通道,所有只靠前端代码就能拿到openid的方法,现在全部失效,这也是绝大多数新手踩坑的核心原因。很多老旧教程没有更新,还在传播过时的操作方式,白白浪费大量调试时间,根本解决不了实际问题。
真正能稳定生效的方式,必须是前后端配合、后端中转对接官方接口。用户在小程序点击授权登录后,前端先执行wx.login方法,获取到微信下发的临时code码,这个code时效性极短,只有两分钟左右,过期就会失效,没办法二次复用,拿到之后必须立刻传递给项目后端接口,不能做任何本地存储。
后端接收到前端传输的临时code后,拼接微信官方的凭证获取接口,填入自己小程序后台的APPID和APPSECRET三个核心参数,发起服务端请求,官方接口校验参数无误后,就会返回完整的用户授权数据,里面就包含了永久唯一的openid,同时还会附带session_key等配套参数,足够满足账号绑定、数据统计、权限区分等基础开发需求。
当时还犯了一个很低级的错误,就是把APPSECRET直接写在了前端配置文件里。那会不懂安全规则,只想着快速调试通,结果不仅拿不到合规的openid,还存在极大的信息泄露风险,后来排查问题的时候,才发现这是行业绝对禁止的操作,密钥参数只能存放于后端服务器,绝对不能暴露在前端页面中。
还有个容易忽略的细节,测试的时候必须使用微信官方开发者工具,或者真机调试,直接在浏览器打开小程序页面测试,是永远获取不到有效code和openid的,浏览器环境无法适配微信的授权机制,这也是我反复测试失败的一个次要原因。
调试成功的那一刻,直接把收藏的十几篇过时教程全部清空,只留下了这套后端中转的实操步骤。盯着后台控制台稳定输出的openid字段,终于不用再反复刷新页面试错了。
那晚调试结束关电脑的时候,桌面还摊着写满参数备注的草稿纸。