文档章节

QQ的第三方登陆,操作步骤

L
 Lance_IT
发布于 2017/08/15 18:36
字数 821
阅读 11
收藏 1
点赞 0
评论 0

1,到 https://connect.qq.com QQ互联管理中心的"应用管理"申请QQ的app_id和app_key,提前提交你需要回调的地址.

2,配置申请下来的的appid和appkey,及回调地址

3,获取配置文件中appid和appkey,机会掉地址,代码如下:

package com.yst.wallet.common;

import java.util.Properties;

import org.apache.log4j.Logger;
import org.jcoreplus.util.properties.PropertiesUtil;

/**
 * 接口配置类
 */
public class Config {

    private static final Logger logger = Logger.getLogger(Config.class.getName());
    // 配置文件名称
    public static final String config_filename = "system_config.properties";

    public static String qq_app_id;
    public static String qq_app_key;
    public static String qq_redirect_uri;
    /**
     * 更新配置文件
     */
    public static void refreshConfig() {
        Config.loadConfig();
    }

    /**
     * 加载配置文件
     */
    private static void loadConfig() {
        try {
            // 得到系统配置对象
            Properties properties = PropertiesUtil.loadProperties(Config.config_filename);
            
            qq_app_id = properties.getProperty("qq.app_id");
            qq_app_key = properties.getProperty("qq.app_key");
            qq_redirect_uri = properties.getProperty("qq.redirect_uri");
        } catch (Exception ex) {
            logger.fatal("加载配置文件异常!", ex);
        }
    }

    /**
     * 打印本类所有的属性值
     */
    public static void toStringPrint() {

        logger.info("            qq_app_id=" + qq_app_id);
        logger.info("            qq_app_key=" + qq_app_key);
        logger.info("           qq_redirect_uri=" + qq_redirect_uri);
    }
}

 

4,编写controller代码(回调地址),通过appid,appkey和回调地址获取access_token,open_id然后获取qq的用户信息

/**
     * 采用QQ三方登陆之后的回调地址
     * @param login_token
     * @return
     * @throws Exception
     */
    @RequestMapping(value="/isajax/OAuth2Login/QQLoginResponseProcess")
    public ModelAndView qqLoginCallBack(@RequestParam(required=false) String code,
            @RequestParam(required=false) String state){
        String path = CLASS_PATH + "/" + Thread.currentThread().getStackTrace()[1].getMethodName();
        LogUtils.putRequestLog("qq第三方登录的回调", path,this.getPageData());
        ModelAndView mv = this.getModelAndView();
        if(StringUtils.isNotBlank(code)){
            try {
                //1,获取access_token
                String token =  QQLoginUtil.getAccessToken(code);
                //2,获取openId
                String openId = QQLoginUtil.getOpenid(token);
                
                if(StringUtils.isNotBlank(openId)){
                    
                    //3.根据openid判断是不是绑定了,没有绑定,跳转到绑定页面
                    PageData pd = new PageData();
                    pd.put("login_type", "05");// 登录类型 05  国美在线
                    pd.put("login_name", openId);// 登录名
                
                    pd = new Epay_api_security().user_login(pd);
                    if (Const.RETURN_SUCCESS.equals(pd.get("code"))) {// 请求成功,登录shiro,跳转到index页面
                        UserInfo user = (UserInfo) pd.get("data");
                        if (user != null) {
                            user.setLast_login_time(DateFormatUtil.to_normal(user.getLast_login_time()));
                            // 把用户信息放session中
                            Jurisdiction.getSession().setAttribute(Const.SESSION_USER, user);
                            Jurisdiction.getSession().setAttribute(Const.LOGIN_TOKEN, user.getLogin_token());
                            //shiro加入身份验证
                            Subject subject = SecurityUtils.getSubject(); 
                            CaptchaUsernamePasswordToken logintoken = new CaptchaUsernamePasswordToken(token, token,"","","","",token,openId,""); 
                             try { 
                                    subject.login(logintoken); 
                                } catch (Exception e){
                                    e.printStackTrace();
                                    mv.setViewName("redirect:/login_toLogin");
                                }
                            
                            mv.setViewName("redirect:/index");//跳转到首页
                        }else{
                            mv.setViewName("error");
                            mv.addObject("msg","用户信息为空,请稍后重试");
                        }
                        
                    }else{
                        String userInfo = QQLoginUtil.getQQUser(token, openId);
                        mv.setViewName("redirect:/gomebangding");//跳转到首页
                        Jurisdiction.getSession().setAttribute(Const.GOME_OPENID, openId);
                        Jurisdiction.getSession().setAttribute(Const.GOME_USER, userInfo);
                        
                    }
                }else{//{"error_code":3019,"error_description":"code值错误"}
                    mv.setViewName("error");
                    mv.addObject("msg","腾讯QQ授权登录返回信息:"+openId);
                }
                
            } catch (ClientProtocolException e) {
                e.printStackTrace();
                mv.setViewName("error");
                mv.addObject("msg",e.getMessage());
            } catch (IOException e) {
                e.printStackTrace();
                mv.setViewName("error");
                mv.addObject("msg",e.getMessage());
            }
            
        }else{
            mv.setViewName("error");
            mv.addObject("msg","code值为空");
        }
        
        return mv;
    }

5,html页面调取qq的链接

<li class="qq_sign"><span title="QQ账号" href=""
                                onclick="javascript:document.location='https://graph.qq.com/oauth/show?which=ConfirmPage&display=pc&response_type=code&client_id=${qq_app_id}&redirect_uri=${qq_redirect_uri}&state=test'"></span></li>

6,QQLoginUtil.java

package com.yst.wallet.common.util;

import java.io.IOException;
import java.util.Arrays;

import org.apache.http.client.ClientProtocolException;

import com.yst.wallet.common.Config;

public class QQLoginUtil {

    //获得AccessToken的url
    private static String getAccessTokenUrl = "https://graph.qq.com/oauth2.0/token";
    //获得openid的url
    private static String getOpenIdUrl = "https://graph.qq.com/oauth2.0/me";
                                          
    //得到QQ用户信息的url
    private static String getQQUserUrl = "https://graph.qq.com/user/get_user_info";
    /**
     * 得到access_token
     * @return
     * @throws ClientProtocolException
     * @throws IOException
     */
    public static String getAccessToken(String code) throws ClientProtocolException, IOException{
        String qq_url = getAccessTokenUrl+"?grant_type=authorization_code&client_id="+Config.qq_app_id+
                "&client_secret="+Config.qq_app_key+
                "&code="+code+
                "&redirect_uri="+Config.qq_redirect_uri;
        
        String token =  AuthUtil.doGetJson(qq_url);
        if(token.indexOf("&") != -1){
            String[] tokenStr = token.split("&");
            return tokenStr[0];
        }
        return token;
    }
    /**
     * 得到QQ openid
     * @return
     * @throws ClientProtocolException
     * @throws IOException
     */
    public static String getOpenid(String access_token) throws ClientProtocolException, IOException{
        String qq_url = getOpenIdUrl+"?access_token="+access_token;
        String openid =  AuthUtil.doGetJson(qq_url);
        if(openid.indexOf("&") != -1){
            String[] str = openid.split("&");
            return str[1];
        }
        return AuthUtil.doGetJson(qq_url);
    }
    /**
     * 得到QQ用户信息
     * @param code
     * @return
     * @throws IOException 
     * @throws ClientProtocolException 
     */
    public static String getQQUser(String token,String openId) throws ClientProtocolException, IOException {
        /*String paramurl = "access_token="+token+"&oauth_consumer_key=YOUR_APP_ID&openId="+openId
                +"&timestamp="+String.valueOf(System.currentTimeMillis())+"&client_id="+
                Config.qq_app_id+"&version=1.0&sign_method=MD5";*/
        String paramurl = getOpenIdUrl+"?access_token="+token+"&oauth_consumer_key="+Config.qq_app_id+"&openid="+openId;
        String[] params = paramurl.split("&");
        //对参数按照顺序排序
        Arrays.sort(params);
        StringBuffer sb = new StringBuffer();
        for (String param : params) {
            param = param.replace("=", "").replace("null", "");
            sb.append(param);
        }
        String sign = MD5.MD5(sb.toString()+Config.qq_app_key).toLowerCase();        
        //Collections.sort(list);
        
        return AuthUtil.doGetJson(getQQUserUrl+"?"+paramurl+"&sign="+sign);
    }
    
}
 



                            

 

© 著作权归作者所有

共有 人打赏支持
L
粉丝 0
博文 3
码字总数 821
作品 0
昌平
高级程序员
UI自动化测试框架之Selenium关键字驱动

一、原理及特点 1. 关键字驱动测试是数据驱动测试的一种改进类型 2. 主要关键字包括三类:被操作对象(Item)、操作(Operation)和值(value),用面向对象形式可将其表现为Item.Operation(...

红焖鲤鱼 ⋅ 2015/11/18 ⋅ 14

第三方版本严重影响正版微信,马化腾:微信双开就封号!

  最近腾讯接连的“发飙”,广大网友们是不是都深感其受。单是微信支付、QQ钱包开始收费,也许就让各位亲心理咯噔一下了,接着又是大量的QQ账号被封杀,严厉打击多开软件等第三方登陆软件。...

火星科技美少女 ⋅ 2017/12/26 ⋅ 0

第三方登录

最近项目中需要实现微信登录,记录在这里,以备以后需要. http://wiki.mob.com/简洁版第三方登陆/ 一.第三方登录的定义 第三方登录,就是利用用户在第三方平台上已有的账号来快速完成自己应用...

我爱觉觉 ⋅ 2015/11/25 ⋅ 0

joomlaQQ登录微博登录

joomlaQQ登录 微信登录等第三方登录 在joomla网站上集成QQ,微信,支付宝,人人,明道,短信,微博登录现在已经成为可能。只需要安装ZMAX程序人开发的ZMAX第三方登录组件,一键就可以让你的网...

张敏樱木花道 ⋅ 2015/04/09 ⋅ 0

QQ互联PHP_SDK 在SAE上 session_start() 的问题

做qq互联 第三方登陆的功能, 服务是架设在SAE上。 问题1. 登陆回调后, 报错是Cannot send session cache limiter - headers already sent。 我百度找,说是文件编码的问题。 需要是utf-8 n...

zhouyuan24 ⋅ 2012/10/19 ⋅ 4

iOS 第三方登陆避免被APP STORE拒

iOS调用第三方登陆,如果用户没有安装第三方软件的时候,应该采取将第三方登陆按钮隐藏掉得办法实现。 微信:if ([WXApi isWXAppInstalled] && [WXApi isWXAppSupportApi]) QQ:[TencentOAu...

SoulJa ⋅ 2015/08/12 ⋅ 0

实现QQ登录第三方APP(Android)

首先你需要到腾讯开放平台注册开发者账号,并创建一个APP,填写包名,获取APP ID: http://open.qq.com/ 完成上面的工作后,可以继续了。 下载Android SDK,SDK提供了使用QQ众多功能的接口。...

crazymus ⋅ 2015/11/02 ⋅ 0

年薪20万Python工程师进阶(1):Django-第三方登录框架

1.安装 pip install social-auth-app-django 2.配置 INSTALLED_APPS=( ... 'social_django', ... ) 3.数据生成,直接migrate,因为源码中的 makemigrtasion 生成的数据库迁移文件已经存在了。...

程序员八阿哥 ⋅ 05/11 ⋅ 0

如何在Android手机中开发QQ账户登陆功能的应用

背景 OAUTH开发授权协议,为用户资源的授权提供了一个安全开放而又简易的标准。可以使用第三方的账户登陆另一个方的应用或服务,而不暴露给另一个应用该账户的信息。现在已经得到广泛的应用,...

长平狐 ⋅ 2012/09/06 ⋅ 0

第三方平台账号登陆流程总结

第三方登陆流程图,包括微信、QQ、微博,基本登陆流程一致,项目中总结出来,供大家项目中参考。  有人会问为什么第三方登入成功后还要绑定账号,其实也可以不绑定。   如果你的站点本身就...

Corwien ⋅ 2016/05/18 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

从零开始搭建Risc-v Rocket环境---(1)

为了搭建Rocke环境,我买了一个2T的移动硬盘,安装的ubuntu-16.04 LTS版。没有java8,gcc是5.4.0 joe@joe-Inspiron-7460:~$ java -version程序 'java' 已包含在下列软件包中: * default-...

whoisliang ⋅ 21分钟前 ⋅ 0

大数据学习路线(自己制定的,从零开始学习大数据)

大数据已经火了很久了,一直想了解它学习它结果没时间,过年后终于有时间了,了解了一些资料,结合我自己的情况,初步整理了一个学习路线,有问题的希望大神指点。 学习路线 Linux(shell,高并...

董黎明 ⋅ 27分钟前 ⋅ 0

systemd编写服务

一、开机启动 对于那些支持 Systemd 的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件。 如果你想让该软件开机启动,就执行下面的命令(以httpd.service为例)。 ...

勇敢的飞石 ⋅ 29分钟前 ⋅ 0

mysql 基本sql

CREATE TABLE `BBB_build_info` ( `community_id` varchar(50) NOT NULL COMMENT '小区ID', `layer` int(11) NOT NULL COMMENT '地址层数', `id` int(11) NOT NULL COMMENT '地址id', `full_......

zaolonglei ⋅ 38分钟前 ⋅ 0

安装chrome的vue插件

参看文档:https://www.cnblogs.com/yulingjia/p/7904138.html

xiaoge2016 ⋅ 41分钟前 ⋅ 0

用SQL命令查看Mysql数据库大小

要想知道每个数据库的大小的话,步骤如下: 1、进入information_schema 数据库(存放了其他的数据库的信息) use information_schema; 2、查询所有数据的大小: select concat(round(sum(da...

源哥L ⋅ 今天 ⋅ 0

两个小实验简单介绍@Scope("prototype")

实验一 首先有如下代码(其中@RestController的作用相当于@Controller+@Responsebody,可忽略) @RestController//@Scope("prototype")public class TestController { @RequestMap...

kalnkaya ⋅ 今天 ⋅ 0

php-fpm的pool&php-fpm慢执行日志&open_basedir&php-fpm进程管理

12.21 php-fpm的pool pool是PHP-fpm的资源池,如果多个站点共用一个pool,则可能造成资源池中的资源耗尽,最终访问网站时出现502。 为了解决上述问题,我们可以配置多个pool,不同的站点使用...

影夜Linux ⋅ 今天 ⋅ 0

微服务 WildFly Swarm 管理

Expose Application Metrics and Information 要公开关于我们的微服务的有用信息,我们需要做的就是将监视器模块添加到我们的pom.xml中: 这将使在管理和监视功能得到实现。从监控角度来看,...

woshixin ⋅ 今天 ⋅ 0

java连接 mongo伪集群部署遇到的坑

部署mongo伪集群 #创建mongo数据存放文件地址mkdir -p /usr/local/config1/datamkdir -p /usr/local/config2/data mkdir -p /usr/local/config3/data mkdir -p /usr/local/config1/l......

努力爬坑人 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部