使用Android開發(fā)接入第三方原生SDK實(shí)現(xiàn)微信登錄
微信開放平臺(tái) : https://open.weixin.qq.com/
一、準(zhǔn)備工作 :
1. Android Studio環(huán)境下:在build.gradle文件中,添加如下依賴即可:
dependencies { implementation'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' }
2. 在清單文件AndroidManifest.xml中加入權(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"/>
二、接入 :
1. 注冊(cè)微信:
想要使我們的程序啟動(dòng)之后,微信終端可以響應(yīng)我們我們的程序的話.就必須在代碼中像微信終端注冊(cè)我們的id
(可以在程序的入口Activity的OnCreat中注冊(cè),也可以在MyApplication中,或者是在其他合適的地方將我們的應(yīng)用id注冊(cè)到微信),此處在Application中:
// 1.聲明一個(gè)statid的IWXAPI 以及APPID private static IWXAPI mWxApi; private String WX_APPID = ""; // 2.初始化微信SDK mWxApi = WXAPIFactory.createWXAPI(this, WX_APPID, true); mWxApi.registerApp(WX_APPID);
2. 發(fā)起登錄
if (BaseApplication.mWxApi!= null && BaseApplication.mWxApi.isWXAppInstalled()) { final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "wechat_sdk_fth"; BaseApplication.mWxApi.sendReq(req); } else { Toast.makeText(LoginActivity.this, "您還沒有安裝微信", Toast.LENGTH_SHORT).show(); }
3. 新建一個(gè)包 包名為wxapi,新建一個(gè)類名為WXEntryActivity的類,這個(gè)類名和包名是微信規(guī)定的,木有辦法,必須一致了
然后在清單文件AndroidManifest.xml中聲明該類:
<!-- 注冊(cè)微信回調(diào) WXEntryActivity --> <activity android:name=".wxapi.WXEntryActivity" android:configChanges="keyboardHidden|orientation|screenSize" android:exported="true" android:screenOrientation="portrait" android:theme="@style/NoTitleTranslucentTheme"> </activity>
4. WxEntryActivity類代碼如下:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler { private Bundle bundle; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); BaseApplication. mIwapi.handleIntent(getIntent(), WXEntryActivity.this); //必須調(diào)用此句話 } @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); BaseApplication. mIwapi.handleIntent(intent, WXEntryActivity.this);//必須調(diào)用此句話 } @Override public void onReq(BaseReq req) { System. out.println(); } /** * API:https://open.weixin.qq.com/ cgi- bin/showdocument ?action=dir_list&t=resource/res_list&verify=1&id=open1419317853 &lang=zh_CN * 在此處得到Code之后調(diào)用https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 獲取到token和openID。 * 之后再調(diào)用https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID 獲取用戶個(gè)人信息 */ @Override public void onResp(BaseResp arg0) { bundle=getIntent().getExtras(); SendAuth.Resp resp = new SendAuth.Resp( bundle); //獲取到code之后,需要調(diào)用接口獲取到access_token if (resp. errCode == BaseResp.ErrCode. ERR_OK) { String code = resp. token; if(BaseApplication. isWxLogin){ getToken(code); } else{ WXEntryActivity. this.finish(); } } else{ WXEntryActivity. this.finish(); } } //這個(gè)方法會(huì)取得accesstoken 和openID private void getToken(String code){ MyProgressDialog. showDialog(WXEntryActivity.this, "登陸", "正在獲取用戶信息" ); HttpBase. get("https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxd7673d08f6c1963d&secret=223d726f966031f30125d0e4e7d4aed3&code=" +code+"&grant_type=authorization_code" , new JsonHttpResponseHandler(){ @Override public void onSuccess( int statusCode, JSONObject response) { super.onSuccess(statusCode, response); getUserInfo(response.optString( "access_token"),response.optString( "openid")); } @Override public void onFailure( int statusCode, Throwable e, JSONObject errorResponse) { // TODO Auto-generated method stub super.onFailure(statusCode, e, errorResponse); MyProgressDialog. closeDialog(); } }); } //獲取到token和openID之后,調(diào)用此接口得到身份信息 private void getUserInfo(String token,String openID){ HttpBase. get("https://api.weixin.qq.com/sns/userinfo?access_token=" +token+"&openid=" +openID, new JsonHttpResponseHandler(){ @Override public void onSuccess( int statusCode, JSONObject response) { super.onSuccess(statusCode, response); try { String nickname = response.getString("nickname");//獲取用戶微信名 String sex = response.getInt("sex") == 1 ? "男" : "女";//獲取用戶性別 String header = response.getString( "headimgurl");//獲取用戶頭像 } catch (JSONException e) { e.printStackTrace(); } } @Override public void onFailure( int statusCode, Throwable e, JSONObject errorResponse) { super.onFailure(statusCode, e, errorResponse); MyProgressDialog. closeDialog();//隱藏dialog HttpBase. onFailureTips(WXEntryActivity.this, errorResponse); } }); } }
到這里就歐克了!
補(bǔ)充知識(shí):Android接入微信sdk,使用微信授權(quán)
接入微信sdk,進(jìn)行授權(quán),第一個(gè)最基本也是最重要的步驟,需要注意應(yīng)用的包名、應(yīng)用簽名(如果不知道的可以使用新浪簽名工具查看,或者微信提供的工具),app id (微信申請(qǐng)成功之后可以獲得) 三者必須要與微信上申請(qǐng)的一致,否者將會(huì)無法成功調(diào)起微信。
1、在自己的項(xiàng)目上創(chuàng)建一個(gè)按鈕
2、新建一個(gè)Constans.java的類,存放微信支付相關(guān)的參數(shù)
public class Constants { public static final String APP_ID = "wxxxxxxx"; //替換為申請(qǐng)到的app id }
3、在MyApplication.java類里面進(jìn)行實(shí)例化
4、在登錄頁面注冊(cè)點(diǎn)擊事件 , 跳轉(zhuǎn)微信授
scope 因?yàn)槭谦@取用戶個(gè)人信息所以固定填 snsapi_userinfo
state 可填可不填的參數(shù),按官方建議最好填寫,可用于防止csrf攻擊(跨站請(qǐng)求偽造攻擊)
5、這時(shí)候就可以調(diào)起微信授權(quán)了,但是如果需要得到微信返回的結(jié)果,還需要以下的步驟
1)在包名下新增wxapi文件夾(這個(gè)文件夾名字是微信官方規(guī)定的,必須一致)
2)在wxapi文件夾下新增繼承于Activity并實(shí)現(xiàn)IWXAPIEventHandler接口的WXEntryActivity類(這個(gè)類名是微信官方規(guī)定的,必須一致)
if(baseResp instanceof SendAuth.Resp){ SendAuth.Resp newResp = (SendAuth.Resp) baseResp; //獲取微信傳回的code final String code = newResp.code; }
獲得的code就是微信授權(quán)成功后給的臨時(shí)票據(jù),可以根據(jù)code獲取相關(guān)的用戶 access_token 和 openid , 然后根據(jù) access_token 和 openid 獲取用戶信息
6、在AndroidManifest.xml中對(duì)WXEntryActivity進(jìn)行配置
1)增加權(quán)限
2)增加WXEntryActivity的配置
其中android:exported="true" 必須加上,否則無法接收回調(diào)
7、編譯生成運(yùn)行,即可發(fā)起微信登錄并得到微信返回。
如果還是不行,注意是否以下問題引起:
1)app id是否正確?
2)包名是否和申請(qǐng)時(shí)填寫的一致?
3)應(yīng)用簽名是否和申請(qǐng)時(shí)填寫的一致?(可以用簽名生成工具對(duì)比一下)通??赡馨l(fā)生的情況是,申請(qǐng)用的簽名包,調(diào)試用的非簽名包,這種情況很常見。
4)WXEntryActivity.java文件的位置是否正確
5)AndroidManifest.xml中的配置是否正確?
6)公眾號(hào)、移動(dòng)應(yīng)用之間統(tǒng)一帳號(hào)的話,可利用unionID來滿足需求,因?yàn)槲⑿欧祷氐膐penid是根據(jù)app id 進(jìn)行生成的,這樣就導(dǎo)致了如果是H5授權(quán)那么和Android得到的id不一致
最后附上微信開放平臺(tái)官方地址:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN
以上這篇使用Android開發(fā)接入第三方原生SDK實(shí)現(xiàn)微信登錄就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Android與iOS包體優(yōu)化及一鍵自動(dòng)打包腳本
這篇文章主要為大家介紹了安卓與iOS包體優(yōu)化及一鍵自動(dòng)打包腳本詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09Android MediaPlayer 音頻倍速播放 調(diào)整播放速度問題
這篇文章主要介紹了Android MediaPlayer 音頻倍速播放,調(diào)整播放速度,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09Android內(nèi)存溢出及內(nèi)存泄漏原因進(jìn)解析
這篇文章主要介紹了Android內(nèi)存溢出及內(nèi)存泄漏原因解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Android實(shí)現(xiàn)移動(dòng)小球和CircularReveal頁面切換動(dòng)畫實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于利用Android如何實(shí)現(xiàn)移動(dòng)的小球和CircularReveal頁面切換動(dòng)畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。2017-09-09Android?上實(shí)現(xiàn)DragonBones換裝功能
這篇文章主要介紹了Android?上實(shí)現(xiàn)DragonBones換裝功能,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下2022-06-06Android學(xué)習(xí)筆記之應(yīng)用單元測試實(shí)例分析
這篇文章主要介紹了Android學(xué)習(xí)筆記之應(yīng)用單元測試,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android單元測試的實(shí)現(xiàn)原理與具體步驟,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11Android使用Sensor感應(yīng)器實(shí)現(xiàn)線程中刷新UI創(chuàng)建android測力計(jì)的功能
這篇文章主要介紹了Android使用Sensor感應(yīng)器實(shí)現(xiàn)線程中刷新UI創(chuàng)建android測力計(jì)的功能,實(shí)例分析了Android使用Sensor感應(yīng)器實(shí)現(xiàn)UI刷新及創(chuàng)建測力器的技巧,需要的朋友可以參考下2015-12-12基于RxJava框架實(shí)現(xiàn)獲取驗(yàn)證碼的輔助類
這篇文章主要為大家詳細(xì)介紹了基于RxJava框架實(shí)現(xiàn)獲取驗(yàn)證碼的輔助類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06Android ScrollView實(shí)現(xiàn)向上滑動(dòng)控件頂部懸浮效果
這篇文章主要為大家詳細(xì)介紹了Android ScrollView實(shí)現(xiàn)向上滑動(dòng)控件頂部懸浮效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05