last modified:2013-10-11 14:24:11
*********************************************
之前已经介绍过一篇新浪微博登录的文章,这里再介绍一下腾讯微博登录,其实两者的流程都是一样的,但有一些细微的差别。具体流程和新浪微博一样,首先需要在腾讯微博开放平台(http://dev.t.qq.com/)申请的App Key和App secret。
我使用的是腾讯提供的javaSDK进行开发,更多语言的SDK可以到这里下载。
/** * 腾讯微博登录初始化. * * @param OAuth * version 2 认证参数实体类 * */ private void init(OAuthV2 oAuth) { //你申请到的app key oAuth.setClientId(client_ID_TENCENT); //你申请到的 app secret oAuth.setClientSecret(client_SERCRET_TENCENT); //授权成功后的回调URL,以上根据你的实际情况填写,建议使用配置文件的方式在类初始化的时候读取。 oAuth.setRedirectUri(redirect_URI_TENCENT); } /* 获得授权URL,当然你也可以自己拼接字符串,格式为: https://open.t.qq.com/cgi-bin/oauth2/authorize?client_id=client_ID_TENCENT&response_type=code&redirect_uri=redirect_URI_TENCENT */ @RequestMapping(value = "/tencentWeibo") @ResponseBody public String tencentWeibo() { OAuthV2 oAuth = new OAuthV2(); init(oAuth); QHttpClient qHttpClient = null; String authorizationUrl = null; try { qHttpClient = new QHttpClient(2, 2, 5000, 5000, null, null); OAuthV2Client.setQHttpClient(qHttpClient); authorizationUrl = OAuthV2Client.generateAuthorizationURL(oAuth); } finally { if (qHttpClient != null) qHttpClient.shutdownConnection(); } return authorizationUrl; } /** * 腾讯微博登录回调uri. * @param request * @param code * @param openid * @param openkey * @param state * @param response * @return view url */ @RequestMapping(value = "/loginByTencentWeibo") public void loginByTencentWeibo( @RequestParam(value = "code") String code, @RequestParam(value = "openid") String openid, @RequestParam(value = "openkey") String openkey, @RequestParam(value = "state") String state) { OAuthV2 oAuth = new OAuthV2(); init(oAuth); oAuth.setOpenid(openid); oAuth.setOpenkey(openkey); oAuth.setAuthorizeCode(code); // 换取access token oAuth.setGrantType("authorization_code"); QHttpClient qHttpClient = null; try { qHttpClient = new QHttpClient(2, 2, 5000, 5000, null, null); OAuthV2Client.setQHttpClient(qHttpClient); // 使用Authorization code方式鉴权时,用授权码换取Access Token OAuthV2Client.accessToken(oAuth); } catch (Exception e1) { e1.printStackTrace(); } finally { //记住关掉连接 if (qHttpClient != null) qHttpClient.shutdownConnection(); } UserAPI userAPI = new UserAPI(oAuth.getOauthVersion()); String format = "json"; String infoByJson = ""; try { infoByJson = userAPI.info(oAuth, format); } catch (Exception e) { log.debug("腾讯微博返回的用户数据解析出错,json: {}", "".equals(infoByJson) ? "为空" : infoByJson); e.printStackTrace(); } finally { //记住关掉连接 if (userAPI!= null) userAPI.shutdownConnection(); } log.debug("infoByJson: {}", infoByJson); net.sf.json.JSONObject tempJson = (net.sf.json.JSONObject) net.sf.json.JSONObject.fromObject(infoByJson); net.sf.json.JSONObject weiboUser = tempJson.getJSONObject("data"); /* 好了,这样我们就获取到了登录用户在腾讯微博的相关信息weiboUser 下面我们来获取一些信息: */ String avatarLarge = weiboUser.getString("head") + "/120";//获得最大头像 String screenName = weiboUser.getString("nick");//获取昵称 String uid = weiboUser.getString("name");//获取微博id // do any more… … // … … }
下面是从腾讯获取到的json字段说明:
{ errcode : 返回错误码, msg : 错误信息, ret : 返回值,0-成功,非0-失败, data : { birth_day : 出生天, birth_month : 出生月, birth_year : 出生年, city_code : 城市id, comp : { begin_year : 开始年, company_name : 公司名称, department_name : 部门名称, end_year : 结束年, id : 公司id }, country_code : 国家id, edu : 教育信息 { departmentid : 院系id, id : 教育信息记录id, level : 学历级别, schoolid : 学校id, year : 入学年 }, fansnum : 听众数, favnum : 收藏数, head : 头像url, homecity_code : 家乡所在城市id, homecountry_code : 家乡所在国家id, homepage : 个人主页, homeprovince_code : 家乡所在省id, hometown_code : 家乡所在城镇id, idolnum : 收听的人数, industry_code : 行业id, introduction : 个人介绍, isent : 是否企业机构, ismyblack : 是否在当前用户的黑名单中,0-不是,1-是, ismyfans : 是否是当前用户的听众,0-不是,1-是, ismyidol : 是否是当前用户的偶像,0-不是,1-是, isrealname : 是否实名认证,1-已实名认证,2-未实名认证, isvip : 是否认证用户,0-不是,1-是, location : 所在地, mutual_fans_num : 互听好友数, name : 用户帐户名, nick : 用户昵称, openid : 用户唯一id,与name相对应, province_code : 地区id, regtime : 注册时间, send_private_flag : 是否允许所有人给当前用户发私信,0-仅有偶像,1-名人+听众,2-所有人, sex : 用户性别,1-男,2-女,0-未填写, tag : 标签 { id : 个人标签id, name : 标签名 }, tweetinfo : 最近的一条原创微博信息 { city_code : 城市码, country_code : 国家码, emotiontype : 心情类型, emotionurl : 心情图片url, from : 来源, fromurl : 来源url, geo : 地理位置信息, id : 微博唯一id, image : 图片url列表, latitude : 纬度, location : 发表者所在地, longitude : 经度, music : 音频信息 { author : 演唱者, url : 音频地址, title : 音频名字,歌名 }, origtext : 原始内容, province_code : 省份码, self : 是否自已发的的微博,0-不是,1-是, status : 微博状态,0-正常,1-系统删除,2-审核中,3-用户删除,4-根删除, text : 微博内容, timestamp : 服务器时间戳,不能用于翻页, type : 微博类型,1-原创发表,2-转载,3-私信,4-回复,5-空回,6-提及,7-评论, video : 视频信息 { picurl : 缩略图, player : 播放器地址, realurl : 视频原地址, shorturl : 视频的短url, title : 视频标题 } }, tweetnum : 发表的微博数, verifyinfo : 认证信息, exp : 经验值, level : 微博等级 }, seqid : 序列号 }
注意:在进行腾讯微博开发时,获取到的json数据可能会有乱码,导致解析json数据时出错,虽然腾讯表示使用的是UTF8,但是改为UTF8编码后出现的情况是大部分json数据中的中文数据都是正确的,但还是是有几个字符是乱码。
如果你也遇到这样的乱码问题你可以下载我打包的jar,里面包括了腾讯微博开发用到的必须类和一些乱码优化。