也就是我博客的微信扫小程序码登陆方案.不需要向腾讯缴纳一年300的审核费用.也不需要关注微信公众号.

 

传统微信公众号OAUTH

先说下微信公众号集成的oauth.

 

有两个非常严重的限制.

  1. 必须要微信内置浏览器打开某个网页.不方便做网页集成.
  2. 必须要关注微信公众号才能拿到用户名字等一些基本信息.

 

它分两种授权模式.

  • 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有两种

  1. 调用微信支付,能在支付完成后,5分钟内拿到unionid
  2. 开发平台同时绑定微信公众号和小程序,且用户关注了微信公众号的情况下.只有同时满足这几个情况下,调用云函数才会返回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,通知浏览器登陆.



 

相关的代码和一些注意事项后续博文会详细说明.