网站的app_id,app_key需要自己去:https://connect.qq.com/index.html
还需要注册个人开发者:https://developers.e.qq.com/
后端:
package cn.bsuc.controller;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.alibaba.fastjson.JSON;
import cn.bsuc.util.HttpRequest;
@Controller
@RequestMapping(value="login")
public class LoginController {
/**
*调用QQ官方登录接口
*/
@RequestMapping(value="qq_authorize.do")
public void loginQQ(HttpServletRequest request,HttpServletResponse response) throws IOException{
response.sendRedirect("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=101495416&redirect_uri=http://127.0.0.1:8080/food/login/qq_code.do&state=test");
}
/**
* 执行QQ登录验证操作
*/
@RequestMapping(value="qq_code.do")
public void QQ_Code(HttpServletRequest request,HttpServletResponse response) throws IOException{
Map<String, String> map = new HashMap<>();
List<String> list = new ArrayList<>();
String code = request.getParameter("code");
if (code!=null) {
String URL = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=101495417&client_secret=91eeb8a1c2d2905d4a215a577d99e66&code="+code+"&redirect_uri=https://127.0.0.1:8080/food/login/qq_code.do";
//后端请求oauth2.0权限认证平台,返回Access Token
String token = HttpRequest.get(URL);
String[] token_1 = token.split("&");
//解析数据
for (String data : token_1) {
list.add(data);
}
for (String list_1 : list) {
String [] data = list_1.split("=");
map.put(data[0], data[1]);
}
}
//置换:OpenID
String access_token = map.get("access_token");
if (access_token!=null) {
String urlOpenID = "https://graph.qq.com/oauth2.0/me?access_token="+access_token+"";
String callback = HttpRequest.get(urlOpenID);
//解析:callback( {"client_id":"10149541","openid":"F26161FD557A749FB0F6DC2FA693B0F"} );
String[] arr = callback.split(" ");
//截取字符串
String back = arr[1];
//System.out.println(back);
//转成Map集合
Map map_id = (Map) JSON.parse(back);
//System.out.println(map_id.get("openid"));
String openID = (String) map_id.get("openid");
//用openID获取用户名,头像,等基础信息
String user = "https://graph.qq.com/user/get_user_info?access_token="+access_token+"&oauth_consumer_key=101495416&openid="+openID+"";
String httpUser = HttpRequest.get(user);
//System.out.println(httpUser);
/*{ "ret": 0, "msg": "", "is_lost":0, "nickname": "村上春树", "gender": "男", "province": "", "city": "维也纳", "year": "1996", "constellation": "", "figureurl": "http:\/\/qzapp.qlogo.cn\/qzapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/30", "figureurl_1": "http:\/\/qzapp.qlogo.cn\/qzapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/50", "figureurl_2": "http:\/\/qzapp.qlogo.cn\/qzapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/100", "figureurl_qq_1": "http:\/\/thirdqq.qlogo.cn\/qqapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/40", "figureurl_qq_2": "http:\/\/thirdqq.qlogo.cn\/qqapp\/101495416\/F26161FD557A749FB0FA6DC2FA693B0F\/100", "is_yellow_vip": "0", "vip": "0", "yellow_vip_level": "0", "level": "0", "is_yellow_year_vip": "0"}*/
Map map_user = (Map) JSON.parse(httpUser);
String nickname = (String) map_user.get("nickname");
System.out.println("---------------"+nickname);
}
}
}
工具类(别人写的!!!):
package cn.bsuc.util;
/**
* Copyright 2017
* 注意:请勿修改
* All right reserved.
*/
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Map;
import java.util.Map.Entry;
/**
* @Name: HttpRequest.java
* @Description: Java后台访问http,并获得响应数据。
* @Author: PeiFeng
* @Create Date: 2017-8-9
*/
public final class HttpRequest {
// ;charset=utf-8 必须要,不然会出现乱码
/**
* 表单数据 <br/>
* <br/>
* 在发送前编码所有字符(默认)<br/>
* <br/>
* application/x-www-form-urlencoded;charset=utf-8
*/
public static String CONTENT_TYPE_FORM_URLENCODED = "application/x-www-form-urlencoded;charset=utf-8";
/**
* 表单数据 <br/>
* <br/>
* 不对字符编码。在使用包含文件上传控件的表单时,必须使用该值 <br/>
* <br/>
* multipart/form-data;charset=utf-8
*/
public static String CONTENT_TYPE_FORM_DATA = "multipart/form-data;charset=utf-8";
/** text/plain;charset=utf-8 */
public static String CONTENT_TYPE_PLAIN = "text/plain;charset=utf-8";
/** application/json;charset=utf-8 */
public static String CONTENT_TYPE_JSON = "application/json;charset=utf-8";
/**
* @Name: post。
* @Description: 发送post请求,并返回响应数据。
* @Parameters: URL,要访问的url。
* @Parameters: parms,访问参数,Map形式。
* @Return: String,响应数据。
* @Author: PeiFeng
* @Version: V1.00
* @Create Date: 2017-8-8
*/
public static String post(String URL, Map<String, String> params) {
StringBuilder parm = new StringBuilder();
if (params != null && !params.isEmpty()) {
for (Entry<String, String> entry : params.entrySet()) {
parm.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
return post(URL, parm.toString());
}
/**
* @Name: post。
* @Description: 发送post请求,并返回响应数据。
* @Parameters: URL,要访问的url。
* @Parameters: parm,访问参数。
* @Return: String,响应数据。
* @Author: PeiFeng
* @Version: V1.00
* @Create Date: 2017-8-8
*/
public static String post(String URL, String parm) {
HttpURLConnection conn = null;
// 数据输出流,输出参数信息
DataOutputStream dataOut = null;
// 数据输入流,处理服务器响应数据
BufferedReader dataIn = null;
try {
URL url = new URL(URL);
// 将url以open方法返回的urlConnection连接强转为HttpURLConnection连接(标识一个url所引用的远程对象连接)
// 此时cnnection只是为一个连接对象,待连接中
conn = (HttpURLConnection) url.openConnection();
// 设置连接输出流为true,默认false (post请求是以流的方式隐式的传递参数)
conn.setDoOutput(true);
// 设置连接输入流为true
conn.setDoInput(true);
// 设置请求方式为post
conn.setRequestMethod("POST");
// post请求缓存设为false
conn.setUseCaches(false);
// 设置该HttpURLConnection实例是否自动执行重定向
conn.setInstanceFollowRedirects(true);
// 设置内容的类型,设置为经过urlEncoded编码过的from参数
conn.setRequestProperty("Content-Type", HttpRequest.CONTENT_TYPE_FORM_URLENCODED);
conn.setRequestProperty("accept", "*/*");
// conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible;
// MSIE 6.0; Windows NT 5.1;SV1)");
// 建立连接
// (请求未开始,直到connection.getInputStream()方法调用时才发起,以上各个参数设置需在此方法之前进行)
conn.connect();
// 创建输入输出流,用于往连接里面输出携带的参数,(输出内容为?后面的内容)
dataOut = new DataOutputStream(conn.getOutputStream());
// 将参数输出到连接
dataOut.writeBytes(parm != null ? parm : "");
// 输出完成后刷新并关闭流
dataOut.flush();
//输出连接信息,实际使用时去掉
outConnInfo(conn, url);
// 连接发起请求,处理服务器响应 (从连接获取到输入流并包装为bufferedReader)
dataIn = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
// 用来存储响应数据
StringBuilder sb = new StringBuilder();
// 循环读取流
while ((line = dataIn.readLine()) != null) {
sb.append(line).append(System.getProperty("line.separator"));
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 重要且易忽略步骤 (关闭流,切记!)
if (dataOut != null) {
dataOut.close();
}
if (dataIn != null) {
dataIn.close();
}
// 销毁连接
if (conn != null) {
conn.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* @Name: get。
* @Description: 发送get请求,并返回响应数据。
* @Parameters: URL,要访问的url。
* @Return: String,响应数据。
* @Author: PeiFeng
* @Version: V1.00
* @Create Date: 2017-8-8
*/
public static String get(String URL) {
HttpURLConnection conn = null;
BufferedReader dataIn = null;
try {
// 把字符串转换为URL请求地址
URL url = new URL(URL);
// 打开连接
conn = (HttpURLConnection) url.openConnection();
// 连接会话
conn.connect();
// 获取输入流
dataIn = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
String line;
StringBuilder sb = new StringBuilder();
while ((line = dataIn.readLine()) != null) {// 循环读取流
sb.append(line);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 重要且易忽略步骤 (关闭流,切记!)
if (dataIn != null) {
dataIn.close();
}
// 销毁连接
if (conn != null) {
conn.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/** 输出连接信息 */
private static void outConnInfo(HttpURLConnection conn, URL url) throws IOException {
// url与url = conn.getURL()是等价的
System.out.println("conn.getResponseCode():" + conn.getResponseCode());
System.out.println("conn.getURL():" + conn.getURL());
System.out.println("conn.getRequestMethod():" + conn.getRequestMethod());
System.out.println("conn.getContentType():" + conn.getContentType());
System.out.println("conn.getReadTimeout():" + conn.getReadTimeout());
System.out.println("conn.getResponseMessage():" + conn.getResponseMessage());
System.out.println("url.getDefaultPort():" + url.getDefaultPort());
System.out.println("url.getFile():" + url.getFile());
System.out.println("url.getHost():" + url.getHost());
System.out.println("url.getPath():" + url.getPath());
System.out.println("url.getPort():" + url.getPort());
System.out.println("url.getProtocol():" + url.getProtocol());
System.out.println("url.getQuery():" + url.getQuery());
System.out.println("url.getRef():" + url.getRef());
System.out.println("url.getUserInfo():" + url.getUserInfo());
}
public static void main(String[] args) {
String result = post("https://blog.csdn.net/liupeifeng3514", "");
System.out.println("\n" + result);
}
}
转载:https://blog.csdn.net/liupeifeng3514/article/details/80103572
解析数据用到的jar包:fastjson-1.2.4.jar
地址:http://central.maven.org/maven2/com/alibaba/fastjson/1.2.4/fastjson-1.2.4.jar