Spring Seurity系列(十三) 开发QQ登录(上)

 以下内容中获取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);
	}

}

至此上图的右边部分开发完成。

猜你喜欢

转载自blog.csdn.net/newhanzhe/article/details/81271027
今日推荐