1.这里需要两个jar包:connect-1.3.0.jar、json-lib-2.4-jdk15。你可以下载这两个jar包添加到你的项目依赖,如果你的项目是maven项目可以把下载后的connect-1.3.0.jar添加到你的本地仓库,然后在pom文件中添加这两个jar包的依赖,如下:
<dependency>
<groupId>com.qq</groupId>
<artifactId>connect</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
2.新建connect.properties文件放到src下面,把你申请的腾讯开放平台APP_ID、APP_KEY以及你的应用回调地址(可随意定制)编辑到这个文件中,如下:
#APP_ID
APP_ID = 1xxx5xxx6
#APP_KEY
APP_KEY = d707813xxxx2495b4e880bxxxx465
#OAUTH_CALLBACK
OAUTH_CALLBACK =http\://www.xxxx.com/login/callback_qq.xhtml
3.接下来开发控制层代码,这里你可以用filter、拦截器或action的方式实现,本人采用action方式实现,代码如下:
private String oauth_token;
private String openid;
private String oauth_signature;
private String oauth_vericode;
private String timestamp;
/**
* 使用QQ快捷登录
*
* @return
*/
public String login() {
RequestToken requesttoken = new RequestToken();
String request_token = null;
try {
request_token = requesttoken.getRequestToken();
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
HashMap<String, String> tokens = ParseString
.parseTokenString(request_token);
String oauth_token_secret = (String) tokens.get("oauth_token_secret");
session.setAttribute("oauth_token_secret", oauth_token_secret);
RedirectToken redirecttoken = new RedirectToken();
try {
WebUtils.sendHTML(response, redirecttoken.getRedirectURL(tokens));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return null;
}
/**
* QQ快捷登录回调函数
*
* @return
* @throws IOException
* @throws SQLException
*/
public String callback() throws IOException, SQLException {
try {
if (StringUtils.isNotBlank(openid)) {
session.setAttribute("openid", openid);
} else {
openid = ((String) session.getAttribute("openid"));
}
if (StringUtils.isNotBlank(timestamp)) {
session.setAttribute("timestamp", timestamp);
} else {
timestamp = ((String) session.getAttribute("timestamp"));
}
if (StringUtils.isNotBlank(oauth_signature)) {
session.setAttribute("oauth_signature", oauth_signature);
} else {
oauth_signature = ((String) session
.getAttribute("oauth_signature"));
}
if (!Verify.verifyOpenID(openid, timestamp, oauth_signature)) {
WebUtils.sendHTML(response, "openid verify false!");
}
} catch (InvalidKeyException e1) {
e1.printStackTrace();
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
AccessToken token = new AccessToken();
String oauth_token_secret = (String) session.getAttribute("oauth_token_secret");
String access_token = null;
try {
access_token = token.getAccessToken(oauth_token,
oauth_token_secret, oauth_vericode);
} catch (InvalidKeyException e1) {
e1.printStackTrace();
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
HashMap<String, String> tokens = ParseString.parseTokenString(access_token);
if (StringUtils.isNotBlank(tokens.get("error_code"))) {
WebUtils.sendHTML(response,(String) tokens.get("error_code"));
}
try {
if (!Verify.verifyOpenID((String) tokens.get("openid"),
(String) tokens.get("timestamp"),
(String) tokens.get("oauth_signature")))
WebUtils.sendHTML(response,"openid verify false2!");
} catch (InvalidKeyException e1) {
e1.printStackTrace();
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
}
oauth_token = ((String) tokens.get("oauth_token"));
oauth_token_secret = (String) tokens.get("oauth_token_secret");
openid = ((String) tokens.get("openid"));
InfoToken infotoken = new InfoToken();
String info_json = null;
try {
info_json = infotoken.getInfo(oauth_token, oauth_token_secret,openid, "JSON");
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
JSONObject json = JSONObject.fromObject(info_json);
session.setAttribute("openid", openid);
session.setAttribute("nickname",json.getString("nickname"));
session.setAttribute("gender",json.getString("gender"));
session.setAttribute("oauth_token", oauth_token);
session.setAttribute("oauth_token_secret",oauth_token_secret);
Integer count = userExtendService.getRowCountQQReg() + 1;
session.setAttribute("account", "qq_" + json.getString("nickname") + "_" + count);
userExtend = userExtendService.findByQQOpenID(openid);
if (userExtend == null) {
response.sendRedirect("/view/login/regbind.html");
return null;
} else {
//更新最后登录时间
userExtend.setLastLoginDate(new Date());
userExtendService.updateById(userExtend);
user = userService.findById(userExtend.getUserId());
session.setAttribute(CommonConstant.SESSION_KEY_USER_INFO, user);
LOGGER.info("用户【" + user.getUserAccount() + "】 通过QQ快捷登陆登录成功!");
response.sendRedirect("/view/login/close.html");
}
return null;
}
第一个action为点击快捷登录时访问的action,点击后弹出腾讯的快捷登录框,选择相应QQ帐号后点击登录,系统会自动返回你所配置的回调函数,也就是第二个action(即回调函数),你需要做的也就是在回调函数中对自己的业务进行处理,如果是第一次用快捷方式登录,你可以选择新注册用户,也可以绑定已有用户,再次登录的话即可直接登录。
没什么难度,就是刚开始的时候有点绕通过这个小例子相信在你的项目中添加快捷登录应该不是问题,如有疑问可以给我留言o(∩_∩)o ...
分享到:
相关推荐
通过简单的几步操作可以定义设计完成权限的开发设计(功能、元素、数据;可以达到页面元素级权限,对数据权限精确到横向、纵向、列、单元格控件);开发平台支持用户二次开发各类业务类库,同时支持于其他的系统的...
对于初学者,使用QQ的抓图软件只需简单几步即可完成截图操作: 1. 下载压缩包,解压缩后找到“QQ的抓图软件”文件,双击运行。 2. 根据需求选择合适的截图模式,例如点击全屏截图按钮或使用预设的快捷键。 3. 在...
在实现这个功能时,开发者通常需要做以下几步: 1. **注册协议**:在程序中包含代码或者使用reg文件来注册一个新的URL协议,例如“myapp://”。这会在注册表中创建一个新的键值,指定当遇到"myapp://"开头的链接时...
登录界面是用户与应用程序或网站交互的第一步,它在用户体验中扮演着至关重要的角色。一个设计精良的登录界面不仅能提升应用的整体形象,还能增强用户的使用感受,促进他们更愿意频繁地使用产品。本资源提供的“登录...
在实际项目中,HHPopController的使用步骤通常包括以下几步: 1. 引入HHPopController库到项目中,可以使用CocoaPods或手动导入。 2. 创建一个HHPopController实例,并配置弹框内容、样式和行为。 3. 调用显示方法,...
在Windows 10操作系统中,将网易邮箱大师设置为默认邮件客户端是一个...只需要简单的几步操作,就能享受到一站式邮件管理的服务。同时,对于不熟悉此操作的用户,可以通过阅读软件的帮助文档或联系客服获取更多帮助。
在Android应用开发中,创建一个类似QQ5.0的侧滑左边菜单效果是常见的需求,它为用户提供了方便快捷的导航功能。这个效果通常被称为DrawerLayout,源自Android SDK中的一个组件,可以实现从屏幕边缘滑出隐藏的菜单。...
登录界面是用户与应用交互的第一步,其设计需考虑以下几点: 1. **UI设计**:登录界面应简洁明了,包括用户名/邮箱输入框、密码输入框、登录按钮、注册/忘记密码链接等元素。使用Material Design指导原则可以提高...
扫描过程可能会根据网络规模的不同而有所差异,通常几秒钟到几分钟不等。 3. **查看设备信息**:扫描完成后,PST软件会列出网络中所有西门子网络设备的基本信息,例如设备名称、类型等。此时,可以查看到网络中有两...
本教程将针对初学者,详细介绍Unity3D的基础知识,帮助你快速入门,掌握这一强大的游戏开发工具。 一、Unity3D简介 Unity3D是由Unity Technologies开发的一款游戏引擎,支持2D和3D图形渲染,可以用于开发桌面、移动...
用户只需几步操作,就能将整个网站环境安装完成,极大地降低了建站的技术门槛。对于小型企业来说,这不仅节省了时间,也节约了雇佣专业开发团队的成本。 “开发简便”是该系统的另一大亮点。通王2.0可能包含一套...
实现扫码支付的过程大致分为以下几步: 1. **生成支付订单**:在服务器端,PHP通过调用支付宝的API生成预支付订单,包括商品信息、金额、回调URL等,返回一个预支付交易号。 2. **生成二维码**:预支付订单生成后...
1. **易操作性**:守望简单Web服务器的用户界面简洁明了,无需复杂的设置步骤,只需几步即可启动服务器,这对于初学者或者不熟悉服务器管理的用户来说非常友好。 2. **快速部署**:软件提供一键启动服务,能够迅速...
在用户的操作权限方面,针对交易流程有独立的权限设置,同时整站还提供用户工具箱,可方便的进行拓展开发。不仅能够让用户体验更好,更为威客站长带来了更多的盈利手段。 六、模板标签数据调用更方便 优化了SEO,...
安装完成后,您可以选择创建桌面快捷方式以便快速访问Visual C++ 6.0。此外,还需要注意的是,Visual C++ 6.0可能需要额外的库文件支持,这些通常会在安装过程中自动安装。 #### 四、安装后注意事项 - **更新补丁*...