个人网站微信扫码登陆.小程序码登陆.免关注(一)
文章目录
也就是我博客的微信扫小程序码登陆方案.不需要向腾讯缴纳一年300的审核费用.也不需要关注微信公众号.
传统微信公众号OAUTH
先说下微信公众号集成的oauth.
有两个非常严重的限制.
- 必须要微信内置浏览器打开某个网页.不方便做网页集成.
- 必须要关注微信公众号才能拿到用户名字等一些基本信息.
它分两种授权模式.
- snsapi_base
- snsapi_userinfo
snsapi_base 无弹出授权提示.只能获取到openid. 只有在用户关注了情况下,可以用openid换取用户信息.
snsapi_userinfo 有弹出授权提示,未关注微信公众号的情况下,只能获取到openid. (只有关注了微信公众号才能获取到用户名等一些信息)
这个我博客自己在改写之前,用了这个方案. < 实现PC端微信扫码登录,无需关注微信公众号 >
( 用的是腾讯微信公众号免费的测试号. 不关注的情况下,只能获取openid,那时候只是管理员登陆,只需openid即可.)
微信其他OAUTH方案
当然指的是能拿到用户微信名字/openid等一些基本信息的.
微信开发者平台--web的OAUTH
开放平台申请一个网页oauth应用.
它不需要关注微信公众号.
它还能获取用户基本信息.
它什么都香,不香的地方是他要花钱,一年300的审核费用.
微信小程序扫码登陆
这是一个曲线方案.
从我博客用thinkphp6改写后(2020年5月20日),应用上了.
微信小程序能拿到用户openid,用户名基本资料.
个人可随意申请(5个内)微信小程序号.且不需要额外花钱.
可以绑定免费的开发平台账号,拿到用户的unionid.
它完全不花钱!能拿到用户unionid.
当然也有一些限制
限制1, 小程序码生成有限制
小程序码有三种,实际按期限分可以分
- 永久小程序码 : 累计总数量 不能超过10万.
- 临时小程序码 : 每分钟调用接口不能超过5000次 (即使相同参数的码也算额外一次.)
限制2,小程序扫码比较慢.
因为小程序需要动态下载小程序包,所以比普通扫码要慢.
尽管如此,综合下,小程序扫码登陆还是比较适合我这种小网站的.
小程序获取用户信息
微信小程序获取用户信息有两个方向,一个是云函数,一个是非云函数.
非云函数
非云函数,用户不授权,啥都拿不到.
不加密的信息就是微信名字.微信头像.等,不包括openid,unionid.
想要openid,unionid.需要解密加密的信息.这不花钱.只是多了一个步骤.下文补充介绍.
云函数
云函数我只是测试的时候用过一次,
云函数获取的信息正好和非云函数信息互补.
它能不需要用户授权的情况下拿到openid和unionid.
当然unionid有限制,不是随便给你.
云函数 想要拿到unionid有两种
- 调用微信支付,能在支付完成后,5分钟内拿到unionid
- 开发平台同时绑定微信公众号和小程序,且用户关注了微信公众号的情况下.只有同时满足这几个情况下,调用云函数才会返回unionid.
想要用户基本信息还是要用户授权.
当然认证的微信服务号+小程序可以无需授权拿到用户信息.条件是先拿到unionid,也就是上面说的用户必须关注它微信公众号.才能获取unionid.
通过unionid可以换取微信公众号openid,通过openid能获取到关注用户的基本资料.
综合一下,个人用户还是建议直接放弃云函数.
云函数有调用免费额度,超过额度收费.
即使不考虑调用额度问题 , 云函数个人用户/免费用户是无法获取unionid .
小程序获取OPENID和UNIONID
非云函数用户授权后.
小程序拿到的信息有
rawData(透明信息) , iv(加密初始向量) , encryptedData (加密信息) 等.
code (解密授权码)是调用wx.login函数静默获取的.
rawData(透明信息)
比如我的
{ "nickName": "Y.A.K.E", "gender": 1, "language": "zh_CN", "city": "Xinyu", "province": "Jiangxi", "country": "China", "avatarUrl": "https://thirdwx.qlogo.cn/mmopen/vi_32/4E65CticqYYmCJxFSjRBQOYwBc5LueusZVZZw9DPm4ltzpADiaU9L5wwtabMf2G8yCFriajF2bXyWYXCzUxT6lBEg/132" }
它不包括openid,uninoid.
encryptedData (加密信息)
解密并不复杂.
不过密钥不是直接给你的.
需要用code(授权码) 调用api 换取 session_key (解密密钥).
调用api是免费的,拿到密钥后,解密也非常简单.
解密可以选小程序内解密,或者服务器解密.
小程序内部解密.
不过这样需要将小程序开发密钥放在小程序端.
小程序是能被反编译的.所以它不是一个安全操作.
将加密信息传到web服务器解密.
这样不用担心暴露小程序密钥.是一个推荐操作
解密后的信息如下.
{
"openId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"nickName": "Y.A.K.E",
"gender": 1,
"language": "zh_CN",
"city": "Xinyu",
"province": "Jiangxi",
"country": "China",
"avatarUrl": "https://wx.qlogo.cn/mmopen/vi_32/WWCC67raM9t3A05kuyjmR3tXlLor4DQkFwmSBY3icN0YYjPtZudf2mBsVv1C5CGkaAibjKBDBicOysRP1nFqtgjrA/132",
"unionId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"watermark": {
"timestamp": 1543412981,
"appid": "wx8a18e3c3091991ef"
}
注意,默认的小程序只会返回用户信息 + openid, 不会返回unionid.
想要unionid就一定要绑定开发者平台.
个人的开放平台账号,或者免费的开放平台账号一共可以免费绑定5个小程序.
扫小程序码网站登陆流程
以下就是我博客大致扫码流程.
web服务器 --> 生成一个登陆token字符串,记录到数据库.
web服务器 -- > 调用微信接口,将token字符串,生成小程序码.显示在网页上.
(微信扫码)
小程序 -- > 读取小程序码传入的token字符串.
小程序 -->用户登陆 --> 用户授权(拿到用户code) -->将code和加密的用户信息和iv和最初传入的token 四组信息 post到web服务器.
web服务器 --> 通过code解密换取密钥,解密并获取用户信息.
web服务器 --> 将用户信息保存到数据库,新增或者更新或者绑定网站用户.
web服务器 --> 通过小程序返回的token,通知浏览器登陆.
相关的代码和一些注意事项后续博文会详细说明.