Java官方SDK进行QQ接入

导读:本篇文章讲解 Java官方SDK进行QQ接入,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

如果你尚未认证成功,请参考我的文章《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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/16353.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!