用Java实现QQ登录[通俗易懂]

用Java实现QQ登录[通俗易懂]Java实现QQ登录写了一个个人网站,增加一个登录的地方,自己写登录太麻烦,而且用户一般也不愿意去登录,接入QQ互联,实现QQ一键登录。所有前提是你得有一个IP地址和域名。==ps:==用处不大,主要是写着玩1进入qq互联官网进入点击头像个创建提交申请2选择个人接入,按照步骤填写注册资料创建成功通过后会哦显示接入的个人信息。3审核成功后点击下面的开始创建,按步骤完成创建过程。4创建成功后可以查看APPID和APPkey,很重要在应用管理界面可以查看如上信息,点击查看就可以

大家好,又见面了,我是你们的朋友全栈君。

Java实现QQ登录

写了一个个人网站,增加一个登录的地方,自己写登录太麻烦,而且用户一般也不愿意去登录,接入QQ互联,实现QQ一键登录。所有前提是你得有一个IP地址和域名。
==ps:==用处不大,主要是写着玩
QQ登录

1 进入qq互联官网进入点击头像个创建提交申请
点击头像进入

2 选择个人接入,按照步骤填写注册资料
填写接入信息创建成功通过后会哦显示接入的个人信息。

3 审核成功后点击下面的开始创建,按步骤完成创建过程。
点击开始创建

4 创建成功后可以查看APP IDAPP key,很重要

在这里插入图片描述在应用管理界面可以查看如上信息,点击查看就可以看到如下关键信息。
重要信息
往下划在平台信息里可以看到网站地址和网站回调域,回调域一般是`@requestMapping()“中写的请求地址

5 登录页面

<a href"/login">qq登录</a>

6 配置qqconnectconfig.properties,与application.properties同一级

app_ID = 你的App ID
app_KEY = 你的App key
redirect_URI = 你的回调域
scope = get_user_info,add_topic,add_one_blog,add_album,upload_pic,list_album,add_share,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idollist,add_idol,del_ido,get_tenpay_addr
baseURL = https://graph.qq.com/
getUserInfoURL = https://graph.qq.com/user/get_user_info
accessTokenURL = https://graph.qq.com/oauth2.0/token
authorizeURL = https://graph.qq.com/oauth2.0/authorize
getOpenIDURL = https://graph.qq.com/oauth2.0/me
addTopicURL = https://graph.qq.com/shuoshuo/add_topic
addBlogURL = https://graph.qq.com/blog/add_one_blog
addAlbumURL = https://graph.qq.com/photo/add_album
uploadPicURL = https://graph.qq.com/photo/upload_pic
listAlbumURL = https://graph.qq.com/photo/list_album
addShareURL = https://graph.qq.com/share/add_share
checkPageFansURL = https://graph.qq.com/user/check_page_fans
addTURL = https://graph.qq.com/t/add_t
addPicTURL = https://graph.qq.com/t/add_pic_t
delTURL = https://graph.qq.com/t/del_t
getWeiboUserInfoURL = https://graph.qq.com/user/get_info
getWeiboOtherUserInfoURL = https://graph.qq.com/user/get_other_info
getFansListURL = https://graph.qq.com/relation/get_fanslist
getIdolsListURL = https://graph.qq.com/relation/get_idollist
addIdolURL = https://graph.qq.com/relation/add_idol
delIdolURL = https://graph.qq.com/relation/del_idol
getTenpayAddrURL = https://graph.qq.com/cft_info/get_tenpay_addr
getRepostListURL = https://graph.qq.com/t/get_repost_list
version = 2.0.0.0

7导入依赖

<!--热部署工具-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>
        </dependency>
        <!--QQ登录-->
        <!-- https://mvnrepository.com/artifact/net.gplatform/Sdk4J -->
        <dependency>
            <groupId>net.gplatform</groupId>
            <artifactId>Sdk4J</artifactId>
            <version>2.0</version>
        </dependency>

8 编写controller

	 //获取用户当前页面的url,方便返回登录之前的页面,
	private static String returnUrl = ""	
	/** * @Description: qq登录的入口 */
    @GetMapping("/login")
    public ResponseEntity<Void> loginByQQ(HttpServletRequest request, HttpServletResponse response){ 
   
       
        returnUrl = request.getParameter("returnUrl");
        response.setContentType("text/html,charset=utf-8");
        try { 
   
            response.sendRedirect(new Oauth().getAuthorizeURL(request));
            return ResponseEntity.ok().build();
        } catch (IOException | QQConnectException e) { 
   
            LOGGER.warn("请求QQ登录失败, {}",e.getMessage());
        }
        return ResponseEntity.badRequest().build();
    }
    /** * * 此处的qqlogin必须与你的网站回调域一致 * @Description: 登录获取数据 */
    @RequestMapping("/qqlogin")
    public String login(HttpServletRequest request,HttpServletResponse response){ 
   
        User user = new User();
        try { 
   
            AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
            //用来或用户信息,get_user_info参数
          	String accessToken   = null;
            String openID = null;
            long tokenExpireIn = 0L;
            if (accessTokenObj.getAccessToken().equals("")) { 
   
                LOGGER.error("没有获取到响应参数");
            }else { 
   
                accessToken = accessTokenObj.getAccessToken();
                tokenExpireIn = accessTokenObj.getExpireIn();
                System.out.println(String.valueOf(tokenExpireIn));
                // 利用获取到的accessToken 去获取当前用的openid -------- start
                OpenID openIDObj =  new OpenID(accessToken);
                openID = openIDObj.getUserOpenID();

                UserInfo userInfo = new UserInfo(accessToken, openID);
                UserInfoBean userInfoBean = userInfo.getUserInfo();
                /* * 此处获取用户信息后可以在service层重新保存用户部分信息用作登录展示 * 比如写一个UserInfo类用于信息展示,将UserInfo对应的用户信息通过加密的方式保存到 * Cookie中,每次请求都会携带Cookie,然后解密重新设置过期时间再进行加密保存。 * 用户退出就可以将Cookie信息删除,这样就不需要依赖QQ登录本身保存的信息了。 */
                if (userInfoBean.getRet()==0){ 
   
                    //获取qq空间头像,暂不知怎么获取qq头像
                    user.setAvatar(userInfoBean.getAvatar().getAvatarURL50());
                    //用户openId,唯一标识
                    user.setOpenId(openID);
                    //用户qq昵称
                    user.setNickName(userInfoBean.getNickname());
                    //用户性别
                    user.setGender(userInfoBean.getGender());
                }else { 
   
                    LOGGER.warn("很抱歉,我们没能正确获取到您的信息,原因是:{} ", userInfoBean.getMsg());
                }
            }
        } catch (QQConnectException e) { 
   
            LOGGER.error("qq连接发生异常 {}",e.getMessage());
        }
        return "redirect:"+returnUrl;
    }

获取用户信息API

get_user_info

通过上面的方法可以获取的用户信息较少,并且获取的头像是QQ空间的头像而不是QQ头像,如果没有QQ空间的话,那么就没有用户头像了。可以通过get_user_info获取用户更多的信息,比如QQ头像!

新建一个用户信息实体类

参数说明根据返回的json创建用户对象
返回json实例

package com.cx.pojo;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import jdk.nashorn.internal.ir.annotations.Ignore;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Transient;

/** *@JsonIgnoreProperties(ignoreUnknown = true) 忽略部分不能匹配的字段 *@JsonProperty(value = "***"),因为获取的用户信息json不符合java命名规范,所有需要添加字段映射 * @author 苍晓 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class ResultInfo { 
   
    private int ret;
    private String msg;
    @JsonProperty(value = "is_lost")
    private boolean isLost;
    private String nickname;
    private String gender;
    @JsonProperty(value = "gender_type")
    private String genderType;
    private String province;
    private String city;
    private String year;
    private String constellation;
    private String figureurl;
    @JsonProperty(value = "figureurl_1")
    private String figureUrl1;
    @JsonProperty(value = "figureurl_2")
    private String figureUrl12;
    @JsonProperty(value = "figureurl_qq_1")
    private String figureUrlQq1;
    @JsonProperty(value = "figureurl_qq_2")
    private String figureUrlQq2;
    @JsonProperty(value = "figureurl_qq")
    private String figureUrlQq;
    @JsonProperty(value = "figureurl_type")
    private String figureUrlType;
    @JsonProperty(value = "is_yellow_vip")
    private String isYellowVip;
    private int vip;
    @JsonProperty(value = "yellow_vip_level")
    private int yellowVipLevel;
    private int level;
    @JsonProperty(value = "is_yellow_year_vip")
    private String isYellowYearVip;

}

RestTemplate配置

package com.blog.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;

import java.util.Arrays;

/** * @author 苍晓 */
@Configuration
public class RestTemplateConfig { 
   
    
    @Bean
    public RestTemplate getRestTemplate(){ 
   

        RestTemplate restTemplate = new RestTemplate();
        MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
      /* *经过尝试,此处需要加一个MediaType.TEXT_HTML的返回类型,否则一直报错,解析不了返回信息。 */
        mappingJackson2HttpMessageConverter.setSupportedMediaTypes(Arrays.asList(MediaType.APPLICATION_JSON,
                MediaType.TEXT_HTML));
        restTemplate.getMessageConverters().add(mappingJackson2HttpMessageConverter);
        return restTemplate;
    }
}

测试获取用户信息

	//注入rest请求模板
	@Autowired
    private RestTemplate restTemplate;

    private final String preUrl="https://graph.qq.com/user/get_user_info?" +
            "access_token=获取的登录用户AccessToken" +
            "&oauth_consumer_key=你的AppID" +
            "&openid=获取的登录用户的openID";
	@Test
    void qqInfo() { 
   
        String object = this.restTemplate.getForObject(preUrl, String.class);
        ObjectMapper objectMapper = new ObjectMapper();
        try { 
   
            System.out.println("============================");
            ResultInfo resultInfo = objectMapper.readValue(object,ResultInfo.class);
            System.out.println(resultInfo);
        } catch (JsonProcessingException e) { 
   
            e.printStackTrace();
        }
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/156528.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 股票软件c++源代码

    股票软件c++源代码源码的部分配套开发文档http://item.taobao.com/auction/item_detail-0db1-4c3ffde99155fe1747132008fd2ece42.htm

  • 最全面、最详细web前端面试题及答案总结

    2021最全面、最详细web前端面试题及答案总结总结不易,希望可以帮助到即将面试或还在学习中的web前端小伙伴,祝面试顺利,拿高薪!本章是HTML考点的⾮重难点,因此我们采⽤简略回答的⽅式进⾏撰写,所以不会有太多详细的解释。我们约定,每个问题后我们标记『✨』的为⾼频⾯试题doctype的作⽤是什么?✨DOCTYPE是html5标准⽹⻚声明,且必须声明在HTML⽂档的第⼀⾏。来告知浏览器的解析器⽤什么⽂档标准解析这个⽂档,不同的渲染模式会影响到浏览器对于CSS代码甚⾄JavaScript

  • python和java和c语言的区别-python c 和java的区别有哪些「建议收藏」

    python和java和c语言的区别-python c 和java的区别有哪些「建议收藏」一、pythonpython比较容易学习,语法很简单,融入了很多现代编程语言的特性。python的库非常丰富,可以迅速地开发程序,无论是网站还是小游戏都非常方便。不过,python的脚本的运行效率较低,不适合对运行效率要求较高的程序。Python是一种脚本语言。它更适合用来做算法。Python简单易学,对于新手来讲是编程入门的好选择。Python其实也是基于C++创造的,它们的区别主要体现在,C+…

  • Nginx转发https

    Nginx转发httpsnginx

    2022年10月19日
  • Linux云服务器挖矿病毒(crypto和pnscan)导致CPU占用100%问题解决方案「建议收藏」

    Linux云服务器挖矿病毒(crypto和pnscan)导致CPU占用100%问题解决方案「建议收藏」木马攻击问题由来阐述我买了三年的阿里云服务器(在阿里云官网买的),已经使用了一年多了,平时拿来搭建网站,有时也拿来学习技术和开发测试,一直使用很稳定。直到近期我服务器上安装了docker并部署了springboot+mysql+nginx项目,就被攻击了。但就在今年的5月14号,我的服务器被木马攻击,然后被拿去挖矿了。我服务器的cpu持续维持在CPU100%.后果是直接导致我网站无法正常请求和响应。而且Linux服务器的root权限被窃取了。黑客在服务器/root/.ssh目录下生成了连root用户

  • 最新dedecms 0day漏洞_易优cms漏洞

    最新dedecms 0day漏洞_易优cms漏洞原文地址:http://hi.baidu.com/artcracker/blog/item/682a1c24640ee37735a80f49.html 首先,我百度“NetCms网站管理系统”,然后顺手找了个网站。然后进去,/user/login.aspx    ,点注册。点击发表文章。在发表文章页面,点击“选择图片”  我们在这里,记下这个目

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号