微博如何用qq号登录,微博怎么登qq号

首页 > 实用技巧 > 作者:YD1662024-01-09 16:00:21

然后到了这里我就碰到一个问题了,官方文档(https://wiki.connect.qq.com)写的是登录成功之后首先会回传一个code,然后再拿code调接口换取accessToken,然后我试了很多次也换过2个账号发现每次都是直接返回了accessToken,帮我省了一步了,不知道是什么情况,郁闷。微信搜索 Web项目聚集地 获取更多实战教程。

3.4. 拿到accessToken

现在假设我们都是直接拿到accessToken(因为我暂时还没搞明白QQ为啥会直接返回,跟文档说的不一样),但是授权回调时accessToken会被放在 # 后面,URL地址中的hash值好像不会被传到后台(貌似是这样,如有不正确欢迎评论指正),所以只能写一个下面这样的临时页面:

@RequestMapping("/authqq") public void authQQ(HttpServletRequest request, HttpServletResponse response) throws Exception { // QQ登录有点特殊,参数放在#后面,后台无法获取#后面的参数,只能用JS做中间转换 String html = "<!DOCTYPE html>" "<html lang="zh-cn">" "<head>" " <title>QQ登录重定向页</title>" " <meta charset="utf-8"/>" "</head>" "<body>" " <script type="text/javascript">" " location.href = location.href.replace('#', '&').replace('auth_qq', 'auth_qq_redirect');" " </script> " "</body>" "</html>"; response.getWriter().print(html); }

3.5. 获取openId

根据accessToken调接口获取用户的openId,特别注意这个openId是相对于QQ号 appId唯一的,换句话说同一个QQ号登录2个不同appId时获取到的openId是不同的。顺便说一句,QQ登录的相关接口做的还真够“随便”的,全部都是最简单的get请求,所以对接起来非常顺利。 微信搜索 Web项目聚集地 获取更多实战教程。

直接看代码:

// 根据accessToken换取openId // 错误示例:callback( {"error":100016,"error_description":"access token check failed"} ); // 正确示例:callback( {"client_id":"10XXXXX49","openid":"CF2XXXXXXXX9F4C"} ); String result = HttpsUtil.get("https://graph.qq.com/oauth2.0/me?access_token=" accessToken); Map<String, Object> resp = parseQQAuthResponse(result); // 这个方法就是把结果转Map // 欢迎关注 Web项目聚集地 获取更多实战教程 Integer errorCode = (Integer)resp.get("error"); String errormsg = (String)resp.get("error_description"); String openId = (String)resp.get("openid"); if(errorCode != null) return new ErrorResult(errorCode, "获取QQ用户openId失败:" errorMsg);

3.6. 获取用户头像昵称等信息

// 获取用户昵称、头像等信息,{ret: 0, msg: '', nickname: '', ...} ret不为0表示失败 result = HttpsUtil.get("https://graph.qq.com/user/get_user_info?access_token=" accessToken "&oauth_consumer_key=" appId "&openid=" openId); resp = JsonUtil.parseJsonToMap(result); // 欢迎关注 Web项目聚集地 获取更多实战教程 Integer ret = (Integer)resp.get("ret"); String msg = (String)resp.get("msg"); if(ret != 0) return new ErrorResult("获取用户QQ信息失败:" msg); ​ // 用户昵称可能存在4个字节的utf-8字符,MySQL默认不支持,直接插入会报错,所以过滤掉 String nickname = StringUtil.filterUtf8Mb4((String)resp.get("nickname")).trim(); // 这个方法可以自行百度 // figureurl_qq_2=QQ的100*100头像,figureurl_2=QQ 100&100空间头像,QQ头像不一定有,空间头像一定有 String avatar = (String)resp.get("figureurl_qq_2"); if(StringUtil.isBlank(avatar)) avatar = (String)resp.get("figureurl_2"); String gender = (String)resp.get("gender");

3.7. 注意事项

到了这一步基本上涉及第三方的就结束了,是不是很简单?后面无非就是如何插入数据库、如何保存token、写入session等。

有几点注意事项:

相关文档官网已经写得比较细了,但是比较乱:http://wiki.connect.qq.com/

对接微博登陆

4.1. 实名认证

这个我就不具体讲了,登录 http://open.weibo.com/ 很容易找到相关入口,注册成为开发者,实名认证,一模一样的。

4.2. 创建应用

点击链接 http://open.weibo.com/apps/new?sort=web 创建web应用:

微博如何用qq号登录,微博怎么登qq号(9)

创建成果后完善相关信息,主要是下面这些:

微博如何用qq号登录,微博怎么登qq号(10)

我就不一一介绍了,都看得懂。

微博登录不需要网站一定要备案,但对网站本身有一定要求,不能弄一个空壳网站让人家去审核,肯定审核不通过的。

有关微博的对接可以参考我好几年前写的一篇文章:

http://www.cnblogs.com/liuxianan/archive/2012/11/11/2765123.html

4.3. 引导用户登录

微博视觉素材(https://open.weibo.com/wiki/微博标识下载)下载在这里,页面合适位置放一个登录按钮:

function weiboLogin() { let weiboAppId = '432432'; let weiboAuthPath = 'http://www.test.com/authweibo'; openWindow(`https://api.weibo.com/oauth2/authorize?client_id=${weiboAppId}&response_type=code&redirect_uri=${encodeURIComponent(weiboAuthPath)}`); }

微博登录有一个好处,第一次登录需要授权,后面第二次登录时只会一闪而过自动就登录成功了,都不需要点一下,用户体验非常好,看下图:

微博如何用qq号登录,微博怎么登qq号(11)

4.4. 获取accessToken

登录成功会返回一个code,根据code换取accessToken:

String params = "client_id=" appId "&client_secret=" appSecret "&grant_type=authorization_code" "&redirect_uri=" URLUtil.encode(authPath) "&code=" code; // 用code换取accessToken String result = HttpsUtil.post("https://api.weibo.com/oauth2/access_token", params); Map<String, Object> resp = JsonUtil.toObject(result, new TypeReference<Map<String, Object>>(){}); ​ Integer errorCode = (Integer)resp.get("error_code"); String error = (String)resp.get("error"); String errorMsg = (String)resp.get("error_description"); if(errorCode != null && errorCode != 0) return new ErrorResult(errorCode, error (errorMsg==null?"":errorMsg)); String accessToken = (String)resp.get("access_token"); String uid = (String)resp.get("uid"); // 这个uid就是微博用户的唯一用户ID,可以通过这个id直接访问到用户微博主页 int expires = (Integer)resp.get("expires_in"); // 有效期,单位秒

4.5. 获取用户头像等信息

// 用uid和accessToken换取用户信息 String result = HttpsUtil.get("https://api.weibo.com/2/users/show.json?access_token=" accessToken "&uid=" uid); Map<String, Object> resp = JsonUtil.toObject(result, new TypeReference<Map<String, Object>>(){}); ​ errorCode = (Integer)resp.get("error_code"); error = (String)resp.get("error"); errorMsg = (String)resp.get("error_description"); if(errorCode != null && errorCode != 0) return new ErrorResult(errorCode, error (errorMsg==null?"":errorMsg)); ​ String nickname = (String)resp.get("screen_name"); // 微博180*180高清头像 String avatar = (String)resp.get("avatar_large"); String gender = (String)resp.get("gender"); gender = "m".equals(gender) ? "男" : ("f".equals(gender) ? "女" : ""); 至此涉及第三方的东西都完了,剩下的就是用户自己保存到数据库、写入token 保存 session 以及鉴权接口开发了。 4.6. 注意事项

相关链接

上一页123末页

栏目热文

文档排行

本站推荐

Copyright © 2018 - 2021 www.yd166.com., All Rights Reserved.