第三方之聯合登陸(微信)
阿新 • • 發佈:2019-02-02
前言 App聯合登陸很常用,包括使用qq、微信、微博賬號登陸等,這篇記錄下微信登陸的接入流程。 接入流程
1:申請開發者
2:整合程式碼
1.匯入libammsdk.jar的jar包
2.初始化IWXAPI
// 通過WXAPIFactory工廠,獲取IWXAPI的例項 api = WXAPIFactory.createWXAPI(this, G.AppId_WX,true); 3.傳送認證請求
if( !api.isWXAppInstalled()){ Toast.makeText(context, "請先安裝微信應用", Toast.LENGTH_SHORT).show(); return false; } if(!api.isWXAppSupportAPI() ){ Toast.makeText(context, "請先更新微信應用", Toast.LENGTH_SHORT).show(); return false; } // 將應用的APPID註冊到微信 api.registerApp(Constant.WX_APP_ID); final SendAuth.Req req = newSendAuth.Req(); req.scope = Constant.WX_APP_SCOPE; req.state = Constant.WX_APP_STATE; api.sendReq(req);
4.調起微信授權
調起微信客戶端讓使用者進行授權,使用者進行操作後會調起...wxapi.WXEntryActivity 這個類,..是應用包名,這個WXEntryActivity需要繼承Activity並且實現IWXAPIEventHandler介面,當然,這個WXEntryActivity也需要在清單檔案中註冊
<activity android:name="**.**.**.wxapi.WXEntryActivity" android:exported="true" android:label="@string/app_name" android:launchMode="singleTop" android:screenOrientation="portrait" > <intent-filter> <actionandroid:name="android.intent.action.VIEW" /> <categoryandroid:name="android.intent.category.DEFAULT" /> <dataandroid:scheme="sdksample" /> </intent-filter> </activity>
5.獲取微信回撥資訊
WXEntryActivity先實現IWXAPIEventHandler,然後實現3個方法一個onNewIntent、onReq、onResp在onResp得到code,然後在通過code獲取openid和access_token,然後根據這兩個引數調自己系統後臺,判斷是該使用者登入過
public classWXEntryActivity extends Activityimplements IWXAPIEventHandler{ privateIWXAPIapi; String openid,access_token,expires_in; ContextthisContext; Intentintent; Handlerhandler= newHandler(){ @Override public void handleMessage(Messagemsg) { // TODO Auto-generated method stub super.handleMessage(msg); JSONObjectjsonObject = (JSONObject) msg.obj; switch (msg.what) { case 1: try { openid = jsonObject.getString("openid"); access_token =jsonObject.getString("access_token"); requestCodeApiData(); }catch(JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } break; default: break; } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); thisContext = this; intent = getIntent(); setContentView(R.layout.activity_wx_entry); api = WXAPIFactory.createWXAPI(this, Constants.APP_ID); api.handleIntent(getIntent(),this); } @Override protected void onNewIntent(Intentintent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent,this); } @Override public void onReq(BaseReq req) { finish(); } @Override public void onResp(BaseResp resp) { switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: System.out.println("0000"); Stringcode = ((SendAuth.Resp) resp).code;//即為所需的code System.out.println("code:"+code); doGet(((SendAuth.Resp)resp).code); break; case BaseResp.ErrCode.ERR_AUTH_DENIED: System.out.println("使用者拒絕授權"); break; case BaseResp.ErrCode.ERR_USER_CANCEL: System.out.println("使用者取消"); break; default: break; } } public void doGet(final String code){ new Thread(){ @Override public void run() { // TODO Auto-generated method stub URL url; String link = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+G.AppId_WX+"&secret="+G.AppScrect+"&code="+code+"&grant_type=authorization_code"; byte[] buf = Util.httpGet(link); if (buf !=null && buf.length > 0) { Stringcontent = newString(buf); JSONObject json = JSONObject.parseObject(content); Messagemessage = newMessage(); message.obj = json; message.what = 1; handler.sendMessage(message); } } }.start(); } }
小心有坑:在獲取code時候微信後臺返回{“errcode”:40029,”errmsg”:”invalidcode”},我那時獲取不到微信返回的json,就將獲取的url在logcat上列印,然後放瀏覽器裡面一直返回時{“errcode”:40029,”errmsg”:”invalidcode”},查了半天,發現是其他地方錯了,再一個就是微信的同一個code,只請求了一次,我在瀏覽器上請求相當於多次了就出現了{“errcode”:40029,”errmsg”:”invalidcode”}