以下内容中获取QQ用户信息以及QQ中的一些参数,请参考QQ互联文档。
/**
* 获取用户信息的接口
* @author zhailiang
*
*/
public interface QQ {
QQUserInfo getUserInfo() throws Exception;
}
/**
* 获取用户信息接口的实现
* 继承
* AbstractOAuth2ApiBinding中accessToken是存放前面5步获取的用户信息的
* 每个用户的用户信息都不相同,因此QQImpl是个多实例的
* 因此不能将此类申明成为Spring的一个组件。
* 需要的时候new就可以了。
*
* 需要的参数:
* appId:注册qq互联分配的appid
* openId:qq用户的Id
* accessToken:父类提供
* @author zhailiang
*
*/
public class QQImpl extends AbstractOAuth2ApiBinding implements QQ {
Logger log = LoggerFactory.getLogger(getClass());
private static final String URL_GET_OPENID = "https://graph.qq.com/oauth2.0/me?access_token=%s";
private static final String URL_GET_USERINFO = "https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s";
private String appId;//注册qq互联分配的appid
private String openId;//qq用户的Id
private ObjectMapper objectMapper = new ObjectMapper();
public QQImpl(String accessToken, String appId) {
//调用父类构造方法时,将accessToken作为查询参数
super(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER);
this.appId = appId;
String url = String.format(URL_GET_OPENID, accessToken);
//getRestTemplate父类提供
String result = getRestTemplate().getForObject(url, String.class);
log.info(result);
this.openId = StringUtils.substringBetween(result, "\"openid\":", "}");
}
@Override
public QQUserInfo getUserInfo() throws Exception {
String url = String.format(URL_GET_USERINFO, appId, openId);
String result = getRestTemplate().getForObject(url, String.class);
log.info(result);
return objectMapper.readValue(result, QQUserInfo.class);
}
}
/**
* QQ用户信息的封装
* @author zhailiang
*
*/
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;
get...
set...
}
/**
* QQServiceProvider
* appId:注册qq互联分配的id
* appSecret:注册qq互联的分配密码
* @author zhailiang
*
*/
public class QQServiceProvider extends AbstractOAuth2ServiceProvider<QQ> {
private String appId;
//将用户导向的认证服务器的地址
private static final String URL_AUTHORIZE = "https://graph.qq.com/oauth2.0/authorize";
//第三方拿着授权码获取Token的地址
private static final String URL_ACCESS_TOKEN = "https://graph.qq.com/oauth2.0/token";
//提供OAuth2Operations
public QQServiceProvider(String appId, String appSecret) {
super(new OAuth2Template(appId, appSecret, URL_AUTHORIZE, URL_ACCESS_TOKEN));
}
//提供Api
@Override
public QQ getApi(String accessToken) {
return new QQImpl(accessToken, appId);
}
}
至此上图的右边部分开发完成。