package com.michael.doubanonline.user; import org.apache.http.Header; import com.alibaba.fastjson.JSON; import com.loopj.android.http.AsyncHttpClient; import com.loopj.android.http.AsyncHttpResponseHandler; import com.loopj.android.http.RequestParams; import com.michael.doubanonline.MyApplication; import com.michael.doubanonline.db.DBManager; import com.michael.doubanonline.http.RequestTask; import com.michael.doubanonline.util.L; import com.michael.doubanonline.util.ToastUtil; public class AccountCerfitication { public static final String apiKey = "0e4b060dd9b8b2382ae112298d2a16a8"; public static final String secret = "4c629eddc73f195e"; public static final String callbackMethod = "https://github.com/michaelye/DoubanOnLine.git/"; public static final String result_msg_head = callbackMethod + "back?code="; private DBManager dbManager; public AccountCerfitication() { dbManager = DBManager.getInstance(); } /** * AccessToken过期的时候可以通过这个方法获得新的AccessToken * */ public void getNewAccessTokenByRefreshToken(String refreshToken) { getAccessToken(refreshToken, true); } /** * 根据用户授权码获取AccessToken * */ public void getAccessTokenByAuthorizationCode(String authorization_code) { getAccessToken(authorization_code, false); } private void getAccessToken(String code, boolean isByRefreshToken) { RequestParams params = new RequestParams(); params.put("client_id", apiKey); params.put("client_secret", secret); params.put("redirect_uri", callbackMethod); // params.put("grant_type", "authorization_code"); String key = ""; if(isByRefreshToken) { params.put("grant_type", "refresh_token"); key = "refresh_token"; } else { params.put("grant_type", "authorization_code"); key = "code"; } params.put(key, code); L.e("TOKEN:params:", params+""); AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); asyncHttpClient.setCookieStore(MyApplication.myCookieStore); asyncHttpClient.setTimeout(RequestTask.TIME_OUT); asyncHttpClient.setMaxRetriesAndTimeout(1, RequestTask.TIME_OUT); //这里只能用post!!! asyncHttpClient.post("https://www.douban.com/service/auth2/token?", params, new AsyncHttpResponseHandler() {//这里用get才可以!!!用post提示时间格式错误 @Override public void onStart() { if(onAccessTokenStateListener != null) { onAccessTokenStateListener.onStart(); } } @Override public void onSuccess(int statusCode, Header[] headers, byte[] response) { String result = new String(response); L.e("用户授权:", result); Certification certification = JSON.parseObject(result, Certification.class); if(certification != null) { dbManager.insertCache(DBManager.USER_CERTIFICATION, result); if(onAccessTokenStateListener != null) { onAccessTokenStateListener.onSuccess(certification.getAccess_token()); } } else { ToastUtil.show("数据解析失败"); if(onAccessTokenStateListener != null) { onAccessTokenStateListener.onFailure(); } } } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { if(responseBody != null) { L.e("onFailure:", new String(responseBody)); } else { ToastUtil.show("获取用户授权失败,错误信息为空"); } ToastUtil.show("获取用户授权失败"); if(onAccessTokenStateListener != null) { onAccessTokenStateListener.onFailure(); } } @Override public void onFinish() { if(onAccessTokenStateListener != null) { onAccessTokenStateListener.onFinish(); } } }); } private OnAccessTokenStateListener onAccessTokenStateListener; public void setOnAccessTokenStateListener(OnAccessTokenStateListener onAccessTokenStateListener) { this.onAccessTokenStateListener = onAccessTokenStateListener; } public interface OnAccessTokenStateListener { public void onStart(); public void onSuccess(String accessToken); public void onFailure(); public void onFinish(); } /** * 根据AccessToken获取用户信息 * */ public void getUserInfoByAccessToken(String accessToken) { AsyncHttpClient asyncHttpClient = new AsyncHttpClient(); asyncHttpClient.setCookieStore(MyApplication.myCookieStore); asyncHttpClient.setTimeout(RequestTask.TIME_OUT); asyncHttpClient.setMaxRetriesAndTimeout(1, RequestTask.TIME_OUT); asyncHttpClient.addHeader("Authorization", "Bearer " + accessToken); //注意这里只能用get!!! asyncHttpClient.get("https://api.douban.com/v2/user/~me", null, new AsyncHttpResponseHandler() {//这里用get才可以!!!用post提示时间格式错误 @Override public void onStart() { if(onUserStateListener != null) { onUserStateListener.onStart(); } } @Override public void onSuccess(int statusCode, Header[] headers, byte[] response) { String result = new String(response); L.e("用户信息:", result); UserInfo userInfo = JSON.parseObject(result, UserInfo.class); if(userInfo != null) { ToastUtil.show("恭喜您登录成功~"); dbManager.insertCache(DBManager.USER_INFO, result); if(onUserStateListener != null) { onUserStateListener.onSuccess(userInfo); } } else { ToastUtil.show("数据解析失败"); if(onUserStateListener != null) { onUserStateListener.onFailure(); } } } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { if(responseBody != null) { L.e("onFailure:", new String(responseBody)); } else { ToastUtil.show("获取用户信息失败,错误信息为空"); } ToastUtil.show("获取用户信息失败"); if(onUserStateListener != null) { onUserStateListener.onFailure(); } } @Override public void onFinish() { if(onUserStateListener != null) { onUserStateListener.onFinish(); } } }); } private OnUserStateListener onUserStateListener; public void setOnUserStateListener(OnUserStateListener onUserStateListener) { this.onUserStateListener = onUserStateListener; } public interface OnUserStateListener { public void onStart(); public void onSuccess(UserInfo userInfo); public void onFailure(); public void onFinish(); } }