微信小程序开发,三分钟教你轻松获取用户openid
发布时间:10-12来源:微信小程序工具|微信小程序开发|微信小程序制作平台-龙图应用【XcxIP.com】
我去年接手一个小程序项目,第一个坎儿就是获取openid。当时翻了一天文档,头皮发麻,各种名词堆在一起,什么code、sessionkey、unionid,看得人想摔键盘。后来摸透了才发现,这事儿真没想象中复杂,核心就三行代码的事。今天不扯虚的,直接把这套流程掰开揉碎了讲给你听,保证你花三分钟看完,马上能上手用。

先搞清楚一个事儿:openid到底是啥。简单说,就是微信给每个用户发的一串唯一ID,相当于用户在你这个小程序里的身份证号。同一部手机,进你这个小程序是这串数字,进别的小程序又是另一串,互不相通。正因为这个特性,它成了你识别用户、关联业务数据最基础的凭证。很多新手一上来就懵,是因为把openid和unionid搞混了。unionid是同一个微信用户在不同小程序、公众号之间共用的ID,但你要是只做一个小程序,压根用不上它,别自己给自己加戏。
现在直接上干货。获取openid的标准流程,总共就两步:第一步,在小程序前端调wx.login方法,拿到一个临时凭证code。这个code有效期只有五分钟,而且只能用一次,用完就作废,别想着缓存复用。第二步,把这个code通过你的后端服务器,发给微信的接口,换回openid和sessionkey。这里有个关键点,很多人犯的错是直接从小程序前端去调微信接口,把appid和secret暴露在代码里。这等于把你家保险柜密码贴在门口,等着被人薅羊毛。正确做法是,前端只负责传code给后端,后端再拿着code加上你的appid和secret去换openid,来回倒一手,安全系数就上去了。
后端代码长什么样?我直接给你贴一段Node.js的示例,你拿去就能用:
const https = require('https');
const appid = '你的appid';
const secret = '你的secret';
function getOpenid(code) {
return new Promise((resolve, reject) => {
const url = ;
https.get(url, res => {
res.on('data', chunk => data += chunk);
res.on('end', () => resolve(JSON.parse(data)));
}).on('error', reject);
就这么十几行,调用一下getOpenid,返回的json里就有openid字段。如果你用的是Python、PHP、Java,逻辑一模一样,就是换个HTTP请求的写法。重点在于接口地址别记错,是,不是别的什么乱七八糟的路径。微信文档里写得很清楚,但总有人抄错。
这里头有几个坑,我踩过,说出来帮你躲开。第一个坑,code传过去之后,微信返回的可能是而不是openid。比如40029表示code无效,45011表示频率限制。很多新手一看返回结果里没有openid,就慌了,其实只要判断一下有没有字段,有就说明出问题了,去查对应错误码就行。第二个坑,sessionkey这玩意儿,别急着扔。它是用来解密用户手机号、加密数据用的,前端拿不到,但你后端得存着,后面做手机号快捷登录、获取用户信息都得用它。第三个坑,也是最容易忽略的——小程序后台的服务器域名白名单。你后端调微信接口不需要配置,但如果你前端要直接请求自己的服务器,那个域名必须在小程序后台的“开发设置-服务器域名”里加白名单,否则调试的时候直接给你拦下来,报错信息还很隐晦,半天找不出原因。
再聊聊缓存策略。openid这东西,一旦获取成功,基本不会变。用户删了小程序再重新进,openid还是同一个。所以你可以把它存到后端数据库里,跟用户ID绑定,下次用户再进来,直接拿前端传过来的code去查,不用每次都调微信接口。但注意,code本身不能缓存,前端每次调用wx.login都会生成新的code,旧的就失效了。我的习惯是,前端启动时先调wx.login拿code,然后传给后端,后端查数据库,如果这个openid已存在就直接登录,不存在就注册新用户。这套流程跑顺了,用户体验很丝滑,加载速度也快。
还有个小细节,很多人忽略:wx.login其实不弹任何授权框,它只是静默地返回一个code,不需要用户点“同意”按钮。这跟wx.getUserProfile不一样,后者会弹出授权框,要用户手动确认。所以获取openid这个动作,是在用户毫无感知的情况下完成的,不影响用户体验。但正因为太顺滑了,有些人就以为openid可以随便拿,其实微信对接口调用频率是有限制的,单个用户每分钟最多调100次,超出就报45011。所以后端一定要做缓存和限流,别让同一个人刷你接口。
说到业务场景,openid能干的活儿可太多了。最常见的就是做用户画像,你拿openid当主键,存用户的浏览记录、购买记录、收藏记录,后面做推荐算法也好,做运营活动也罢,都靠它串联。还有做客服消息推送,用户在小程序里提交了表单,你后端拿openid调微信的客服消息接口,就能主动给用户发通知。甚至做多端登录打通,你小程序和公众号是同一个开放平台账号,用unionid把两个端的openid关联起来,用户在小程序里登录过,公众号那边也能识别出来。这些都是后话,但基础都在openid这一步。
给你捋一遍完整流程,三分钟其实足够你跑通了。前端写一行wx.login,把code发到后端;后端拿code调微信接口,得到openid和session_key;存库,返回登录态给前端。就这么简单,没有别的花活。我这篇文章写完,你照着敲一遍,半小时内肯定能出结果。如果你已经会了,可以试试进阶玩法,比如把openid和手机号绑定、做静默登录、搞用户分群。要是遇到具体的报错,评论区把错误码贴出来,我看到了会回。
