眾所周知,移動互聯網在這幾年經歷了蓬勃發展,到目前為止,移動互聯網發展仍然很強勁。其中移動設備系統以android占據主導地位,之前是加拿大的黑莓系統占據主導,但后來隨着android系統的問世,黑莓手機操作系統逐漸被android蠶食,目前,全球最為流行的移動操作系統有Google公司的android、蘋果(Apple)公司的ios、微軟(Microsoft)公司的windows Phone,以上三者形成手機操作系統三足鼎立之勢,其中Google的android占據市場的百分之六十幾的份額,蘋果(Apple)占據百分之十八點幾的份額,而微軟(Microsoft)的Windows Phone占據全球僅僅只有百分之三點幾的份額,好了,我們開始進入正題吧。
隨着3G手機的廣泛普及,移動應用開始了井噴式的發展,這些移動應用公司如雨后春筍越來越多,一些剛剛起來的小公司開發的應用(大部分一些電商、社交等之類的)為了提高其知名度,不得不依附大公司的龐大的用戶群來進行推廣,比如像騰訊(Tencent),新浪(sina),人人網,臉譜網(Facebook)等,這些公司提供接口API供開發者調用。今天呢,我要說的就是新浪登錄,至於我為什么要說新浪,是因為新浪寫的接口文檔太可惡了,走了不少彎路,為了大家少走彎路,我決定寫這篇博文,如果寫的不好,請批評指正。
要想在移動應用上使用sina登錄,第一步需要注冊成為開發者,說白了,就是一個新浪微博帳號,如果有了的話,就不要注冊了,直接登錄即可,那么在那里去注冊成為開發者呢?下面的圖會告訴你:在地址欄中輸入 t.sina.com.cn --> 它會要求你登錄(如果沒登錄)

經過以上第一步,我們進入了新浪的開放平台,如圖:

第三步,創建應用,獲得授權資格,這里需要你去填寫一些重要的信息,這些東西在以后會用到,如圖(創建應用):

第四步,當我們點擊了創建應用,你需要填寫以下信息,如圖:

好了,現在剩下最后一步了,填寫完以上信息之后,提交信息,完了,此時還還會有些信息需要你填寫,例如,回調地址,其實就是網站地址,可填新浪默認的,如果你自己有的話,也可以填寫你自己的網站地址,如圖:

記住,以上畫紅線部分,千萬不要泄露出去,因為會對公司造成安全隱患,特別是Android簽名、App Secret,如果App Secret不小心泄露出去的話,你可以點擊該條目,進入編輯頁,進行重置,其中android簽名是根據新浪提供的一個app_signatures.apk生成的一串MD5加密字符串,然后填上去,就哦了!下面是一個示例,還要記住的是,要想使用此工具生成一串MD5加密字符串,那你就必須將該應用安裝到你的手機上,因為該MD5加密字符串是根據包名及xx.keystore生成的,Eclipse集成開發工具Run as 所使用的是debug.keystore 所以當你在發布你的APP的時候,一定要根據你自己公司的 .keystore 生成MD5加密字符串填到android簽名哪一項上去,如果你填的是你通過Eclipse集成開發工具中的Run as 安裝到手機上去的debug.keystore生成的MD5加密字符串的話,那么會導致無法授權登錄問題產生。所以,一旦你要發布APP時,一定要更正回來,一般來說,一個公司keystore只有一份,根據報名產生的MD5加密字符串效果圖如下:

哦,對了,在最后一步我們提到了回調地址,那么該回調地址有什么用呢?該回調地址相對用戶來說是不可見的,這個回調地址是用來生成accessToken的,通過這個accessToken可以去請求接口,獲得相關用戶的信息。帶回一張圖就可以讓你明白,我上面所提到字段的意思。如圖:

完了,這就是新浪登錄的過程,下面貼上一段代碼,第三方登錄的代碼,這里有一個請求接口的類,我覺得吧他寫成內部類更好一點,因為這樣可以更好的傳數據。特別提一點,我使用的SSO登錄,我相信,Oauth2.0 認證應該是一樣的吧。
新浪微博SDK下載:http://open.weibo.com/wiki/SDK
代碼:
public class LoginActivity extends BaseActivity implements OnClickListener { public static final int END_SINA = 2; private RelativeLayout third_party_login_xinlang; public String TAG = "LoginActivity---->"; public static Oauth2AccessToken accessToken; private Weibo mWeibo; private SsoHandler mSsoHandler; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { case END_SINA: Log.v(TAG, "sina data loded!!"); isAlreadExist(LoginActivity.loginType); break; default: break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.login); initViews(); initData(); } private void initData() {// 新浪微博實例 mWeibo = Weibo.getInstance(ConstantS.APP_KEY, ConstantS.REDIRECT_URL, TAG); } private void initViews() { third_party_login_xinlang.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.third_party_login_xinlang: isThreeLogin("1"); isSinaLogin(); break; } } /** * 新浪登錄 */ private void isSinaLogin() { mSsoHandler = new SsoHandler(this, mWeibo); mSsoHandler.authorize(new AuthDialogListener(), null); } /** * 新浪回調 * * @author Administrator * */ private class AuthDialogListener implements WeiboAuthListener { @Override public void onCancel() { } @Override public void onComplete(Bundle values) { String token = values.getString("access_token"); String expires_in = values.getString("expires_in"); final String idstr = values.getString("uid"); LoginActivity.accessToken = new Oauth2AccessToken(token, expires_in); if (LoginActivity.accessToken.isSessionValid()) { String date = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss") .format(new java.util.Date(accessToken.getExpiresTime())); AccessTokenKeeper.keepAccessToken(LoginActivity.this, accessToken); } new Thread(new Runnable() { @Override public void run() { UserApi userApi = new UserApi(accessToken); userApi.show(idstr, new SinaRequestListener()); } }).start(); } @Override public void onError(WeiboDialogError arg0) { } @Override public void onWeiboException(WeiboException arg0) { } } /** * 新浪請求接口 * * @author Administrator * */ private class SinaRequestListener implements RequestListener { @Override public void onComplete(String response) { JsonUtil jsonUtil = new JsonUtil(); JSONObject jsonObject = jsonUtil.getJsonObject(response); try { Message msg = Message.obtain(); String idstr = jsonObject.getString("idstr");// 唯一標識符(uid) String name = jsonObject.getString("name");// 姓名 String avatar_hd = jsonObject.getString("avatar_hd");// 頭像 userModel.setUid(idstr); userModel.setNickname(name); userModel.setAvatar(avatar_hd); msg.what = END_SINA; handler.sendMessage(msg); } catch (Exception e) { e.printStackTrace(); } } @Override public void onComplete4binary(ByteArrayOutputStream arg0) { } @Override public void onError(WeiboException arg0) { } @Override public void onIOException(IOException arg0) { } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (mSsoHandler != null) { mSsoHandler.authorizeCallBack(requestCode, resultCode, data); } } }
