java的QqLoginUtil.java文件
package com.activity.utils;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class QqLoginUtil {
private static final Log logger = LogFactory.getLog(QqLoginUtil.class);
private static String APPID;
private static String SECRET;
private static String codePath="https://graph.qq.com";
private static String BACKURL;
static{
InputStream inputStream = TencentAccessToken.class.getClassLoader().getResourceAsStream("properties/common.properties");
Properties prop = new Properties();
try {
prop.load(inputStream);
} catch (IOException e) {
logger.error(e.getMessage());
}
APPID = prop.getProperty("QQAPPID");
SECRET = prop.getProperty("QQSECRET");
BACKURL=prop.getProperty("QQBACKURL");
}
//获取返回url
@SuppressWarnings("deprecation")
public static String getReturnUrl(HttpSession session){
String localVarPath = "/oauth2.0/authorize";
String state=RandomStringUtils.randomAlphanumeric(10);
session.setAttribute("qqstate", state);
String locaParam = "?client_id="+APPID+"&redirect_uri="+BACKURL+"&response_type=code&state="+state;
System.out.println("qq登录返回地址是"+codePath+localVarPath+locaParam);
return codePath+localVarPath+locaParam;
}
//获取返回qq的信息
public static Map<String,Object> getUserInfo(HttpSession session,String code,String state){
String sessionstate=new String();
Map<String,Object> returnmap=new HashMap<String,Object>();
if(session.getAttribute("qqstate") != null && !"".equals(session.getAttribute("qqstate"))){
sessionstate=session.getAttribute("qqstate").toString();
}
System.out.println("qq存储的session的值为"+sessionstate+",获取state值为"+state+",code的值为"+code);
if(StringUtils.isNotBlank(code) && state.equals(sessionstate)){
//获取access_token
String getCodeUrl=codePath+"/oauth2.0/token?grant_type=authorization_code"
+"&client_id="+APPID
+"&client_secret="+SECRET
+"&code="+code
+"&redirect_uri="+BACKURL;
String accessresult = "";
accessresult=HttpUtil.sendGet(getCodeUrl,"");
if(accessresult != null && !accessresult.contains("callback(")){
String access_toke=accessresult.substring(accessresult.indexOf("=")+1, accessresult.indexOf("&"));
if(access_toke != null && !"".equals(access_toke)){
//获取用户uid
String getUidUrl=codePath+"/oauth2.0/me";
String parameter="access_token="+access_toke;
String uidresult = "";
uidresult=HttpPostUtil.postMethod(getUidUrl, parameter);
if(uidresult != null && uidresult.contains("callback")){
Map<String, Object> uidresultmap = new HashMap<>();
String uidres=uidresult.substring(9);
uidresult=uidres.substring(0, uidres.length()-1);
try {
uidresultmap = JackSonUtil.json2map(uidresult);
System.out.println("qq用户uid的值为"+uidresultmap.toString());
} catch (Exception e1) {
e1.printStackTrace();
}
if(uidresultmap != null && !"".equals(uidresultmap.get("openid"))){
//根据用户uid和token获取用户信息
String getUserInfoUrl=codePath+"/user/get_user_info?access_token="+access_toke
+"&oauth_consumer_key="+APPID
+"&openid="+uidresultmap.get("openid");
String userinfo=HttpUtil.sendGet(getUserInfoUrl, "");
if(userinfo != null && !"".equals(userinfo)){
Map<String, Object> userinforesultmap = new HashMap<>();
try {
userinforesultmap = JackSonUtil.json2map(userinfo);
logger.info("qq用户信息值为"+userinforesultmap.toString());
System.out.println("qq用户信息值为"+userinforesultmap.toString());
} catch (Exception e1) {
e1.printStackTrace();
}
if(access_toke != null && !"".equals(access_toke)){
//获取unionid
String getUnionidUrl=codePath+"/oauth2.0/me?access_token="+access_toke
+"&unionid=1";
String unionidUrl=HttpUtil.sendGet(getUnionidUrl, "");
if(unionidUrl != null && !"".equals(unionidUrl)){
String unioniddata=unionidUrl.substring(unionidUrl.indexOf("(")+1, unionidUrl.indexOf(")"));
Map<String, Object> unionidresultmap = new HashMap<>();
try {
unionidresultmap = JackSonUtil.json2map(unioniddata);
logger.info("unionid值为"+unionidUrl.toString());
System.out.println("unionid值为"+unionidUrl.toString());
} catch (Exception e1) {
e1.printStackTrace();
}
returnmap.put("type","1");
returnmap.put("unionid", unionidresultmap.get("unionid"));
returnmap.put("state", "1");
returnmap.put("nickname", userinforesultmap.get("nickname"));
returnmap.put("sex", "1");
returnmap.put("address", "");
returnmap.put("headimgurl", userinforesultmap.get("figureurl_1"));
}else{
returnmap.put("state", "-1");
returnmap.put("msg", "获取unionid内容失败");
}
}else{
returnmap.put("state", "-1");
returnmap.put("msg", "获取unionid信息失败,access没获取到");
}
}else{
returnmap.put("state", "-1");
returnmap.put("msg", "用户信息解析失败");
}
}else{
returnmap.put("state", "-1");
returnmap.put("msg", "获取用户uid失败");
}
}else{
returnmap.put("state", "-1");
returnmap.put("msg", "获取用户uid失败");
}
}
}else{
returnmap.put("state", "-1");
returnmap.put("msg", "获取token失败");
}
}
return returnmap;
}
public static void main(String[] args){
//获取固定字符串中两个字符串之间的内容
String str="access_token=7BBFBDAE62CA6B9EC0F4B4E810F1C38C&expires_in=7776000&refresh_token=579B4051EF86407B82CC5E2AF9434F8B";
System.out.println(str.substring(str.indexOf("=")+1, str.indexOf("&")));
}
}
在写这个中间,也出现过很多问题,比如获取用户uid是有callback,我就直接解析成map,老是报错,后来才发现了,还要友情提醒一下,如果想获取unionid,需要发送邮件去申请,不然就会报错callback( {"error":100048,"error_description":"CompanyID not set"} );
下载地址: