Android第三方登錄之微信登錄
一、創(chuàng)建應(yīng)用并成為開(kāi)發(fā)者1、創(chuàng)建應(yīng)用1)到微信開(kāi)放平臺(tái)管理中心,點(diǎn)擊“創(chuàng)建移動(dòng)應(yīng)用”2)填寫(xiě)基本的應(yīng)用信息3)填寫(xiě)平臺(tái)信息
這里還是說(shuō)一下怎么獲取應(yīng)用簽名吧:
到“資源中心”-->“資源下載”-->“Android資源下載”,找到“簽名生成工具”下載即可。飛機(jī)直達(dá):Gen_Signature_Android2
將APP進(jìn)行打包安裝到手機(jī)(如果是在IDE中直接運(yùn)行后安裝的話,是使用debug簽名的,跟上線后使用jks文件簽名的不一樣!!!)
給手機(jī)安裝第一步中下載的簽名工具,打開(kāi)后輸入APP的包名(包名是AndroidManifest.xml中package的值),點(diǎn)擊生成,就可以看到應(yīng)用簽名了。
*注意:
簽名工具得到的簽名根你APP的打包步驟有關(guān),默認(rèn)的debug和jks文件簽名,結(jié)果是不一樣,如果app簽名與微信開(kāi)放平臺(tái)的不一樣,將無(wú)法調(diào)出微信登錄界面!!!
4)最后提交,等待審核。(說(shuō)是7天,一般1天后就審核通過(guò)了)2、成為開(kāi)發(fā)者
很簡(jiǎn)單,去“個(gè)人中心”,找到“開(kāi)發(fā)者資質(zhì)認(rèn)證”,點(diǎn)擊“申請(qǐng)”,然后一步步按要示填寫(xiě)信息,最后交錢(qián)就行,300大洋~~
二、微信登錄
當(dāng)審核通過(guò)之后,就可以開(kāi)始使用微信開(kāi)放平臺(tái)提供的功能了。要使用“微信登錄”功能必須成功開(kāi)放者,也就是交了300塊后默認(rèn)開(kāi)通此功能。
在這里可以得到AppId和AppSecret,記下,之后會(huì)用到。如下圖所示:
1、引入微信SDK依賴(lài)1)Android Studio:
在build.gradle的dependencies中加入以下語(yǔ)句
compile?'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:1.0.2'
2)Eclipse(ADT):
去微信開(kāi)放平臺(tái),“資源中心”-->“資源下載”-->“Android資源下載”,找到“開(kāi)發(fā)工具包(SDK)”后下載。飛機(jī)直達(dá):Android_SDK_4.0.2.zip。
解壓后找到lib文件夾,把wechat-sdk-android-with-mta-1.0.2.jar和wechat-sdk-android-without-mta-1.0.2.jar復(fù)制到工程lib文件夾下,rebuild一下。
2、申明應(yīng)用權(quán)限
3、向微信注冊(cè)APP
在自定義的Application的onCreate中調(diào)用registToWX方法:
@Override
public?void?onCreate()?{
????super.onCreate();
????registToWX();
}
private?void?registToWX()?{
????//AppConst.WEIXIN.APP_ID是指你應(yīng)用在微信開(kāi)放平臺(tái)上的AppID,記得替換。
????mWxApi?=?WXAPIFactory.createWXAPI(this,?AppConst.WEIXIN.APP_ID,?false);
????//?將該app注冊(cè)到微信
????mWxApi.registerApp(AppConst.WEIXIN.APP_ID);
}4、調(diào)用微信登錄界面
一般會(huì)在登錄界面會(huì)有一個(gè)微信圖標(biāo),對(duì)微信圖標(biāo)設(shè)置點(diǎn)擊事件,調(diào)用如下方法:
public?void?wxLogin()?{
????if?(!MyApp.mWxApi.isWXAppInstalled())?{
????????UIUtils.showToast("您還未安裝微信客戶(hù)端");
????????return;
????}
????final?SendAuth.Req?req?=?new?SendAuth.Req();
????req.scope?=?"snsapi_userinfo";
????req.state?=?"diandi_wx_login";
????MyApp.mWxApi.sendReq(req);
}至此,就可以調(diào)用微信登錄界面來(lái)進(jìn)行登錄認(rèn)證了。
5、創(chuàng)建WXEntryActivity.java微信接收響應(yīng)
WXEntryActivity是一個(gè)Activity,用來(lái)接收微信的響應(yīng)信息。這里有幾個(gè)需要注意的地方:
它必須在"包名.wxapi"這個(gè)包下,如:你的應(yīng)用包名為:com.lqr.test,則WXEntryActivity所在的包名必須為com.lqr.test.wxapi。
創(chuàng)建后在AndroidManifest.xml文件中對(duì)WXEntryActivity進(jìn)行設(shè)置:android:exported="true"。
WXEntryActivity.Java繼承自Activity,實(shí)現(xiàn)IWXAPIEventHandler接口,該接口即處理微信和app通信的不同event。
以下是一個(gè)示例:
public?class?WXEntryActivity?extends?Activity?implements?IWXAPIEventHandler?{
????private?static?final?int?RETURN_MSG_TYPE_LOGIN?=?1;
????private?static?final?int?RETURN_MSG_TYPE_SHARE?=?2;
????@Override
????protected?void?onCreate(@Nullable?Bundle?savedInstanceState)?{
????????super.onCreate(savedInstanceState);
????????
????????//如果沒(méi)回調(diào)onResp,八成是這句沒(méi)有寫(xiě)
????????MyApp.mWxApi.handleIntent(getIntent(),?this);
????}
????//?微信發(fā)送請(qǐng)求到第三方應(yīng)用時(shí),會(huì)回調(diào)到該方法
????@Override
????public?void?onReq(BaseReq?req)?{
????}
????//?第三方應(yīng)用發(fā)送到微信的請(qǐng)求處理后的響應(yīng)結(jié)果,會(huì)回調(diào)到該方法
????//app發(fā)送消息給微信,處理返回消息的回調(diào)
????@Override
????public?void?onResp(BaseResp?resp)?{
????????LogUtils.sf(resp.errStr);
????????LogUtils.sf("錯(cuò)誤碼?:?"?+?resp.errCode?+?"");
????????switch?(resp.errCode)?{
????????????case?BaseResp.ErrCode.ERR_AUTH_DENIED:
????????????case?BaseResp.ErrCode.ERR_USER_CANCEL:
????????????????if?(RETURN_MSG_TYPE_SHARE?==?resp.getType())?UIUtils.showToast("分享失敗");
????????????????else?UIUtils.showToast("登錄失敗");
????????????????break;
????????????case?BaseResp.ErrCode.ERR_OK:
????????????????switch?(resp.getType())?{
????????????????????case?RETURN_MSG_TYPE_LOGIN:
????????????????????????//拿到了微信返回的code,立馬再去請(qǐng)求access_token
????????????????????????String?code?=?((SendAuth.Resp)?resp).code;
????????????????????????LogUtils.sf("code?=?"?+?code);
????????????????????????//就在這個(gè)地方,用網(wǎng)絡(luò)庫(kù)什么的或者自己封的網(wǎng)絡(luò)api,發(fā)請(qǐng)求去咯,注意是get請(qǐng)求
????????????????????????
????????????????????????break;
????????????????????case?RETURN_MSG_TYPE_SHARE:
????????????????????????UIUtils.showToast("微信分享成功");
????????????????????????finish();
????????????????????????break;
????????????????}
????????????????break;
????????}
????}
}當(dāng)微信授權(quán)第三登錄后,會(huì)自動(dòng)調(diào)用WXEntryActivity的onResp方法,可以在((SendAuth.Resp) resp).code得到“授權(quán)臨時(shí)票據(jù)code”,之后可以通過(guò)code參數(shù)加上AppID和AppSecret等,通過(guò)API換取access_token,再通過(guò)access_token進(jìn)行接口調(diào)用,獲取用戶(hù)基本數(shù)據(jù)資源或幫助用戶(hù)實(shí)現(xiàn)基本操作。
一般會(huì)把獲取access_token步驟(包括之后的操作)放到服務(wù)器那邊,服務(wù)器經(jīng)過(guò)一番處理之后,返回用戶(hù)信息給客戶(hù)端。
三、踩坑經(jīng)驗(yàn)
在app點(diǎn)擊微信圖標(biāo)后,一片空白??!控制臺(tái)打印錯(cuò)誤碼為-6。
原因:
這是因?yàn)閍pp的使用的簽名跟開(kāi)放平臺(tái)的應(yīng)用簽名不一致導(dǎo)致的。
解決方法:
使用簽名工具得到手機(jī)中app的簽名修改開(kāi)放平臺(tái)上的應(yīng)用簽名清除手機(jī)上微信APP的緩存信息(不知道的可以卸載后重裝微信)登錄微信后,再點(diǎn)擊APP的微信登錄圖標(biāo)





