package com.haitang.dollprint.utils;
import java.text.SimpleDateFormat;
import net.tsz.afinal.FinalHttp;
import net.tsz.afinal.http.AjaxCallBack;
import net.tsz.afinal.http.AjaxParams;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.widget.Toast;
import com.haitang.dollprint.activity.LogoActivity;
import com.haitang.dollprint.thread.HttpPostTask;
import com.haitang.dollprint.thread.InitDataBase;
import com.haitang.dollprint.thread.UserInfoUtils;
import com.haitang.dollprint.utils.TaskService.TaskHandler;
import com.sina.weibo.sdk.auth.AuthInfo;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.openapi.LogoutAPI;
import com.sina.weibo.sdk.openapi.UsersAPI;
import com.sina.weibo.sdk.openapi.models.ErrorInfo;
import com.sina.weibo.sdk.openapi.models.User;
/**
* 微博三方登录
*
* @author wyd 2015.6.8
*/
public class WeiboLoginUtils {
/** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */
/**
* 当前 DEMO 应用的回调页,第三方应用可以使用自己的回调页。
*
* <p>
* 注:关于授权回调页对移动客户端应用来说对用户是不可见的,所以定义为何种形式都将不影响, 但是没有定义将无法使用 SDK 认证登录。
* 建议使用默认回调页:https://api.weibo.com/oauth2/default.html
* </p>
*/
public static final String REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";
/**
* Scope 是 OAuth2.0 授权机制中 authorize 接口的一个参数。通过 Scope,平台将开放更多的微博
* 核心功能给开发者,同时也加强用户隐私保护,提升了用户体验,用户在新 OAuth2.0 授权页中有权利 选择赋予应用的功能。
*
* 我们通过新浪微博开放平台-->管理中心-->我的应用-->接口管理处,能看到我们目前已有哪些接口的 使用权限,高级权限需要进行申请。
*
* 目前 Scope 支持传入多个 Scope 权限,用逗号分隔。
*
* 有关哪些 OpenAPI 需要权限申请,请查看:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
* 关于 Scope 概念及注意事项,请查看:http://open.weibo.com/wiki/Scope
*/
public static final String SCOPE = "all";
/** 登陆认证对应的listener */
public static String TAG = "WeiboLoginUtils";
public AuthInfo mAuthInfo;
/** SSO 授权认证实例 */
public SsoHandler mSsoHandler;
public Activity mActivity;
/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
public Oauth2AccessToken mAccessToken;
public static WeiboLoginUtils sWeiboLoginUtils;
public static String TYPE_LOGIN_WEIBO = "weibo";
/** handler 与登录界面进行交互 */
public TaskHandler mHandler;
public LogOutRequestListener mLogoutListener = new LogOutRequestListener();
public LoginListener mLoginListener = new LoginListener();
/**
* 创建WeiboLoginUtils 单例
*
* @param Activity
* @return
*/
public static synchronized WeiboLoginUtils create(Activity mActivity) {
if (sWeiboLoginUtils == null) {
sWeiboLoginUtils = new WeiboLoginUtils(mActivity);
}
return sWeiboLoginUtils;
}
/** 构造器创建实例对象 */
public WeiboLoginUtils(Activity activity) {
// TODO Auto-generated constructor stub
mActivity = activity;
// 创建授权认证信息
mAuthInfo = new AuthInfo(mActivity,
AppKeyManager.getWeiBoAppKey(activity), REDIRECT_URL, SCOPE);
mSsoHandler = new SsoHandler(mActivity, mAuthInfo);
}
/** 微博 登录方法 */
public void weiboLogin(TaskHandler taskHandler) {
mHandler = taskHandler;
if (null == mAuthInfo) {
mAuthInfo = new AuthInfo(mActivity,
AppKeyManager.getWeiBoAppKey(mActivity), REDIRECT_URL,
SCOPE);
}
if (null == mSsoHandler && mAuthInfo != null) {
mSsoHandler = new SsoHandler(mActivity, mAuthInfo);
}
if (mSsoHandler != null) {
mSsoHandler.authorize(mLoginListener);
Utils.LOGE(TAG, " 执行了授权操作! ");
} else {
Utils.LOGE(TAG, "Please Create mSsoHandler for first");
}
}
/**
* 登出按钮的监听器,接收登出处理结果。(API 请求结果的监听器)
*/
private class LogOutRequestListener implements RequestListener {
@Override
public void onComplete(String response) {
if (!TextUtils.isEmpty(response)) {
try {
JSONObject obj = new JSONObject(response);
String value = obj.getString("result");
if ("true".equalsIgnoreCase(value)) {
Utils.LOGE(TAG, "退出新浪微博登录完成!");
sWeiboLoginUtils = null;
ThridLoginInfoUtils.clear(mActivity,
ThridLoginInfoUtils.sWBlogin);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
@Override
public void onWeiboException(WeiboException e) {
Utils.LOGE(TAG, "退出登录失败!");
}
}
UsersAPI userAPI;
public boolean isAutoLogin = false;
/** 微博自动登录 */
public void AutoLogin() {
isAutoLogin = true;
mAccessToken = readSharePref(mActivity);
if (null != mAccessToken.getToken() && null != mAccessToken.getUid()
&& null != mAccessToken.getRefreshToken()) {
if (mAccessToken.isSessionValid()) {
Utils.LOGE(TAG, "微博自动登录在有效期内!");
getUser();
} else {
// 显示一个token相关信息
showAccessTokenInfo(mAccessToken);
AjaxParams params = new AjaxParams();
params.put("client_id", AppKeyManager.getWeiBoAppKey(mActivity));
params.put("client_secret", "295fe41c6691c39c8a73124d895076a1");
params.put("grant_type", "refresh_token");
params.put("redirect_uri", REDIRECT_URL);
params.put("refresh_token", mAccessToken.getRefreshToken());
String url = "https://api.weibo.com/oauth2/access_token?";
// TaskService.newTask(new HttpPostTask(mActivity, params, url,
// taskHandler));
FinalHttp finalHttp = new FinalHttp();
finalHttp.post(url, params, new AjaxCallBack<Object>() {
@Override
public void onSuccess(Object t) {
Utils.LOGE(TAG, " post请求成功" + t.toString());
JSONObject json;
try {
json = new JSONObject(t.toString());
// 接口调用凭证
mAccessToken.setToken(json
.getString("access_token"));
// access_token接口调用凭证超时时间,单位(秒)
// int expires_in = json.getInt("expires_in");
// 用户刷新access_token
mAccessToken.setRefreshToken(json
.getString("refresh_token"));
// 授权用户唯一标识
mAccessToken.setUid(json.getString("openid"));
// 显示一个token相关信息
showAccessTokenInfo(mAccessToken);
writeSharePref(mAccessToken, mActivity);
getUser();// 获取用户信息
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onFailure(Throwable t, int errorNo,
String strMsg) {
Utils.LOGE(TAG, " post请求失败 " + strMsg);
exitLogin(mActivity);
}
});
}
} else {
Utils.LOGE(TAG, "微博自动登录失败!");
exitLogin(mActivity);
}
}
/** 获取用户信息 */
public void getUser() {
userAPI = new UsersAPI(mActivity,
AppKeyManager.getWeiBoAppKey(mActivity), mAccessToken);
if (mAccessToken != null && mAccessToken.isSessionValid()) {
long uid = Long.parseLong(mAccessToken.getUid());
userAPI.show(uid, mListener);
} else {
Toast.makeText(mActivity, "用户token信息为null", Toast.LENGTH_LONG)
.show();
}
}
/** 微博获取信息监听 */
private RequestListener mListener = new RequestListener() {
@Override
public void onComplete(String response) {
if (!TextUtils.isEmpty(response)) {
// 调用 User#parse 将JSON串解析成User对象
User user = User.parse(response);
if (user != null) {
UserInfoUtils.clearUserInfo(mActivity);
Common.setSPString(mActivity, "login_type",
WeiboLoginUtils.TYPE_LOGIN_WEIBO);
UserInfoUtils.setUserAlreadyBind(mActivity, false);
UserInfoUtils.setUserAlreadyLogin(mActivity, true);
UserInfoUtils.setsUserIconImg(mActivity,
user.profile_image_url);
UserInfoUtils.setNickName(mActivity, user.screen_name);
Utils.LOGE(TAG, "获取User信息成功,用户昵称:" + user.screen_name
+ "获取User信息成功,用户头像:" + user.profile_image_url);
if (null != mHandler) {
mHandler.sendSucessMessage();
}
} else {
ToastUtil.showToast(mActivity, "2:" + response);
}
}
}
@Override
public void onWeiboException(WeiboException e) {
ErrorInfo info = ErrorInfo.parse(e.getMessage());
ToastUtil.showToast(mActivity, "3:" + info.toString());
}
};
/**
* 登入按钮的监听器,接收授权结果。
*/
private class LoginListener implements WeiboAuthListener {
@Override
public void onComplete(Bundle values) {
Utils.LOGE(TAG, "登录微博授权完成!");
mAccessToken = Oauth2AccessToken.parseAccessToken(values);
if (mAccessToken != null && mAccessToken.isSessionValid()) {
String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")
.format(new java.util.Date(mAccessToken
.getExpiresTime()));
String token = values.getString("access_token");
String expires_in = values.getString("expires_in");
String remind_in = values.getString("remind_in");
String uid = values.getString("uid");
showAccessTokenInfo(mAccessToken);
writeSharePref(mAccessToken, mActivity);
getUser();// 获取用户信息
}
}
@Override
public void onWeiboException(WeiboException e) {
Utils.LOGE(TAG, "登录异常" + e.getMessage());
if (!isAutoLogin) {
ToastUtil.showToast(mActivity, e.getMessage() + "");
}
}
@Override
public void onCancel() {
Utils.LOGE(TAG, "取消登录");
if (!isAutoLogin) {
ToastUtil.showToast(mActivity, "取消登录");
}
}
}
/** 将微博信息写入共享存储 */
public static void writeSharePref(Oauth2AccessToken mAccessToken,
Activity activity) {
ThridLoginInfoUtils loginInfoUtils = new ThridLoginInfoUtils();
loginInfoUtils.setAccessToken(mAccessToken.getToken());
loginInfoUtils.setUid(mAccessToken.getUid());
loginInfoUtils.setRefreshToken(mAccessToken.getRefreshToken());
loginInfoUtils.setExpires_In(mAccessToken.getExpiresTime());
loginInfoUtils.setsThridLoginType(ThridLoginInfoUtils.sWBlogin);
ThridLoginInfoUtils.writeAccessToken(activity, loginInfoUtils);
}
/** 读取共享存储中微博信息 */
public static Oauth2AccessToken readSharePref(Activity activity) {
ThridLoginInfoUtils loginInfoUtils = ThridLoginInfoUtils
.readThridLoginInfo(activity, ThridLoginInfoUtils.sWBlogin);
Oauth2AccessToken accessToken = new Oauth2AccessToken();
accessToken.setToken(loginInfoUtils.getAccessToken());
accessToken.setUid(loginInfoUtils.getUid());
accessToken.setRefreshToken(loginInfoUtils.getRefreshToken());
accessToken.setExpiresTime(loginInfoUtils.getExpires_In());
Utils.LOGE(TAG, "Token = " + accessToken.getToken());
Utils.LOGE(TAG, "RefreshToken = " + accessToken.getRefreshToken());
Utils.LOGE(TAG, "Uid = " + accessToken.getUid());
return accessToken;
}
/** 退出微博登录 */
public static void exitLogin(Activity activity) {
// WeiboLoginUtils.create(activity).logout(activity);
ToolUtil.clearUserLocalDate(activity);
ThridLoginInfoUtils loginInfoUtils = ThridLoginInfoUtils
.readThridLoginInfo(activity, ThridLoginInfoUtils.sWBlogin);
Oauth2AccessToken accessToken = new Oauth2AccessToken();
accessToken.setToken(loginInfoUtils.getAccessToken());
accessToken.setUid(loginInfoUtils.getUid());
new LogoutAPI(activity, AppKeyManager.getWeiBoAppKey(activity),
accessToken)
.logout(WeiboLoginUtils.create(activity).mLogoutListener);
}
/** 接收activity的回传值 */
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mSsoHandler != null) {
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
/** 展示用户授权的信息 token uid refreshToken */
public void showAccessTokenInfo(Oauth2AccessToken accessToken) {
Utils.LOGE(TAG, "\nRefreshToken = " + accessToken.getRefreshToken()
+ "\nToken = " + accessToken.getToken() + "\nUID = "
+ accessToken.getUid());
}
}