package com.tencent.weibo.oauthv2;
import android.util.Log;
import com.example.ipcplayer.utils.LogUtil;
import com.tencent.weibo.constants.OAuthConstants;
import com.tencent.weibo.exceptions.OAuthClientException;
import com.tencent.weibo.utils.QHttpClient;
import com.tencent.weibo.utils.QStrOperate;
/**
* 工具类 OAuth version 2 认证授权以及签名相关<br>
* 如需自定制http管理器请使用 <pre>OAuthV2Client.setQHttpClient(QHttpClient qHttpClient)</pre> <br>
* 为本工具类指定http管理器
*/
public class OAuthV2Client{
private static String TAG="OAuthV2Client.class";
private static QHttpClient Q_HTTP_CLIENT=new QHttpClient();
private OAuthV2Client(){
}
/**
* 使用Authorization code方式鉴权时,合成转向授权页面的url
*
* @param oAuth
* @return
*/
public static String generateAuthorizationURL(OAuthV2 oAuth) {
oAuth.setResponseType("code");
String queryString = QStrOperate.getQueryString(oAuth.getAuthorizationParamsList());
LogUtil.i(TAG,"authorization queryString = "+queryString);
String urlWithQueryString=OAuthConstants.OAUTH_V2_AUTHORIZE_URL + "?"+queryString;
LogUtil.i(TAG,"url with queryString = "+ urlWithQueryString);
return urlWithQueryString;
}
/**
* 使用Authorization code方式鉴权时,直接将授权码的参数记录到OAuth类中
* @param authorizeCode
* @param openid
* @param openkey
* @param oAuth
* @return
*/
public static boolean setAuthorization(String authorizeCode,String openid,String openkey,OAuthV2 oAuth){
if ((!QStrOperate.hasValue(authorizeCode)) ||
(!QStrOperate.hasValue(openid)) ||
(!QStrOperate.hasValue(openkey))) {
return false;
}
oAuth.setAuthorizeCode(authorizeCode);
oAuth.setOpenid(openid);
oAuth.setOpenkey(openkey);
return true;
}
/**
* 使用Authorization code方式鉴权时,请求用户授权后,解析开放平台返回的参数是否包含授权码等信息
*
* @param responseData 格式:code=CODE&openid=OPENID&openkey=OPENKEY
* @param oAuth
* @return
*/
public static boolean parseAuthorization(String responseData, OAuthV2 oAuth) {
oAuth.setStatus(2);//假设出错
if (!QStrOperate.hasValue(responseData)) {
return false;
}
oAuth.setMsg(responseData);
String[] tokenArray = responseData.split("&");
LogUtil.i(TAG, "parseToken response=>> tokenArray.length = "+tokenArray.length);
if (tokenArray.length < 3) {
return false;
}
String strAuthorizeCode = tokenArray[0];
String strOpenid = tokenArray[1];
String strOpenkey = tokenArray[2];
String[] authorizeCode = strAuthorizeCode.split("=");
if (authorizeCode.length < 2) {
return false;
}
oAuth.setAuthorizeCode(authorizeCode[1]);
String[] openid = strOpenid.split("=");
if (openid.length < 2) {
return false;
}
oAuth.setOpenid(openid[1]);
String[] openkey = strOpenkey.split("=");
if (openkey.length < 2) {
return false;
}
oAuth.setOpenkey(openkey[1]);
oAuth.setStatus(0);//没有出错
return true;
}
/**
* 使用Authorization code方式鉴权时,用授权码换取Access Token
*
* @param oAuth
* @return
* @throws Exception
*/
public static boolean accessToken(OAuthV2 oAuth) throws Exception {
if(null==Q_HTTP_CLIENT){
throw new OAuthClientException("1001");
}
LogUtil.i(TAG, "AuthorizeCode = "+oAuth.getAuthorizeCode()+
"\nOpenid = "+oAuth.getOpenid()+ "\nOpenkey ="+oAuth.getOpenkey());
String url = OAuthConstants.OAUTH_V2_GET_ACCESS_TOKEN_URL;
String queryString = QStrOperate.getQueryString(oAuth.getAccessTokenByCodeParamsList());
LogUtil.i(TAG,"authorization queryString = "+queryString);
String responseData = Q_HTTP_CLIENT.httpGet(url, queryString);
LogUtil.i(TAG,"authorization responseData = "+responseData);
if (!parseAccessToken(responseData, oAuth)) {// Access Token 授权不通过
oAuth.setStatus(3);
return false;
}else{
return true;
}
}
/**
* 使用Implicit grant方式鉴权时,合成转向授权页面的url
* @param oAuth
* @return
*/
public static String generateImplicitGrantUrl(OAuthV2 oAuth){
oAuth.setResponseType("token");
String queryString = QStrOperate.getQueryString(oAuth.getAuthorizationParamsList());
LogUtil.i(TAG,"authorization queryString = "+queryString);
String urlWithQueryString=OAuthConstants.OAUTH_V2_AUTHORIZE_URL + "?"+queryString;
LogUtil.i(TAG,"url with queryString = "+ urlWithQueryString);
return urlWithQueryString;
}
/**
* 得到服务器返回的包含access token等的回应包后,解析存储到OAuth类中
*
* @param responseData 格式:access_token=ACCESS_TOKEN&expires_in=60&name=NAME
* @param oAuth
* @return
*/
public static boolean parseAccessToken(String responseData, OAuthV2 oAuth){
if (!QStrOperate.hasValue(responseData)) {
return false;
}
oAuth.setMsg(responseData);
String[] tokenArray = responseData.split("&");
LogUtil.i(TAG, "parseToken response=>> tokenArray.length = "+tokenArray.length);
if (tokenArray.length < 2) {
return false;
}
String strAccessToken = tokenArray[0];
String strExpiresIn = tokenArray[1];
String[] accessToken = strAccessToken.split("=");
if (accessToken.length < 2) {
return false;
}
oAuth.setAccessToken(accessToken[1]);
String[] expiresIn = strExpiresIn.split("=");
if (expiresIn.length < 2) {
return false;
}
oAuth.setExpiresIn(expiresIn[1]);
return true;
}
/**
* 得到服务器返回的包含access token等的回应包后,解析存储到OAuth类中
*
* @param responseData 格式:access_token=ACCESS_TOKEN&expires_in=60&openid= OPENID &openkey= OPENKEY
* @param oAuth
* @return
*/
public static boolean parseAccessTokenAndOpenId(String responseData, OAuthV2 oAuth){
oAuth.setStatus(3);//假设出错
if (!QStrOperate.hasValue(responseData)) {
return false;
}
oAuth.setMsg(responseData);
String[] tokenArray = responseData.split("&");
LogUtil.i(TAG, "parseToken response=>> tokenArray.length = "+tokenArray.length);
if (tokenArray.length < 4) {
return false;
}
String strAccessToken = tokenArray[0];
String strExpiresIn = tokenArray[1];
String strOpenid = tokenArray[2];
String strOpenkey = tokenArray[3];
String[] accessToken = strAccessToken.split("=");
if (accessToken.length < 2) {
return false;
}
oAuth.setAccessToken(accessToken[1]);
String[] expiresIn = strExpiresIn.split("=");
if (expiresIn.length < 2) {
return false;
}
oAuth.setExpiresIn(expiresIn[1]);
String[] openid = strOpenid.split("=");
if (openid.length < 2) {
return false;
}
oAuth.setOpenid(openid[1]);
String[] openkey = strOpenkey.split("=");
if (openkey.length < 2) {
return false;
}
oAuth.setOpenkey(openkey[1]);
oAuth.setStatus(0);
return true;
}
public static QHttpClient getQHttpClient() {
return Q_HTTP_CLIENT;
}
public static void setQHttpClient(QHttpClient qHttpClient) {
Q_HTTP_CLIENT = qHttpClient;
}
}