php 整合 微博登录
2015-06-12 19:34
671 查看
现在很多网站都整合了便捷的第三方登录,如QQ登录、新浪微博、搜狐、网易等,为用户提供不少方便和节约时间。我们可以选择使用JS或SDK实现第三方提供用户授权API,本文主要讲解 JAVA SDK 新浪微博登录授权以及获取用户资料。
注:本例子使用的是 SpringMVC,所以若想拷贝代码直接使用则需自己提前搭建好环境。
1、首先申请新浪微博网站接入:http://open.weibo.com/wiki/
2、成为开发者得到App Key和App Secret
3、下载weibo4j-oauth2:http://code.google.com/p/weibo4j/downloads/list
4、编写获取用户信息代码,搞定!
下载解压后,将src目录下weibo4j文件夹以及config.properties拷贝至自己 JAVA WEB 项目的src目录下。
编辑config.properties配置文件,改成成自己的资料。第一个填写你申请的App Key值,第二个填写App Secret值。
第三个redirect_URI,是你的重定向后的网址。应该对应一个控制器(Spring Controller)或 Servlet。在这里我们需要两个网址,第一个网址即用户在页面上点击的网址,能跳转到新浪微博账号登录界面,当用户点击账号登陆界面的登录按钮时,新浪微博会去校验资料正确性,一旦资料正确将会以 get 方式请求并且携带参数code重定向到你填写的redirect_URI,此时就能获取用户的资料了。
以小明博客为例,首先用户点击 http://www.bugxm.com/user/login-sian-weibo.html,我们接收请求后主要工作是重定向到新浪微博登录页面。代码片段如下:
代码片段中的session是为了获取用户登录前所在页面URL,方便登录完后重定向到登录之前的页面。其中url是新浪微博登录界面网址,我们只需要重定向过去就行了。
当用户在新浪微博登录成功后,会重定向到我们刚才填写的redirect_URI中,如我填写的 http://www.bugxm.com/user/login-sina-weibo.do,对应逻辑代码片段如下:
重定向过来会携带code参数我们把值取到用来获取用户的资料。本段代码中的除code、sinaWeiboLoginAction()外都是次要,对本文主题而言可有可无。我们来看看sinaWeiboLoginAction()代码片段:
其中String uid = accessToken.getUserUid();的getUserUid()方法本身是没有的,我们需要修改新浪微博的源代码,不然取uid非常麻烦。
编辑/src/weibo4j.http/AccessToken.java,在:
下面添加:
到此就搞定了。用户的其它资料已经很详细的注释在/src/weibo4j/model/User.java中了。
注:本例子使用的是 SpringMVC,所以若想拷贝代码直接使用则需自己提前搭建好环境。
1、首先申请新浪微博网站接入:http://open.weibo.com/wiki/
2、成为开发者得到App Key和App Secret
3、下载weibo4j-oauth2:http://code.google.com/p/weibo4j/downloads/list
4、编写获取用户信息代码,搞定!
下载解压后,将src目录下weibo4j文件夹以及config.properties拷贝至自己 JAVA WEB 项目的src目录下。
编辑config.properties配置文件,改成成自己的资料。第一个填写你申请的App Key值,第二个填写App Secret值。
1 2 3 | client_ID = client_SERCRET = redirect_URI = |
以小明博客为例,首先用户点击 http://www.bugxm.com/user/login-sian-weibo.html,我们接收请求后主要工作是重定向到新浪微博登录页面。代码片段如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /** * * 新浪微博登录界面 * * @param session * @return * @throws WeiboException */ @RequestMapping(value = "/user/login-sian-weibo.html", method = RequestMethod.GET) public String loginSinaWeibo(HttpServletRequest request, HttpSession session) throws WeiboException { session.setAttribute("login_current_url", request.getHeader("Referer")); weibo4j.Oauth oauth = new weibo4j.Oauth(); String url = oauth.authorize("code", ""); return "redirect:" + url; } |
当用户在新浪微博登录成功后,会重定向到我们刚才填写的redirect_URI中,如我填写的 http://www.bugxm.com/user/login-sina-weibo.do,对应逻辑代码片段如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /** * * 新浪微博登录操作 * * @param session * @return * @throws WeiboException */ @RequestMapping(value = "/user/login-sina-weibo.do", method = RequestMethod.GET) public String loginSinaWeiboAction(HttpSession session, @RequestParam String code) throws WeiboException { String url = (String) session.getAttribute("login_current_url"); session.removeAttribute("login_current_url"); User user = userService.sinaWeiboLoginAction(code, (User) session.getAttribute("user")); if (null != user) { session.setAttribute("user", user); } return "redirect:" + url; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | /** * 新浪微博操作 * * @param code * @param currentLoginUser * 当前登录用户,可为 null * @return * @throws WeiboException */ public User sinaWeiboLoginAction(String code, User currentLoginUser) throws WeiboException { weibo4j.Oauth oauth = new weibo4j.Oauth(); weibo4j.http.AccessToken accessToken = oauth.getAccessTokenByCode(code); String uid = accessToken.getUserUid(); weibo4j.Users users = new weibo4j.Users(); users.client.setToken(accessToken.getAccessToken()); weibo4j.model.User user = users.showUserById(uid); String userDomain = user.getUserDomain(); // 用户登录名 String username = user.getScreenName(); // 用户呢称 String avatar = user.getAvatarLarge(); // 用户头像 String gender = null; // 性别 if ("m".equals(user.getGender())) { gender = "男"; } else if ("f".equals(user.getGender())) { gender = "女"; } else { gender = "未知"; } // …… 业务逻辑操作,代码略 return currentLoginUser; } |
编辑/src/weibo4j.http/AccessToken.java,在:
1 2 3 | public String getRefreshToken() { return refreshToken; } |
1 2 3 | public String getUserUid() { return uid; } |
相关文章推荐
- 如何在header头前输出变量,如何在sesion_start前echo,如何存取phpinfo()的内容?
- Windows下搭建PHP开发环境
- 浅谈正则表达式-PHP为例
- laravel 4安装出现失败处理
- [PHP] - Laravel - 用户登陆中间件
- 基于ThinkPHP的登录验证码功能
- 基于ThinkPHP的登录后账户中心
- vsftp虚拟用户配置
- 解决zabbix安装出现php databases support off,报错
- PHP中你应该知道的require()文件包含的正确用法
- [Link]php socket数据发送
- PHP查找与搜索数组元素方法总结
- vsftpd安装问题汇总(持续更新。。)
- 恭贺自己itpub和csdn双双获得专家博客称号
- [转]PHP: 深入pack/unpack
- phpstorm 【这里图片演示的是phpstorm】 webstorm 实现 项目上传到github
- 配置IIS 中的FTP
- speedphp登录成功跳转到登录前的页面实现步骤
- php使用array_search函数实现数组查找的方法
- php线性表的入栈与出栈实例分析