java qq登陆api_java方式接入QQ登录

本文介绍了如何使用Java实现QQ登录API,包括URL编码、配置信息处理、获取授权code、token和openId的详细步骤,以及如何根据这些信息获取用户详情。
摘要由CSDN通过智能技术生成

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 第三方登录,你需要先在 QQ 互联网站上注册应用,并获取应用的 appId 和 appKey。 然后,你可以使用第三方库来处理 QQ 登录的流程。具体来说,你可以使用类似于 `qq-connect-sdk` 这样的库,它可以帮助你完成获取授权码、获取令牌、获取用户信息等步骤。 以下是一个使用 `qq-connect-sdk` 进行 QQ 登录的简单示例: ```java import com.qq.connect.QQConnectException; import com.qq.connect.api.OpenID; import com.qq.connect.api.qzone.UserInfo; import com.qq.connect.javabeans.AccessToken; import com.qq.connect.javabeans.qzone.UserInfoBean; import com.qq.connect.oauth.Oauth; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class QQLoginServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取授权码 String authorizeCode = request.getParameter("code"); if (authorizeCode == null) { // 若用户尚未授权,则重定向到 QQ 授权页面 String redirectUrl = new Oauth().getAuthorizeURL(request); response.sendRedirect(redirectUrl); return; } // 获取令牌 AccessToken token; try { token = new Oauth().getAccessTokenByRequest(request); } catch (QQConnectException e) { throw new ServletException(e); } // 获取 OpenID OpenID openIDObj = new OpenID(token.getAccessToken()); String openID; try { openID = openIDObj.getUserOpenID(); } catch (QQConnectException e) { throw new ServletException(e); } // 获
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值