常用微信整合(第三方sdk整合套路)-- 微信登入
序言
程式開發過程中,總歸是會用到第三方sdk的,這裡就常用的登入、分享、支付做一個整合方法上的綜述,以備引申至通用的sdk使用方法。
一般的,sdk在登入、分享、支付上,都會按照如下的流程進行:
包裝請求(req)--> 傳送請求 --> 處理請求
這麼說雖然非常籠統,但是大致流程便是如此,只是各自的sdk在這一過程中實現的方式可能有所差別。所以,整合第三方sdk,並不是特別的難。
登入
(1). 登入開始
第三方登入,通常是先登入第三方的客戶端,並通過此步獲取使用者登入資料,再用所獲取的登入資訊封裝成本App的登入資料,傳送至本客戶端的登入介面Api來實現登入的。
具體如下:
/** 1.微信登陸開始 */
public void loginStart(Context context) {
MessageManager.showProgressDialog((Activity) context, "微信登入中...");
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
IWXAPI iwxapi = WXAPIFactory.createWXAPI(context, Constants.WX.APP_ID, true );
iwxapi.registerApp(FirstPageConstants.WX.APP_ID);
iwxapi.sendReq(req);
}
這個方法在開啟微信登入的Activity中呼叫,標誌著微信登入開始。微信登陸,在資料返回處理上,本質是通過WXEntryActivity的OnActivityResult來處理的,只不過sdk將此流程做了封裝。
(2). 登入返回結果處理
想要獲取微信的結果,我們就需要在App程式碼根目錄下,建立wxapi包,並在其中建立WXEntryActivity,實現IWXAPIEventHandler介面。該介面提供onResp和onReq兩個方法做結果處理。我們需要做的,就是在結果返回時,通知微信去呼叫這onResp方法。
剛才也說過了,微信對登入請求的處理是通過OnActivityResult。所以這裡我們有:
/** 2.微信登入返回結果處理 */
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
mWechatApi.handleIntent(intent, this);
}
@Override
public void onReq(BaseReq req) {
}
@Override
public void onResp(BaseResp resp) {
handleLoginResponse(resp);
}
經過如上操作後,我們在WXEntryActivity的onResp中便得到了需要的微信登陸返回結果。這裡,我在自定義的handleLoginResponse方法中進行了處理。
/** 處理微信登陸響應結果 */
private void handleLoginResponse(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
loginByWX(((SendAuth.Resp) resp).code);
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
MessageManager.closeProgressDialog();
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED: {
MessageManager.showDialog((Activity) context, 0, "登陸提示", "登陸失敗,請求微信失敗!", null, false);
}
break;
}
}
(3). 呼叫App的登入流程
在資料齊全,並檢測後,我們就可以安全的呼叫App的登入流程啦:
/** 3.響應處理:登陸成功,蒐集資訊跳轉登入App */
private void loginByWX(final String code) {
new AsyncTask<Integer, Void, WXUsersInfo>() {
@Override
protected WXUsersInfo doInBackground(Integer... params) {
MessageManager.showProgressDialog((Activity) context, "登入中...");
WXTokenInfo token = mLoginRepository.getWechatToken(code);
WXUsersInfo muser = mLoginRepository.getWeChatUserInfo(token);
return muser;
}
@Override
protected void onPostExecute(WXUsersInfo result) {
super.onPostExecute(result);
dealLoginResult(result);
}
}.execute();
}
這裡的話,我的App內登入邏輯是在dealLoginResult方法裡實現的,因為每個App的登入流程不太一樣,這裡就不寫了。不過微信的登入流程,到這裡其實已經結束了,剩餘的部分其實本質上就是Android程式設計者自己去處理了(資料什麼都有了,流程也封裝好了,表告訴我你不會。。)。