java版qq登录源码和完成中遇到的问题

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"} );

下载地址:

猜你喜欢

转载自blog.csdn.net/m0_37865510/article/details/81099250