Android微信第三方登錄(個(gè)人筆記)
今天在寫微信登錄,花了半天時(shí)間搞定、然后寫下自己的筆記,希望幫助更多的人。歡迎各位指教。
微信授權(quán)登錄,官方說的不是很清楚、所以導(dǎo)致有一部分的坑。
微信注冊(cè)應(yīng)用平臺(tái)的應(yīng)用簽名,下載 微信簽名生成工具 輸入項(xiàng)目的packageName也可以查看到。
(注意:debug、Release 一定要區(qū)分,因?yàn)?種生成的微信簽名不一致,會(huì)導(dǎo)致沒有跳轉(zhuǎn)、回調(diào)。。。。一般在微信開發(fā)者上面注冊(cè)的是正式環(huán)境打包好的、)
申請(qǐng)微信開發(fā)者賬號(hào)、應(yīng)用申請(qǐng)省略。
1. AndroidManifest.xml 權(quán)限
<!-- 微信權(quán)限--> <uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.在圖一按鈕上面,加上微信跳轉(zhuǎn)方法、也就是啟動(dòng)微信登錄的方法
private void loginToWeiXin(){ IWXAPI mApi = WXAPIFactory.createWXAPI(this, WXEntryActivity.WEIXIN_APP_ID, true); mApi.registerApp(WXEntryActivity.WEIXIN_APP_ID); if (mApi != null && mApi.isWXAppInstalled()) { SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_demo_test_neng"; mApi.sendReq(req); } else Toast.makeText(this, "用戶未安裝微信", Toast.LENGTH_SHORT).show(); }
3.在你的包名相應(yīng)目錄下新建一個(gè)wxapi目錄,并在該wxapi目錄下新增一個(gè)WXEntryActivity類,該類繼承自Activity
package(項(xiàng)目報(bào)名).wxapi.WXEntryActivity.Java
回調(diào)方法onResp() 方法沒有觸發(fā)回調(diào)、請(qǐng)監(jiān)測(cè)WXEntryActivity onCreate中是否調(diào)用此方法 mApi.handleIntent(this.getIntent(), this);
package com.xxx.xxxx.android.wxapi; /** * 微信登錄頁(yè)面 * @author kevin_chen 2016-12-10 下午19:03:45 * @version v1.0 */ public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private static final String APP_SECRET = "填寫自己的AppSecret"; private IWXAPI mWeixinAPI; public static final String WEIXIN_APP_ID = "填寫自己的APP_id"; private static String uuid; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mWeixinAPI = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID, true); mWeixinAPI.handleIntent(this.getIntent(), this); } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); mWeixinAPI.handleIntent(intent, this);//必須調(diào)用此句話 } //微信發(fā)送的請(qǐng)求將回調(diào)到onReq方法 @Override public void onReq(BaseReq req) { LogUtils.log("onReq"); } //發(fā)送到微信請(qǐng)求的響應(yīng)結(jié)果 @Override public void onResp(BaseResp resp) { LogUtils.log("onResp"); switch (resp.errCode) { case BaseResp.ErrCode.ERR_OK: LogUtils.log("ERR_OK"); //發(fā)送成功 SendAuth.Resp sendResp = (SendAuth.Resp) resp; if (sendResp != null) { String code = sendResp.code; getAccess_token(code); } break; case BaseResp.ErrCode.ERR_USER_CANCEL: LogUtils.log("ERR_USER_CANCEL"); //發(fā)送取消 break; case BaseResp.ErrCode.ERR_AUTH_DENIED: LogUtils.log("ERR_AUTH_DENIED"); //發(fā)送被拒絕 break; default: //發(fā)送返回 break; } } /** * 獲取openid accessToken值用于后期操作 * @param code 請(qǐng)求碼 */ private void getAccess_token(final String code) { String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + WEIXIN_APP_ID + "&secret=" + APP_SECRET + "&code=" + code + "&grant_type=authorization_code"; LogUtils.log("getAccess_token:" + path); //網(wǎng)絡(luò)請(qǐng)求,根據(jù)自己的請(qǐng)求方式 VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() { @Override public void onSuccess(String result) { LogUtils.log("getAccess_token_result:" + result); JSONObject jsonObject = null; try { jsonObject = new JSONObject(result); String openid = jsonObject.getString("openid").toString().trim(); String access_token = jsonObject.getString("access_token").toString().trim(); getUserMesg(access_token, openid); } catch (JSONException e) { e.printStackTrace(); } } @Override public void onError(String errorMessage) { } }); } /** * 獲取微信的個(gè)人信息 * @param access_token * @param openid */ private void getUserMesg(final String access_token, final String openid) { String path = "https://api.weixin.qq.com/sns/userinfo?access_token=" + access_token + "&openid=" + openid; LogUtils.log("getUserMesg:" + path); //網(wǎng)絡(luò)請(qǐng)求,根據(jù)自己的請(qǐng)求方式 VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() { @Override public void onSuccess(String result) { LogUtils.log("getUserMesg_result:" + result); JSONObject jsonObject = null; try { jsonObject = new JSONObject(result); String nickname = jsonObject.getString("nickname"); int sex = Integer.parseInt(jsonObject.get("sex").toString()); String headimgurl = jsonObject.getString("headimgurl"); LogUtils.log("用戶基本信息:"); LogUtils.log("nickname:" + nickname); LogUtils.log("sex:" + sex); LogUtils.log("headimgurl:" + headimgurl); } catch (JSONException e) { e.printStackTrace(); } finish(); } @Override public void onError(String errorMessage) { } }); } }
5.在 AndroidManifest.xml 設(shè)置注冊(cè)微信的頁(yè)面
當(dāng)授權(quán)時(shí)候進(jìn)入WXEntryActivity、當(dāng)前背景可能是黒或白,為了不影響用戶體驗(yàn),可以把當(dāng)前Activity設(shè)置為透明:
android:theme="@android:style/Theme.Translucent"
<!--注冊(cè)微信回調(diào) WXEntryActivity --> <activity android:name=".wxapi.WXEntryActivity" android:exported="true" android:label="@string/app_name" android:launchMode="singleTop" android:theme="@android:style/Theme.Translucent" />
具體可參考:微信授權(quán)登錄取用戶信息步驟
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android第三方登錄之QQ登錄
- Android第三方登錄之騰訊QQ登錄的實(shí)例代碼
- Android實(shí)現(xiàn)第三方登錄的上拉展開,下拉隱藏,下拉隱藏示例
- 微信第三方登錄Android實(shí)現(xiàn)代碼
- Android 第三方登錄、分享(ShareSDK、友盟)
- Android集成新浪微博第三方登錄的方法
- Android實(shí)現(xiàn)第三方授權(quán)登錄、分享以及獲取用戶資料
- Android調(diào)用第三方QQ登錄代碼分享
- React Native第三方平臺(tái)分享的實(shí)例(Android,IOS雙平臺(tái))
- Android實(shí)現(xiàn)QQ的第三方登錄和分享
相關(guān)文章
Android基于高德地圖poi的仿微信獲取位置功能實(shí)例代碼
這篇文章主要介紹了Android基于高德地圖poi的仿微信獲取位置功能,當(dāng)用戶打開頁(yè)面自動(dòng)定位,同時(shí)搜索周邊所有poi,點(diǎn)擊搜索按鈕輸入關(guān)鍵字,獲取關(guān)鍵字搜索結(jié)果,本文圖文并茂給大家介紹的非常詳細(xì),需要的朋友參考下吧2017-12-12Android使用libgdx實(shí)現(xiàn)模擬方向鍵控制角色移動(dòng)的方法
這篇文章主要介紹了Android使用libgdx實(shí)現(xiàn)模擬方向鍵控制角色移動(dòng)的方法,實(shí)例分析了Android中使用libgdx框架實(shí)現(xiàn)響應(yīng)方向鍵的技巧,適用于Android游戲開發(fā)領(lǐng)域,需要的朋友可以參考下2015-12-12Android開發(fā)基礎(chǔ)之創(chuàng)建啟動(dòng)界面Splash Screen的方法
這篇文章主要介紹了Android開發(fā)基礎(chǔ)之創(chuàng)建啟動(dòng)界面Splash Screen的方法,以實(shí)例形式較為詳細(xì)的分析了Android定制啟動(dòng)界面的布局及功能實(shí)現(xiàn)相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10android編程判斷應(yīng)用是否具有某個(gè)權(quán)限的方法
這篇文章主要介紹了android編程判斷應(yīng)用是否具有某個(gè)權(quán)限的方法,涉及Android進(jìn)程操作及權(quán)限控制的相關(guān)使用技巧,需要的朋友可以參考下2015-10-10Android控件CardView實(shí)現(xiàn)卡片效果
這篇文章主要為大家詳細(xì)介紹了Android控件CardView實(shí)現(xiàn)卡片效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-02-02Android開發(fā)之Service用法實(shí)例
這篇文章主要介紹了Android開發(fā)之Service用法,實(shí)例分析了Android中Service的功能及使用技巧,需要的朋友可以參考下2015-05-05強(qiáng)制Android應(yīng)用使用某個(gè)Locale的方法
這篇文章主要介紹了強(qiáng)制Android應(yīng)用使用某個(gè)Locale的方法,涉及Android基于Locale進(jìn)行語言設(shè)置的相關(guān)技巧,需要的朋友可以參考下2015-10-10android 手機(jī)SD卡讀寫操作(以txt文本為例)實(shí)現(xiàn)步驟
要完成SD卡讀寫操作首先對(duì)manifest注冊(cè)SD卡讀寫權(quán)限其次是創(chuàng)建一個(gè)對(duì)SD卡中文件讀寫的類寫一個(gè)用于檢測(cè)讀寫功能的的布局然后就是UI的類了,感興趣的朋友可以參考下,希望可以幫助到你2013-02-02Android權(quán)限操作之uses-permission詳解
這篇文章主要介紹了Android權(quán)限操作之uses-permission,較為詳細(xì)的分析了uses-permission常見權(quán)限操作類型與功能,需要的朋友可以參考下2016-10-10