java qq登陆api_java方式接入QQ登录
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登录相关推荐
- php接入qq登陆,thinkphp5中接入QQ登录方法详解
Thinkphp5中接入QQ登录操作,方法详解: 1.下载PHP SDK <点击进入下载页> 2.下载后的SDK解压,并运行install下的index.php 3.填写appid.app ...
- 怎样查询计算机登录记录,qq登陆记录,教您QQ如何查看登录历史记录
qq是我们经常会使用到的一款聊天工具,很多用户都会使用到它.不过,最近一些朋友反馈自己想要在电脑中查看qq登录记录,可是操作了很久都没有成功.当我们的QQ出现异常登陆的时候我们往往会想要查询一下登陆记 ...
- html手机qq登陆验证码,为什么qq登陆需要验证码?qq登陆需要验证码怎么取消?...
为什么qq登陆需要验证码?qq登陆需要验证码怎么取消?很多用户在登陆qq时,总是需要输入验证码,一些用户表示很烦,那么大家知道为什么qq登陆需要验证码吗?如果不想每次登陆qq都需要验证码该如何取消呢? ...
- java版本qq登陆界面_java实现QQ登陆界面
以下是效果截图: 素材: 以下是源代码: import java.awt.*; import java.awt.event.MouseEvent; import java.awt.event.Mous ...
- QQ登陆第三方Demo(QQ互联)
项目需要做QQ.微博等登陆第三方的功能,第一次接触,虽然官网上有sdk,接口写的很好,调用即可,但是没有文档,看着头疼就自己写了 步骤不多说: 一.申请AppID和AppKey,申请地址:点击打开链接 ...
- java获取qq登陆信息_java获取QQ第三方登录
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 org.apache.httpcomponents httpclient 4.5.6 com.alibaba fastjson 1.2.47 packag ...
- android qq 登陆 简书,使用QQ第三方登录
一,首先导入jar包 image.png 配置: ··· compile files('libs/open_sdk_r5990_lite.jar') compile 'com.android.supp ...
- java图书馆登陆代码_图书馆系统(登录设计)
基于MVC设计----图书馆系统(登录设计) 这一学期学习了JavaWeb开发, 课程结束时老师给的任务是做一个课程设计,博主使用MVC(jsp.servlets.javabean)开发了一个简单的图 ...
- php qq登陆网站实例代码,QQ登陆网站实例代码
现在这种第三方登录的应用很广泛也很方便.省得用户进行注册了.现在把QQ登录的方法和步骤记录一下,以备使用时方便. 第一步,到http://connect.qq.com/intro/login/这里去申 ...
最新文章
- Python的应用及优缺点分析
- 遍历dict的items输出tuple类型
- java 手机号码归属地_【原创】Java实现手机号码归属地查询
- Node中使用mysql模块遇到的问题
- BugkuCTF-Reverse题Easy_vb多方法解决
- global.asax不执行原因
- eclipse插件之——PropertiesEditor
- 基于Yolov5目标检测的物体分类识别及定位(一) -- 数据集原图获取与标注
- 从一张截图看秒开缓存的强大功效
- ManoMotion⭐二、Unity手势识别插件简介,及效果录屏
- python学习之函数(一)
- 红米note3android版本,小米-红米note3-LOS-安卓9.0.0-稳定版Stable3.0-来去电归属-农历等-本地化增强适配...
- netty 错误 #[IllegalReferenceCountException: refCnt: 0, decrement: 1]
- 微信小程序--窗口背景颜色铺满页面
- 相濡以沫与相忘于江湖
- Scala初级实践——统计手机耗费流量(1)
- 补缴2个月社保折腾1年多 刁钻政策玩死人
- 小台灯内部电路原理图,仅供参考(实际测量自己的台灯的输入电压是直流135V。时间2021.3.9)
- (转)Lua之父采访记录
- react 对象克隆_如何使用React&GraphQL(Dune World Edition)创建全栈Yelp克隆