实例讲解QQ不同应用中判断QQ号绑定[DZ与天天团购互联]

作者: unvs 分类: OAuth 发布时间: 2012-11-10 10:08 ė121,910 views 63条评论

今天周六,八点半起来,博主精神抖擞。想写篇博文,散发下大脑思维。呵呵,也没有了。这两天在做一个QQ登录互联的应用,关于一个项目:天天团购系统如何判断另一个Discuz站点的QQ号是否已被DZ QQ互联所绑定(前提是站长对两个站点都有数据管理权限),并实现在团购网集成QQ登录,新注册为网站会员。这个说来好像挺简单,其实不然,关键点就是要如何判断DZ站点是否已绑定了此QQ,并进行处理。好了,这篇文章主题内容就是这些,不过没有完整的代码及Demo演示、SDK分享,仅是对可实现原理的讲解及制作全过程的流程思路。欢迎拍砖、留言!

一、关于天天团购与discuz x2.5程序
天天团购系统,顾名思义,一款较受欢迎的团购系统,且开源免费使用,不过了解免费版有很多功能限制,论坛官网没提供什么服务,免费版已集成了UCenter,可以进行相关配置信息填写,开启即可与DZ站点进行用户互通,只需一步激活操作就OK,还是非常实用的;Discuz论坛就不用多说了吧,国内大型社区论坛建站系统,之前写过一篇关于 讲述discuz的优劣势 文章,这里就不介绍了,本身DZ集成了QQ互联插件,并且是通过云平台官方集成的插件,接口与普通网站QQ应用接入是不一样的。(PS:每次写带讲解、原理的文章,已习惯先解释一些相关词语)

二、天天团购QQ登录与DZ实现互联的原理
这块,着重详细讲解实现互联原理的问题及思考思路,一步步推进,得到最终完美实现的方法,想直接看最后的方法,查看第4点。
1、要想在团购站内集成QQ登录,并实现与DZ的互联。就要判断DZ数据库中是否已绑定了此QQ号,不然则会出现QQ号两边绑定、两个账号,就会出错、无法统一。有人就问了,天天不是集成了UCenter,不就可以判断用户是否存在、是否绑定QQ号。这是个很天真的问题,或可以说不够熟悉QQ OAuth登录原理。集成UCenter,但是无法判断此QQ号是否绑定,因为DZ站点保存的QQ用户信息,不会返回QQ号给你保存的。说到这,关键可以唯一判断及区分此QQ绑定的标识就是OPENID,这个是应用信息返回,区分不同QQ号的唯一标识。

2、到这又有疑问了:既然数据库保存了OPENID,那么可以在天天QQ登录后,将返回的OPENID与DZ数据库保存OPENID的表进行匹配,如果存在,说明此QQ已在DZ站点绑定,获取DZ用户信息,在天天站点进行注册;若不存在则没有绑定,直接获取QQ用户信息进行注册,同时注册进UCenter。这样就实现了天天与DZ的用户互联。

3、可是,还有一个最重要的问题,在QQ第三方平台应用,技术OAuth文档中,有这么一条说明:同一个QQ号码在不同的应用中有不同的OpenID。(这是原话,详细查看页面Step4中openid项:【QQ登录】Qzone_OAuth_1.0认证简介)这句话意思就是:当你的不同站点属于不同应用下时,获取的Openid是不一样的,那么就不能简单的从数据库通过openid判断对方站点是否绑定此QQ,除非你是同一个应用下。回到这个案例中来,得说一下,DZ集成的QQ互联插件,是由QQ discuz云平台分配的应用key及secret,与你申请的网站应用完全是两码事。所以,肯定通过openid来判断肯定是不可行。实现方法见第4点。

4、前面说了,通过Openid判断不可行。那么,我就直接讲方法,不拐弯子,其实,我们可以间接通过DZ QQ互联应用接口(即天天直接调用DZ提供的接口,达到应用的唯一),获取QQ号信息,直接在DZ端判断此QQ号是否绑定,若绑定,则返回论坛的用户数据,回调给天天团购站点;若未绑定,则实现DZ QQ登录,同时,还是要回调返回的用户信息给天天。这样就实现了信息的判断与获取,及用户数据的互联同步。貌似挺简单,简单的两句话,但实现过程还是有点麻烦的,详细制作流程讲解见第三点。

三、DZ新增QQ登录接口,天天实现接口的调用
上面说了原理,这块主要概要叙述如何实现并制作DZ接口的流程。我就不单以文字叙述,图文结合,应该更容易理解。如下图所示流程:
 
1、安装好DZ X2.5与天天团购网站后,首先,我们要在DZ端建立一个新的QQ登录接口,供天天调用,这也就是图示红色1的流程;
比方新建接口地址可以是: dz/connect.php?mod=login&op=oauth_init(Discuz论坛QQ登录按钮跳转地址是:dz/connect.php?mod=login&op=init)
新建API接口涉及的文件:dz\source\plugin\qqconnect\connect\connect_login.php
定义新的回调地址涉及的文件:dz\source\plugin\qqconnect\connect.class.php
2、DZ接收来自天天的请求,进行转向处理。
3、请求至QQ平台方,进行授权;
4、返回openid及相关access_token,DZ通过前两者调用QQ API的get_user_info用户接口得到用户信息,这些DZ都已做好;
5、逻辑处理,DZ端判断此QQ号,是否已被绑定,若绑定,则返回论坛的用户数据;若未绑定,则实现DZ QQ登录;
6、最后,无论绑定与否,都需要通过第一步传入的回调地址,将相关用户信息回调到天天站点,然后进行处理。

至此,整个制作逻辑处理完成,会发现整个过程,天天其实没有直接与QQ平台进行连接,而是完全由DZ完成。

这篇文章终于写完了,花了1、2个小时,做图还花了些时间(有点潦,大家能明白就行)。可能有些还不够完整,算将自己的一点思路分享给可以用到的博友,分享知识、分享快乐,有什么问题或不对的地方,可留言提出。谢谢大家的支持!!!

本博文章基本上属于原创或收集整理,都是心血结晶。
欢迎转载分享,转载请注明出处,谢谢!
本文地址:实例讲解QQ不同应用中判断QQ号绑定[DZ与天天团购互联]

3 条评论

  1. yanchenghust 2013 年 4 月 1 日 下午 7:23 回复

    写的很好啊,不过请问,dz开通qq互联后,它将openid存放在哪个表呢?

    cyheng 于 2013-04-09 01:45:23 回复

    您好,DZ开通互联,你到数据库中,会看到一个带connect的表,这个就是保存QQ登录的appid及access_token数据!

  2. bluespring 2013 年 4 月 27 日 上午 9:43 回复

    我现在也有这样的需求,一搜索就搜索到你的文章真是幸运,先谢谢博主!腾讯互联现在禁止了强制注册比较恼火,我的网站不强制注册很多功能要改。我挂载了discuz论坛,已经实现UCenter与网站同步用户登录等,也想直接使用discuz的qq登录来替换网站的qq登录。我的想法是网站上的qq登录直接链接到discuz的qq登录上,成功后区别referer不同分别跳转回主站或论坛。(discuz站内已经实现该功能)直接测试不成功,估计discuz做了判断不是自己站内的就直接跳转论坛首页。我是做java的,基本不懂php,还请博主帮忙说明下connect.class.php的逻辑,大概应该在哪里改。谢谢!

    cyheng 于 2013-04-30 00:04:54 回复

    你说的是对的,现在DZ站点的QQ互联,已经加了来源Url及要回调地址的判断,文章中说的原理还是不变的,但可以改掉来源Url,进入论坛时加一个中转跳转即可实现,博主已经实践成功。

  3. zhangyh 2014 年 2 月 26 日 下午 5:43 回复

    其实不用这么复杂,你找qq互联的人,把两个应用的APP ID给他,他可以帮你内部绑定的。实现两个APP ID 统一qq账号返回同样的openID。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Ɣ回顶部