前言
如果你尚未认证成功,请参考我的文章
《QQ授权登陆 接入》
,完成之后拿到AppID和APP Key进行授权操作。官网的SDK是九年前的代码了,还是基于servlet的。所以如果搭建springboot项目的话,完全可以去码云上找一个
代码
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 org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
/**
* @ClassName: LoginController
* @Description: QQ登录控制器
* @author: xw
* @date 2020/2/21 10:54
* @Version: 1.0
**/
@Controller
public class LoginController
{
/**
* @return java.lang.String
* @Description 访问项目根目录跳转到登录页面
* @Author xw
* @Date 11:25 2020/2/21
* @Param []
**/
@RequestMapping("/")
public String login()
{
return "login";
}
/**
* @return void
* @Description 请求QQ登录
* @Author xw
* @Date 11:25 2020/2/21
* @Param [request, response]
**/
@RequestMapping("/loginByQQ")
public void loginByQQ(HttpServletRequest request, HttpServletResponse response)
{
response.setContentType("text/html;charset=utf-8");
try
{
response.sendRedirect(new Oauth().getAuthorizeURL(request));
System.out.println("请求QQ登录,开始跳转...");
} catch (QQConnectException | IOException e)
{
e.printStackTrace();
}
}
/**
* @return java.lang.String
* @Description QQ登录的回调方法
* @Author xw
* @Date 11:25 2020/2/21
* @Param [request, response, map]
**/
@RequestMapping("/connect")
public String connection(HttpServletRequest request, HttpServletResponse response, Map<String, Object> map) throws ServletException, IOException
{
try
{
AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
System.out.println(accessTokenObj);
String accessToken = null,
openID = null;
long tokenExpireIn = 0L;
if (accessTokenObj.getAccessToken().equals(""))
{
System.out.print("没有获取到响应参数");
} else
{
accessToken = accessTokenObj.getAccessToken();
tokenExpireIn = accessTokenObj.getExpireIn();
OpenID openIDObj = new OpenID(accessToken);
openID = openIDObj.getUserOpenID();
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
if (userInfoBean.getRet() == 0)
{
String name = removeNonBmpUnicode(userInfoBean.getNickname());
String imgUrl = userInfoBean.getAvatar().getAvatarURL100();
map.put("openId", openID);
map.put("name", name);
map.put("imgUrl", imgUrl);
} else
{
System.out.println("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());
}
}
} catch (Exception e)
{
e.printStackTrace();
}
return "index";
}
/**
* @return java.lang.String
* @Description 处理掉QQ网名中的特殊表情
* @Author xw
* @Date 11:26 2020/2/21
* @Param [str]
**/
public String removeNonBmpUnicode(String str)
{
if (str == null)
{
return null;
}
str = str.replaceAll("[^\\u0000-\\uFFFF]", "");
if ("".equals(str))
{
str = "($ _ $)";
}
return str;
}
}
这边代码就简单看看没什么太大的参考意义,完整代码看结尾的码云,我就配置和一些小问题进行阐述!
我的回调地址通过之后改成了内网穿透的地址,这个过程无需审核。
问题
我刚把工程部署好,换了key改了回调地址之后,每次授权获取不到access_token
后来我才想起来,我进入首页的时候用的是localhost:8080进的,然后回调是内穿的地址,会不会和这个有关系!然后我进首页用内网穿透的域名进入果然,然后登陆进入回调地址果然拿到了token!
但是今天我又试了一下,使用本地localhost又可以拿到token了,这就说明获取不到token的问题并不是登陆使用本地localhost导致的,还需摸索!
项目地址:
https://gitee.com/thirtyleo/java_training_ground/tree/master/qq_login
版权声明:本文为Curtisjia原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。