首先你真的需要获取用户的信息吗?如果只是想要展示的话,直接使用组件就可以,组件可以在小程序界面展示这些信息:昵称、头像、性别、城市、语言等。
如果你的小程序在服务器上保存了用户数据,比如用户创建的投票信息、用户的备忘录、用户的视频等,那么你的小程序通常需要登录功能,这意味着你可能需要在服务器上保存用户的、、等信息。如果是这种情况,你需要继续阅读。
你真的需要它吗?
如果你使用了小程序云开发的数据库,需要根据用户从中读取数据,那么就可以使用这种固定的写法来表示用户,这样就可以直接在前端操作数据库,而不需要先通过其他API获取用户。
db.collection("test") .where({ publisher: "{openid}", }) .get();
旧界面失去了弹出窗口的功能,无法获得真正的
从2018年4月30日开始,wx.()无法调出授权弹窗。这是为了防止开发者滥用此接口,随时调出弹窗,影响用户体验。只有用户授权了,此接口才会被调用并返回。如果用户之前没有授权过,或者拒绝授权,不但不会弹窗,而且会直接失败。
那么如何获得用户授权呢?
要获得授权,需要用户主动点击组件授权,点击之后会弹出弹窗,询问用户是否同意授权。不过预计2021年4月13日起,此组件将无法显示弹窗(PC微信除外,下文讲解)。与wx.()不同,虽然没有弹窗,但不会失败,而是直接返回诸如、、、等数据。不过、不再是真实的,而是匿名的:
{ "userInfo": { "avatarUrl": "一个指向灰色头像的 URL", "city": "", "country": "", "gender": 0, "language": "", "nickName": "微信用户", "province": "" }, "rawData": "userInfo字段的字符串格式", "encryptedData": "这个数据解密之后可以获得匿名的 userInfo,以及真实的 unionid、openid", "cloudID": "如果开通了小程序云开发,还会返回这个数据" }
从4月13日开始,在用户同意授权的情况下,wx.()获取的信息和上面一样,也就是匿名的。
总结一下,从4月13日开始,以上两种方法还可以用,但是都不能弹窗,都无法获取到真实,甚至解密结果都是匿名的,好在解密后获取到的结果是真实的。
如果你开启了小程序云开发,使用以上两种方式获取的数据均无法获取真实数据,只能获取匿名数据。
要获取真实版本,您需要使用新 API
那么如何才能搞定实物呢?微信推出了一个新的API:wx.()。这个API只能在点击事件函数内部调用,所以弹窗只能在用户点击某个组件时才会被调出来,而且必须由用户发起。
它与以前的授权有以下不同之处。
需要注意的是,从2021/12/07开始,PC版微信已经不支持wx.(),微信给出的解决方案是:判断当前环境下是否可以使用wx.(),如果不行则通过授权获取,具体可以参考。
wx.() 可以直接获取,
请注意,获取它的前提是将小程序绑定到微信开放平台。
从2021年2月23日开始,如果小程序绑定了微信开放平台,那么就可以通过wx.()获取到所谓的登录凭证(code),并把这个code发送到开发者的服务器,开发者可以在自己的服务器中获取微信提供的用户auth.接口。
之前是无法直接通过 wx.() 和 auth 获取 ID 的,需要先关注绑定在同一个微信开放平台的公众号,才能通过上述方式获取这两个 ID。将小程序绑定到微信开放平台是开发者的事,但是否关注公众号则完全由用户决定。现在取消了用户关注公众号这一步骤,大大降低了获取 ID 的难度。
需要注意的是,顾名思义,它是用来代替代码的,更像是它的副产品,才是它的主角。它的功能大概有三种。
第一个作用是验证数据是否真实,虽然一般都是通过微信API来获取,但是为了保证数据在传输过程中没有被篡改,可以使用真实性验证。
第二个功能是解密敏感信息,比如wx.、微信运动返回的信息,以及旧版本手机号获取接口返回的信息;
第三个作用是保持用户的登录状态。有个过期时间,这个时间是微信服务器决定的,用户使用你的小程序越频繁,用户的过期时间就越长。过期时间不受开发者控制,开发者可以使用 wx.() 判断是否过期,如果过期了,可以认为用户已经退出登录,可以让用户重新登录。之所以关注过期时间,主要是因为前面说了需要解密用户的敏感信息,而要想获取最新的敏感信息,就意味着每隔一段时间就要用不过期的数据解密最新的解密数据。
另一个需要保持用户登录状态的原因是小程序前端向后端请求API时,如果想保护这个API不被黑客滥用,需要在请求时提供参数,以便后端判断请求是否合法,这可以由后端生成,也可以根据设置的有效期判断。
微信为什么要搞得这么复杂呢?这个是出于安全考虑,在前端通过wx.()获取code,在后端将code传递给auth.获取。code是在前端生成的,所以黑客获取起来比较容易。但是因为只出现在后端,所以黑客不容易获取。
总结之前获得的方法
获取方式有两种:通过前端小程序获取、通过后端服务器获取。
获取前端的方式有两种:
获取后端的方法也有两种:
这四种方式很快就不能用了(PC版微信除外,具体见前文),因为这四种方式获取的信息都是匿名的。
如何立即获取
从4月23号开始,不再支持从后端获取,只能通过前端获取,我的理解是如果后端需要的话好像只能先把敏感数据加密后再发送给后端。
如果之前没有授权过,那么获取真正的授权就只有一个办法,就是使用wx.(),每次都会弹窗让用户授权,如果不想反复询问,可以使用wx.()来判断是否已经授权。
如果之前已经授权过,再次想要获取:只有一种方式,同上,所以第一次获取的时候要考虑适当保存一下用户的信息,方便后续直接从数据库里获取。
上面提到,由于PC版微信目前不支持wx.(),因此PC版微信需要它。
现在获取方法
获取 不存在授权机制,因为不需要授权。获取方式有两种:
以往第一种方式需要用户关注绑定同一微信开放平台的公众号才能获得,现在不需要关注这个公众号了。
如果在小程序端只使用数据库操作,那么可以直接通过{}来表达,就像本文开头介绍的那样。
回复标题
回到文章标题,没有弹窗,是不可能获取完整真相的,每次获取都需要弹窗。而的获取,是不需要用户授权的,也不需要弹窗。
如果你的微信开放平台绑定了小程序和公众号,并且用户关注了这个公众号,那么其实是可以做到不弹窗就获取用户信息的:小程序不用弹窗请求授权,公众号不用弹窗请求授权,就可以利用相关信息获取用户的信息。将两者打通,就可以在小程序端不弹窗请求授权的情况下,获取完整的信息。当然这种方法以前也有人用过。
更新2021/12/07:如上所述,从2021年12月27日起,那些无法获得任何通过和公共账户的人可以继续获得。
相关文章: