package com.taobao.tae.Mshopping.demo.activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.Window; import android.webkit.WebSettings; import android.webkit.WebView; import android.widget.RelativeLayout; import android.widget.TextView; import android.widget.Toast; import com.taobao.api.internal.util.WebUtils; import com.taobao.tae.Mshopping.demo.MshoppingApplication; import com.taobao.tae.Mshopping.demo.R; import com.taobao.tae.Mshopping.demo.constant.Constants; import com.taobao.tae.Mshopping.demo.constant.UmengAnalysis; import com.taobao.tae.Mshopping.demo.login.LoginType; import com.taobao.tae.Mshopping.demo.login.taobao.OAuthWebViewClient; import com.taobao.tae.Mshopping.demo.login.taobao.TopAndroidClient; import com.taobao.tae.Mshopping.demo.login.taobao.AccessToken; import com.taobao.tae.Mshopping.demo.login.taobao.RefreshToken; import com.taobao.tae.Mshopping.demo.login.taobao.TaobaoUser; import com.umeng.analytics.MobclickAgent; import com.umeng.analytics.MobclickAgentJSInterface; import org.json.JSONException; import org.json.JSONObject; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * 淘宝授权登录Activity * Created by xinyuan on 14/7/3. */ public class TaobaoOAuthLoginActivity extends BaseActivity { private TopAndroidClient client; private WebView webView; private OAuthWebViewClient webViewClient; private Bundle bundle; private AccessToken accessToken; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.taobao_login_activity); webView = (WebView) findViewById(R.id.tb_login_oauth_wv); new MobclickAgentJSInterface(this, webView); WebSettings webSettings = webView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setBuiltInZoomControls(true); webView.requestFocus(); webViewClient = new OAuthWebViewClient(); webView.setWebViewClient(webViewClient); TopAndroidClient.registerAndroidClient(this.getApplicationContext(), Constants.TAOBAO_APP_KEY, Constants.TAOBAO_APP_SECRET, ""); client = TopAndroidClient.getAndroidClientByAppKey(Constants.TAOBAO_APP_KEY); InJavaScriptGetSource javaScriptGetSource = new InJavaScriptGetSource(); webView.addJavascriptInterface(javaScriptGetSource, OAuthWebViewClient.jsObjectName); webView.loadUrl(client.getOauthUrl()); addBtnListener(); MobclickAgent.setDebugMode(UmengAnalysis.isOpenAnalyticsDebug); } public void addBtnListener() { RelativeLayout backRelativeLayout = (RelativeLayout) findViewById(R.id.tb_login_top_back_btn); backRelativeLayout.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { finish(); } }); } /** * 内部类 执行用户登录授权 */ public class InJavaScriptGetSource { private String authCode; /** * 通过webview源码,获取授权码 * * @param html */ public void showSource(String html) { if (html.indexOf("授权码获取成功") > 0) { int start = html.indexOf("<p>授权码:") + "<p>授权码:".length(); int end = html.indexOf("</p>"); String result = html.substring(start, end).trim(); authCode = result; getOAuthUserInformation(); } if (html.indexOf("出错") > 0) { Intent intent = new Intent(getApplicationContext(), TaobaoOAuthLoginActivity.class); intent.putExtras(bundle); intent.putExtra("ACTIVITY_NAME_KEY", R.string.title_activity_taobao_login); startActivity(intent); toast("您取消了登录"); } } /** * 获取买家基本信息 */ public void getOAuthUserInformation() { String redirect_url = "urn:ietf:wg:oauth:2.0:oob"; String tbPostSessionUrl = "https://oauth.taobao.com/token"; //获取访问令牌 Map<String, String> param = new HashMap<String, String>(); param.put("grant_type", "authorization_code"); param.put("code", authCode); param.put("client_id", Constants.TAOBAO_APP_KEY); param.put("client_secret", Constants.TAOBAO_APP_SECRET); param.put("redirect_uri", redirect_url); param.put("scope", "item"); param.put("view", "wap"); param.put("state", "1212"); try { int timeout = 30000; String response = WebUtils.doPost(tbPostSessionUrl, param, timeout, timeout); JSONObject ansyJson = new JSONObject(response); String _access_token = ansyJson.getString(AccessToken.KEY_ACCESS_TOKEN); String _access_user_url = "https://eco.taobao.com/router/rest?" + "access_token=" + _access_token + "&method=taobao.user.buyer.get&v=2.0&fields=user_id,nick,sex,birthday,avatar,vip_info&format=json"; String _userJson = WebUtils.doGet(_access_user_url, new HashMap<String, String>()); JSONObject ansyUserJson = new JSONObject(_userJson).getJSONObject("user_buyer_get_response").getJSONObject("user"); //JSON解析 setAccessToken(ansyJson); setTaobaoUser(ansyUserJson); if (bundle != null && R.string.title_activity_item_detail == bundle.getInt("ACTIVITY_NAME_KEY")) { Intent intent = new Intent(getApplicationContext(), ConfirmOrderActivity.class); intent.putExtras(bundle); intent.putExtra("ACTIVITY_NAME_KEY", R.string.title_activity_login); startActivity(intent); } else { Intent intent = new Intent(getApplicationContext(), HomeActivity.class); if (bundle != null) { intent.putExtras(bundle); } intent.putExtra("ACTIVITY_NAME_KEY", R.string.title_activity_taobao_login); startActivity(intent); } } catch (Exception eg) { Log.e("", "OAuth json perse exception." + eg.getMessage()); } } private void setAccessToken(JSONObject ansyJson) { try { RefreshToken refreshToken = new RefreshToken(); refreshToken.setValue(ansyJson.getString(AccessToken.KEY_REFRESH_TOKEN)); refreshToken.setReExpiresIn(ansyJson.getLong(AccessToken.KEY_RE_EXPIRES_IN)); accessToken = new AccessToken(); accessToken.setValue(ansyJson.getString(AccessToken.KEY_ACCESS_TOKEN)); accessToken.setExpiresIn(ansyJson.getLong(AccessToken.KEY_EXPIRES_IN)); accessToken.setStartDate(new Date()); accessToken.setUserId(ansyJson.getLong(AccessToken.KEY_TAOBAO_USER_ID)); accessToken.setTokenType(ansyJson.getString(AccessToken.KEY_TOKEN_TYPE)); accessToken.setRefreshToken(refreshToken); } catch (JSONException eg) { Log.e("", "OAuth json perse exception." + eg.getMessage()); } } private void setTaobaoUser(JSONObject ansyUserJson) { try { TaobaoUser taobaoUser = new TaobaoUser(); taobaoUser.setAvatar(ansyUserJson.getString("avatar")); taobaoUser.setNick(ansyUserJson.getString("nick")); taobaoUser.setAccessToken(accessToken); ((MshoppingApplication) getApplication()).setLoginType(LoginType.TAOBAO.getType()); ((MshoppingApplication) getApplication()).setUser(taobaoUser); } catch (JSONException eg) { Log.e("", "OAuth json perse exception." + eg.getMessage()); } } } /** * 展示一个粉色的Toast * * @param message */ public void toast(String message) { View toastRoot = findViewById(R.layout.toast); Toast toast = new Toast(this); toast.setView(toastRoot); TextView tv = (TextView) toastRoot.findViewById(R.id.pink_toast_notice); tv.setText(message); toast.show(); } public Bundle getBundle() { return bundle; } public void setBundle(Bundle bundle) { this.bundle = bundle; } }