首先要做的在QQ互联申请项目QQ互联官网首页 ,申请通过会得到APPID , APPKey
一 : 在HTML/JSP页面放置符合QQ互联标准的QQ登录图标
附代码:
<a href="https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=
"+ 此处填APPID +" &redirect_uri= " + 此处填回调地址 + " &state=fefwerwf" class="icon connect-qq" ><span icon-bg2="icon_qq_n"></span><img alt="" src= "+ 此处填QQ图标的路径 +" style="width:120px;height:24px"></a>
测试可以正常跳转:此刻Authorization_Code包含在URL地址栏
二 :获取Access_Token
Authorization_Code从哪里来?QQ互联我设置的回调地址指到了Servlet , Servlet可以通过
request.getParameter("code") 抓到code值。
然后通过调用 QQ_LoginUtil.getAccess_token() 得到Access_Token ,该方法我已封装,附最后
String Access_Token = QQ_LoginUtil.getAccess_token(code, "填APPID", "填APPKey", "填回调地址");
三 : 获取用户OpenID
通过第二步得到的Access_Token,调用QQ_LoginUtil.getOpen_ID() 得到OpenID
String openid = QQ_LoginUtil.getOpen_ID(Access_Token);
四 : 大结局、获取用户个人信息
通过得到的Access_Token、OpenID,便可以拿到用户个人信息,返回值为JSON类型
JSONObject info = QQ_LoginUtil.getUserInfo("填APPID", Access_Token , OpenID);
返回值(昵称,年龄,头像……)
{
"ret":0,
"msg":"",
"nickname":"你的昵称",
...
}
附:文中使用的封装代码,get方法使用的jar包为 commons-io-2.11.0.jar
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import com.alibaba.fastjson.JSONObject;
/**
* 首先要在HTML页面放置QQ登录标准登录按钮(参考QQ互联)
* @author 时光
*
*/
public class QQ_LoginUtil {
/**
* 第一步:得到token
* @param code 网页授权得到的code
* @param APPID QQ后台QQAppID
* @param APPKey QQ后台QQAppKey
* @param redirect_uri QQ后台设置的回调地址
* @return Access_token
*/
public static String getAccess_token(String code,String APPID,String APPKey,String redirect_uri) {
String getAccess_token = get(
"https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id="+APPID+"&client_secret="+APPKey+"&code="
+ code + "&redirect_uri="+redirect_uri+"&fmt=json");
JSONObject json = JSONObject.parseObject(getAccess_token);
String res = json.getString("access_token");
System.out.println(res);
return res;
}
/**
* 第二步:通过第一步拿到的Access_token 得到用户的Open_ID
* @param Access_token 第一步拿到的Access_token
* @return Open_ID
*/
public static String getOpen_ID(String Access_token ) {
String getOpenID = get("https://graph.qq.com/oauth2.0/me?access_token=" + Access_token + "&fmt=json");
JSONObject jsons = JSONObject.parseObject(getOpenID);
System.out.println(jsons + "这是获取到getOpenID");
String OpenID = jsons.getString("openid");
System.out.println(OpenID);
return OpenID;
}
/**
* 第三步:通过Access_token和OpenID获得用户的所有信息,返回JSONobject类型
* @param APPID QQ后台QQAppID
* @param Access_token 第一步拿到的Access_token
* @param OpenID 第二步拿到的OpenID
* @return UserInfo
*/
public static JSONObject getUserInfo(String APPID,String Access_token,String OpenID ) {
String getOpenAPI = get("https://graph.qq.com/user/get_user_info?access_token=" + Access_token
+ "&oauth_consumer_key="+APPID+"&openid=" + OpenID);
JSONObject jsonss = JSONObject.parseObject(getOpenAPI);
System.out.println(jsonss);
return jsonss;
}
/**
* GET方法
* @param url
* @return
* get方法
*/
public static String get(String url) {
BufferedReader in = null;
try {
URL realUrl = new URL(url);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
// 建立实际的连接
connection.connect();
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while ((line = in.readLine()) != null) {
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
System.out.println("错误报告," + e);
} finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return null;
}
}