public class URLEncodeUtil {

private final static String ENCODE = "UTF-8";

/**

* URL 解码

*/

public static String getURLDecoderString(String str) {

String result = "";

if (null == str) {

return "";

}

try {

result = java.net.URLDecoder.decode(str, ENCODE);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return result;

}

/**

* URL 转码

*/

public static String getURLEncoderString(String str) {

String result = "";

if (null == str) {

return "";

}

try {

result = java.net.URLEncoder.encode(str, ENCODE);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return result;

}

}

2.QQ配置信息

public class QqConfig {

@Value("${qq.appId}")

private String qqAppId;

@Value("${qq.appSecret}")

private String qqAppSecret;

@Value("${qq.redirectUrl}")

private String qqRedirectUrl;

}

3.获取code,token,openId

public class QqConnectServiceImpl implements QqConnectService {

/**

* QQ :读取Appid相关配置信息静态类

*/

@Autowired

private QqConfig qqConfig;

@Override

public String getCode(String state) throws Exception {

// 拼接url

StringBuilder url = new StringBuilder();

url.append("https://graph.qq.com/oauth2.0/authorize?");

url.append("response_type=code");

url.append("&client_id=" + qqConfig.getQqAppId());

// 回调地址 ,回调地址要进行Encode转码

String redirect_uri = qqConfig.getQqRedirectUrl();

// 转码

url.append("&redirect_uri=" + URLEncodeUtil.getURLEncoderString(redirect_uri));

url.append("&state="+URLEncodeUtil.getURLEncoderString(state));

System.out.println(url.toString());

//HttpClientUtils.get(url.toString(), "UTF-8");

return url.toString();

}

/**

* 开始登录

* @param code

* @return

* @throws Exception

*/

@Override

public QQUserVO qqLogin(String code) throws Exception {

if (code != null) {

System.out.println(code);

}

//获取tocket

Map qqProperties = getToken(code);

//获取openId(每个用户的openId都是唯一不变的)

QQUserVO openId = getOpenId(qqProperties);

qqProperties.put("openId",openId.getOpenid());

//获取数据

QQUserVO userInfo = getQqUserInfo(qqProperties);

userInfo.setOpenid(openId.getOpenid());

userInfo.setUnionid(openId.getUnionid());

return userInfo;

}

/**

* 获得token信息(授权,每个用户的都不一致) --> 获得token信息该步骤返回的token期限为一个月

*/

private Map getToken(String code) throws Exception {

StringBuilder url = new StringBuilder();

url.append("https://graph.qq.com/oauth2.0/token?");

url.append("grant_type=authorization_code");

url.append("&client_id=" + qqConfig.getQqAppId());

url.append("&client_secret=" + qqConfig.getQqAppSecret());

url.append("&code=" + code);

// 回调地址

String redirect_uri = qqConfig.getQqRedirectUrl();

// 转码

url.append("&redirect_uri=" + URLEncodeUtil.getURLEncoderString(redirect_uri));

// 获得token

String result = HttpClientUtils.get(url.toString(), "UTF-8");

log.info("result___________"+result);

// 把token保存

String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(result, "&");

String accessToken = StringUtils.substringAfterLast(items[0], "=");

Long expiresIn = new Long(StringUtils.substringAfterLast(items[1], "="));

String refreshToken = StringUtils.substringAfterLast(items[2], "=");

//token信息

Map qqProperties = new HashMap();

qqProperties.put("accessToken", accessToken);

qqProperties.put("expiresIn", String.valueOf(expiresIn));

qqProperties.put("refreshToken", refreshToken);

return qqProperties;

}

/**

* 获取用户openId(根据token)

*

// * @param 把openId存到map中

* @return

* @throws Exception

*/

private QQUserVO getOpenId(Map qqProperties) throws Exception {

// 获取保存的用户的token

String accessToken = (String) qqProperties.get("accessToken");

if (!StringUtils.isNotEmpty(accessToken)) {

// return "未授权";

}

StringBuilder url = new StringBuilder("https://graph.qq.com/oauth2.0/me?");

url.append("access_token=" + accessToken);

url.append("&unionid=1" );

String result = HttpClientUtils.get(url.toString(), "UTF-8");

log.info("result___________"+result);

String openId = StringUtils.substringBetween(result, "\"openid\":\"", "\",\"unionid\"");

String unionid = StringUtils.substringBetween(result, "\"unionid\":\"", "\"}");

QQUserVO qqUserVO = new QQUserVO();

qqUserVO.setOpenid(openId);

qqUserVO.setUnionid(unionid);

return qqUserVO;

}

/**

* 根据token,openId获取用户信息

*/

private QQUserVO getQqUserInfo(Map qqProperties) throws Exception {

// 取token

String accessToken = (String) qqProperties.get("accessToken");

String openId = (String) qqProperties.get("openId");

if (!StringUtils.isNotEmpty(accessToken) || !StringUtils.isNotEmpty(openId)) {

return null;

}

//拼接url

StringBuilder url = new StringBuilder("https://graph.qq.com/user/get_user_info?");

url.append("access_token=" + accessToken);

url.append("&oauth_consumer_key=" + qqConfig.getQqAppId());

url.append("&openid=" + openId);

// 获取qq相关数据

String result = HttpClientUtils.get(url.toString(), "UTF-8");

log.info("result___________"+result);

Object json = JSON.parseObject(result, QQUserVO.class);

QQUserVO qqUserVO = (QQUserVO) json;

return qqUserVO;

}

java qq登陆api_java方式接入QQ登录相关推荐

  1. php接入qq登陆,thinkphp5中接入QQ登录方法详解

    Thinkphp5中接入QQ登录操作,方法详解: 1.下载PHP SDK <点击进入下载页> 2.下载后的SDK解压,并运行install下的index.php 3.填写appid.app ...

  2. 怎样查询计算机登录记录,qq登陆记录,教您QQ如何查看登录历史记录

    qq是我们经常会使用到的一款聊天工具,很多用户都会使用到它.不过,最近一些朋友反馈自己想要在电脑中查看qq登录记录,可是操作了很久都没有成功.当我们的QQ出现异常登陆的时候我们往往会想要查询一下登陆记 ...

  3. html手机qq登陆验证码,为什么qq登陆需要验证码?qq登陆需要验证码怎么取消?...

    为什么qq登陆需要验证码?qq登陆需要验证码怎么取消?很多用户在登陆qq时,总是需要输入验证码,一些用户表示很烦,那么大家知道为什么qq登陆需要验证码吗?如果不想每次登陆qq都需要验证码该如何取消呢? ...

  4. java版本qq登陆界面_java实现QQ登陆界面

    以下是效果截图: 素材: 以下是源代码: import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.Mous ...

  5. QQ登陆第三方Demo(QQ互联)

    项目需要做QQ.微博等登陆第三方的功能,第一次接触,虽然官网上有sdk,接口写的很好,调用即可,但是没有文档,看着头疼就自己写了 步骤不多说: 一.申请AppID和AppKey,申请地址:点击打开链接 ...

  6. java获取qq登陆信息_java获取QQ第三方登录

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 org.apache.httpcomponents httpclient 4.5.6 com.alibaba fastjson 1.2.47 packag ...

  7. android qq 登陆 简书,使用QQ第三方登录

    一,首先导入jar包 image.png 配置: ··· compile files('libs/open_sdk_r5990_lite.jar') compile 'com.android.supp ...

  8. java图书馆登陆代码_图书馆系统(登录设计)

    基于MVC设计----图书馆系统(登录设计) 这一学期学习了JavaWeb开发, 课程结束时老师给的任务是做一个课程设计,博主使用MVC(jsp.servlets.javabean)开发了一个简单的图 ...

  9. php qq登陆网站实例代码,QQ登陆网站实例代码

    现在这种第三方登录的应用很广泛也很方便.省得用户进行注册了.现在把QQ登录的方法和步骤记录一下,以备使用时方便. 第一步,到http://connect.qq.com/intro/login/这里去申 ...

最新文章

  1. Python的应用及优缺点分析
  2. 遍历dict的items输出tuple类型
  3. java 手机号码归属地_【原创】Java实现手机号码归属地查询
  4. Node中使用mysql模块遇到的问题
  5. BugkuCTF-Reverse题Easy_vb多方法解决
  6. global.asax不执行原因
  7. eclipse插件之——PropertiesEditor
  8. 基于Yolov5目标检测的物体分类识别及定位(一) -- 数据集原图获取与标注
  9. 从一张截图看秒开缓存的强大功效
  10. ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
  11. python学习之函数(一)
  12. 红米note3android版本,小米-红米note3-LOS-安卓9.0.0-稳定版Stable3.0-来去电归属-农历等-本地化增强适配...
  13. netty 错误 #[IllegalReferenceCountException: refCnt: 0, decrement: 1]
  14. 微信小程序--窗口背景颜色铺满页面
  15. 相濡以沫与相忘于江湖
  16. Scala初级实践——统计手机耗费流量(1)
  17. 补缴2个月社保折腾1年多 刁钻政策玩死人
  18. 小台灯内部电路原理图,仅供参考(实际测量自己的台灯的输入电压是直流135V。时间2021.3.9)
  19. (转)Lua之父采访记录
  20. react 对象克隆_如何使用React&GraphQL(Dune World Edition)创建全栈Yelp克隆

热门文章

  1. Flutter 布局控件完结篇
  2. 第七节:HtmlHelper及其扩展
  3. centos开机启动zookeeper
  4. 【AS3代码】访问/修改XML子元素和属性
  5. [转]android的selector,背景选择器
  6. Windows系统错误代码解释集合
  7. 【心情】期待 Mr. Jack In New York!
  8. adv7842自定义方式
  9. Python赋值运算符(入门必读)
  10. Python基础最常用且重要的模块总结----建议收藏