QQ开放平台第三方登录经验与教训(java sdk4j) - 高飞网
123 人阅读

QQ开放平台第三方登录经验与教训(java sdk4j)

2017-08-26 07:22:07

    关于QQ登录,官方文档已很详尽,相关博客教程也不少,这里不在赘述,只列举几个自己碰到的问题。
    场景说明:网站接入,java语言。
    以下是官网上关于Java SDK的相关描述,见这里

SDK类型
最近更新日期
文件大小
说明
Java SDK v2.0
2013-01-07
3990K

使用说明:

1. 直接引入Sdk4J.jar 包至项目工程内。
2. 修改qqconnectconfig.properties 文件,在指定修改的地方填写自己app的相关信息和要获取的scope权限(前4行信息)注意不要试图修改api的请求地址,这里之所以暴露出来是为了方便兼容以后的变动。
3. 将qqconnectconfig.properties文件放到自己的项目的context ClassLoader的可以加载的目录下,一般放在项目的src目录即可。
4. 查看demo程序,结合api doc文档,进行接口的调用。
MD5:
F0D2F0D7A09EC72FB27E46C0B0179470


无法获取QQ头像问题

    将下载的文件解压出来,有一个sdk4j_demo,是官方为开发者准备的示例程序,我把相关示例程序拷贝到自己的项目中做实验(代码稍作改动,只获取了用户信息,其他如微博没有权限,因此去掉了)。

    从上图可见,官方提供获取的头像,都没有显示出来。获取用户信息(包含头像)部分的代码如下:

out.println("<p> start -----------------------------------利用获取到的accessToken,openid 去获取用户在Qzone的昵称等信息 ---------------------------- start </p>");
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
out.println("<br/>");
if (userInfoBean.getRet() == 0) {
    out.println(userInfoBean.getNickname() + "<br/>");
    out.println(userInfoBean.getGender() + "<br/>");
    out.println("黄钻等级: " + userInfoBean.getLevel() + "<br/>");
    out.println("会员 : " + userInfoBean.isVip() + "<br/>");
    out.println("黄钻会员: " + userInfoBean.isYellowYearVip() + "<br/>");
    out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL30() + "/><br/>");
    out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL50() + "/><br/>");
    out.println("<image src=" + userInfoBean.getAvatar().getAvatarURL100() + "/><br/>");
} else {
    out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());
}
out.println("<p> end -----------------------------------利用获取到的accessToken,openid 去获取用户在Qzone的昵称等信息 ---------------------------- end </p>");

    注意这行:userInfoBean.getAvatar().getAvatarURL30()

    我们反编译sdk中的代码,看头像是怎么获取的。

this.avatar = new Avatar(json.getString("figureurl"), json.getString("figureurl_1"), json.getString("figureurl_2"));

    上面看到,是从请求返回的json中解析出来的。

    然而通过官方文档http://wiki.connect.qq.com/get_user_info,返回的json是这样的:

{
    "ret":0,
    "msg":"",
    "nickname":"Peter",
    "figureurl":"http://qzapp.qlogo.cn/qzapp/111111/942FEA70050EEAFBD4DCE2C1FC775E56/30",
    "figureurl_1":"http://qzapp.qlogo.cn/qzapp/111111/942FEA70050EEAFBD4DCE2C1FC775E56/50",
    "figureurl_2":"http://qzapp.qlogo.cn/qzapp/111111/942FEA70050EEAFBD4DCE2C1FC775E56/100",
    "figureurl_qq_1":"http://q.qlogo.cn/qqapp/100312990/DE1931D5330620DBD07FB4A5422917B6/40",
    "figureurl_qq_2":"http://q.qlogo.cn/qqapp/100312990/DE1931D5330620DBD07FB4A5422917B6/100",
    "gender":"男",
    "is_yellow_vip":"1",
    "vip":"1",
    "yellow_vip_level":"7",
    "level":"7",
    "is_yellow_year_vip":"1"
}

    这样我们知道,其实Java SDK中取出的图片,是空间头像,而不是QQ头像,如果想取QQ头像,应取figureurl_qq_1或figureurl_qq_2。

    至于怎么去取这里就不介绍了,无非是自己发http请求,或者修改一下sdk的源代码。

jar冲突问题

    上了qq第三方登录以后,发现原来的登录操作竟然不好使了,报如下错误:

java.lang.NoSuchMethodError: org.apache.commons.codec.binary.Base64.decodeBase64(Ljava/lang/String;)[B

    竟然Base类的方法找不到了,回来查看程序,一看,原来官方提供的Sdk包竟然把很多第三方的包都打进去了,如下:

    其中,只有com.qq.connect包中的内容是真正的官方封装,一旦把其他的导入,问题就大了,是明显的就是jar冲突了,因为这个Sdk比较旧了(大概2012~2013年的样子),因此很容易导致现在用到的类或接口,被它覆盖,导致方法找不着,看来下一步要把com.qq.connect包抽出来了。


还没有评论!
54.162.139.105