微信订阅号实现oauth授权登录的方案 - ghostsf

in 旧文字 with 0 comment

1.jpg

关于微信的订阅号,服务号还有企业号的区别,我就不多阐述了,微信相关文档上也有了详细的说明。
但是呢,还是有很多人,包括很多开发者,也很难讲清楚,订阅号和服务号的区别,这里就不谈企业号了(这是另一回事了)。
那么订阅号和服务号本身的区别有哪些呢? 本来想放一个图好好说嘛下的,现在想想还是算了。指不定等你看到这篇文章的时候,微信已经修改了相关设定。目前具体的,可以参考微信的官方文档了。
但是这里需要说的一个痛点是微信订阅号不能实现网页授权获取用户基本信息,即使微信认证了也不可以的。只有认证了的服务号才可以用网页授权,但是服务号有个痛点,也是很多人比较尴尬的,就是每个月只能群发图文4次(以前每个月只能1次)。当然并不是吐槽这个设定有多不好,只是确实有这样的需求,就是既要每个月每天都可以群发图文,也要可以实现网页授权进行一些高级的功能定制。
好了,以上把这一问题抛露出来,下面ghostsf给大家介绍两个实现方案:

方案一:
主要是利用UnionID机制。这里可以把UnionID机制再阐述一下:

UnionID机制说明: 开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

以上这段说明来自微信官方文档。由此可知,基于微信开放平台可以统一多个移动应用、网站应用和公众帐号(当然这里主要讲公众号)。在不同的公众号下,用户的unionid是唯一的。可以利用此机制借用认证过的服务号间接地实现订阅号的网页授权。

具体实现方案的思路就是:

2.png

注册一个微信开放平台,在开放平台上绑定上认证过的服务号以及订阅号。当然这里的认证过的服务号你可以去找别人的服务号借用一下(也有一些第三方的服务平台,可以借用,这里就不多阐述了)。这个时候,在订阅号上,借用服务号的网页授权接口,auth授权后会返回openid(当然这个是服务号的用户openid),同时也会返回该用户的unionid,这个unionid是唯一的。绑定了开放平台的订阅号也能获取到该用户的unionid,获取的方案可以是从消息回调里获得unionid(当然可以在关注的时候直接获取并存储到数据库里)。这样通过unionid关联即可间接地获得订阅号的openid,此后就可以用订阅号的用户openid来区分用户进行相关业务逻辑处理了(当然也可以直接根据unionid来处理),从而实现了订阅号的auth网页授权。

方案二:
这个方案是利用了开放平台网站应用网页授权接口本身的一个缺陷(或者说漏洞吧)。
首先可以先看下相关文档:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=&lang=zh_CN
同样需要用到网站应用,那么需要在开放平台上创建一个网站应用(如果你已经创建过了,那可以忽略)。

1.png

如果直接使用开放平台的网站应用的微信登录功能,只能出现基于二维码的扫一扫页面,并且只适用于pc端的微信登录。
那么如何给订阅号来用呢?下面注意看了:
开放平台官方提供的认证地址是:
https://open.weixin.qq.com/connect/qrconnect?xxxxxx

它会生成一个二维码需要微信扫描登陆后获取信息,这和微信公众号网页授权自登录相差太远了。
这里披露一个缺陷(或者说漏洞),即更换上面的认证地址为:
https://open.weixin.qq.com/connect/oauth2/authorize?xxxxx

目前这个接口地址,微信是没写入开放平台的官方文档的,但是却可以实现订阅号的微信网页授权,不过和服务号的OAuth不同的是,这种方式是登陆操作(scope必须只能设置成snsapi_login),不是snsapi_base或者snsapi_userinfo。

当然这里的appid填写的是网站应用的appid而不是订阅号的appid,这里的redirect_uri是在订阅号上需要授权后跳转的地址。
在授权跳转的地址里,即可获取到access_token以及openid。

至此即可借用此接口实现订阅号的网页授权的相关开发了。

By ghostsf 原创声明:本文为作者原创,未经允许不得转载,经授权转载需注明作者和出处

Responses