2023-06-18  阅读(5)
原文作者:代码有毒 mrcode 原文地址:https://mrcode.blog.csdn.net/article/details/81942345

QQ登录上

根据上面接收的原理,开发思路是:

最终我们是要获取到Connection,

那么就需要使用ConnectionFactory创建

而ConnectionFactory又需要ServiceProvider和ApiAdapter;

倒退流程,走到最后就是先实现Api。

http://wiki.connect.qq.com/api%E5%88%97%E8%A1%A8

开发Api对象

    package cn.mrcode.imooc.springsecurity.securitycore.qq.api;
    
    import java.io.IOException;
    
    public interface QQ {
        QQUserInfo getUserInfo() throws IOException;
    }
    import org.springframework.social.oauth2.TokenStrategy;
    
    import java.io.IOException;
    
    /**
     * 构建与qq交互的api实例;完成的是第6步
     * @author : zhuqiang
     * @version : V1.0
     * @date : 2018/8/6 0:46
     */
    public class QQImpl extends AbstractOAuth2ApiBinding implements QQ {
        // http://wiki.connect.qq.com/%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7openid_oauth2-0
        public final static String URL_GET_OPENID = "https://graph.qq.com/oauth2.0/me?access_token=%s";
        // 父类会自动携带accessToken
        public final static String URL_GET_USER_INFO = "https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s";
    
        private String appId;
        private String openid;
    
        private ObjectMapper objectMapper = new ObjectMapper();
    
        public QQImpl(String accessToken, String appId) {
            // 该语句代码查看继承类的源码得知
            // 默认是把accessToken放入请求头中
            // qqapi的文档确是放在参数中传递的
            super(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER);
            this.appId = appId;
            String url = String.format(URL_GET_OPENID, accessToken);
            //callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );
            String result = getRestTemplate().getForObject(url, String.class);
            System.out.println(result);
            this.openid = StringUtils.substringBetween("\"openid\":", "}");
        }
    
        @Override
        public QQUserInfo getUserInfo() throws IOException {
            String url = String.format(URL_GET_USER_INFO, appId, openid);
            String result = getRestTemplate().getForObject(url, String.class);
            System.out.println(result);
            QQUserInfo qqUserInfo = objectMapper.readValue(result, QQUserInfo.class);
            return qqUserInfo;
        }
    }
    package cn.mrcode.imooc.springsecurity.securitycore.qq.api;
    
    /**
     * qq用户信息:
     * http://wiki.connect.qq.com/get_user_info
     * @author : zhuqiang
     * @version : V1.0
     * @date : 2018/8/6 0:45
     */
    public class QQUserInfo {
    
        /**
         * 返回码
         */
        private String ret;
        /**
         * 如果ret<0,会有相应的错误信息提示,返回数据全部用UTF-8编码。
         */
        private String msg;
        /**
         *
         */
        private String openId;
        /**
         * 不知道什么东西,文档上没写,但是实际api返回里有。
         */
        private String is_lost;
        /**
         * 省(直辖市)
         */
        private String province;
        /**
         * 市(直辖市区)
         */
        private String city;
        /**
         * 出生年月
         */
        private String year;
        /**
         * 用户在QQ空间的昵称。
         */
        private String nickname;
        /**
         * 大小为30×30像素的QQ空间头像URL。
         */
        private String figureurl;
        /**
         * 大小为50×50像素的QQ空间头像URL。
         */
        private String figureurl_1;
        /**
         * 大小为100×100像素的QQ空间头像URL。
         */
        private String figureurl_2;
        /**
         * 大小为40×40像素的QQ头像URL。
         */
        private String figureurl_qq_1;
        /**
         * 大小为100×100像素的QQ头像URL。需要注意,不是所有的用户都拥有QQ的100×100的头像,但40×40像素则是一定会有。
         */
        private String figureurl_qq_2;
        /**
         * 性别。 如果获取不到则默认返回”男”
         */
        private String gender;
        /**
         * 标识用户是否为黄钻用户(0:不是;1:是)。
         */
        private String is_yellow_vip;
        /**
         * 标识用户是否为黄钻用户(0:不是;1:是)
         */
        private String vip;
        /**
         * 黄钻等级
         */
        private String yellow_vip_level;
        /**
         * 黄钻等级
         */
        private String level;
        /**
         * 标识是否为年费黄钻用户(0:不是; 1:是)
         */
        private String is_yellow_year_vip;

开发服务提供商

    package cn.mrcode.imooc.springsecurity.securitycore.qq.connet;
    
    import cn.mrcode.imooc.springsecurity.securitycore.qq.api.QQ;
    import cn.mrcode.imooc.springsecurity.securitycore.qq.api.QQImpl;
    import org.springframework.social.oauth2.AbstractOAuth2ServiceProvider;
    import org.springframework.social.oauth2.OAuth2ServiceProvider;
    import org.springframework.social.oauth2.OAuth2Template;
    
    /**
     * 服务提供商:
     * 官网地址可以获取 authorizeUrl 和 accessTokenUrl
     * http://wiki.connect.qq.com/%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_server-side
     * @author : zhuqiang
     * @version : V1.0
     * @date : 2018/8/6 1:20
     */
    public class QQServiceProvider extends AbstractOAuth2ServiceProvider<QQ> {
        public static final String authorizeUrl = "https://graph.qq.com/oauth2.0/authorize";
        public static final String accessTokenUrl = "https://graph.qq.com/oauth2.0/token";
        private String appId;
    
        /**
         * Create a new {@link OAuth2ServiceProvider}.
         */
        public QQServiceProvider(String appId, String secret) {
            // OAuth2Operations 有一个默认实现类,可以使用这个默认实现类
            // oauth2的一个流程服务
            super(new OAuth2Template(appId, secret, authorizeUrl, accessTokenUrl));
        }
    
        @Override
        public QQ getApi(String accessToken) {
            return new QQImpl(accessToken, appId);
        }
    }

对于social基本概念和原理中的图上右侧的服务提供商的对象已经开发完成


Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。

它的内容包括:

  • 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
  • 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
  • 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
  • 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
  • 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
  • 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
  • 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
  • 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw

目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:

想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询

同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。

阅读全文