這里對(duì)于App在微信開放平臺(tái)上申請(qǐng)AppID和secret在這里就略過了码秉,我們微信的授權(quán)登錄流程,騰訊官網(wǎng)給的流程如下:
1. 第三方發(fā)起微信授權(quán)登錄請(qǐng)求祈纯,微信用戶允許授權(quán)第三方應(yīng)用后您觉,微信會(huì)拉起應(yīng)用或重定向到第三方網(wǎng)站铸史,并且?guī)鲜跈?quán)臨時(shí)票據(jù)code參數(shù);
2. 通過code參數(shù)加上AppID和AppSecret等假勿,通過API換取access_token借嗽;
3. 通過access_token進(jìn)行接口調(diào)用,獲取用戶基本數(shù)據(jù)資源或幫助用戶實(shí)現(xiàn)基本操作转培。
下邊我們看看代碼是怎么實(shí)現(xiàn)的恶导。源碼地址
一、加載騰訊SDK
開發(fā)環(huán)境是Android Studio浸须,在build.gradle文件中惨寿,添加如下依賴即可:
dependencies {
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
}
二邦泄、添加網(wǎng)絡(luò)及存儲(chǔ)等授權(quán)
在AndroidManifest.xml中設(shè)置如下權(quán)限:
三、代碼
1裂垦、初始化IWXApi并注冊(cè)到微信
我們這里是在登錄窗口發(fā)起的登錄授權(quán)顺囊,IWXAPI我們是在Application類中聲明創(chuàng)建的,代碼如下:
publicIWXAPIiwxapi;
@Override
public voidonCreate() {
super.onCreate();
this.instance=this;
//利用工廠類獲得IWXAPI實(shí)例
iwxapi= WXAPIFactory.createWXAPI(this,appID,true);// (this, Constants.APP_ID);
//將應(yīng)用的AppID注冊(cè)到微信
iwxapi.registerApp(appID);
//UMShareAPI.get(this);
}
2蕉拢、獲取code
環(huán)境和初始化完成了特碳,按照騰訊登錄流程,首先要獲取code企量,代碼如下:
Button wxSignInButton=(Button) findViewById(R.id.wx_sign_in_button);
wxSignInButton.setOnClickListener(newOnClickListener() {
@Override
public voidonClick(View view) {
finalSendAuth.Req req =newSendAuth.Req();
req.scope="snsapi_userinfo";
req.state="wechat_sdk_demo_test";
GlobalApplication.getInstance().iwxapi.sendReq(req);
}
});
3测萎、創(chuàng)建WXEntryActivity類并獲取Token
WXEntryActivity是騰訊的硬性要求,包名必須為wxapi届巩,我們這里是:packagecom.jxkj.solution.solutionandroid.wxapi硅瞧。WXEntryActivity為Activity子類并且要實(shí)現(xiàn)IWXAPIEventHandler接口,用戶獲得登錄請(qǐng)求后微信返回的結(jié)果恕汇,如果正確會(huì)返回code腕唧。在onResp中返回code后,直接通過HttpGet方法獲得AccessToken瘾英。在onCreate方法中調(diào)用handleIntent方法將接收到的intent及實(shí)現(xiàn)了IWXAPIEventHandler接口的對(duì)象傳遞給IWXAP枣接。
WXEntryActivity在AndroidManifest.xml中的配置:
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"//必須的
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
WXEntryActivity代碼如下:
public classWXEntryActivityextendsActivityimplementsIWXAPIEventHandler{
private static final intRETURN_MSG_TYPE_LOGIN=1;
private static final intRETURN_MSG_TYPE_SHARE=2;
@Override
protected voidonCreate(@NullableBundle savedInstanceState) {
super.onCreate(savedInstanceState);
////必須調(diào)用此句話,否則回調(diào)不起作用
GlobalApplication.getInstance().iwxapi.handleIntent(getIntent(),WXEntryActivity.this);
}
@Override
public voidonReq(BaseReq baseReq) {
switch(baseReq.getType()) {
caseConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
break;
caseConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
break;
default:
break;
}
}
@Override
public voidonResp(com.tencent.mm.opensdk.modelbase.BaseResp baseResp) {
Toast.makeText(this,"baseresp.getType = "+ baseResp.getType(), Toast.LENGTH_SHORT).show();
switch(baseResp.errCode) {
casecom.tencent.mm.opensdk.modelbase.BaseResp.ErrCode.ERR_OK:
switch(baseResp.getType()) {
caseRETURN_MSG_TYPE_LOGIN:
//拿到了微信返回的code,立馬再去請(qǐng)求access_token
String code = ((SendAuth.Resp) baseResp).code;
try{
//獲取access_token為http get請(qǐng)求
String res= OkhttpUtils.getSyncAsString("https://api.weixin.qq.com/sns/oauth2/access_token?appid=AppID&secret=AppSecret&code=";+ code +"&grant_type=authorization_code");
Toast.makeText(this, res, Toast.LENGTH_LONG).show();
}catch(IOException e) {
e.printStackTrace();
}
Toast.makeText(this, code, Toast.LENGTH_LONG).show();
//就在這個(gè)地方,用網(wǎng)絡(luò)庫(kù)什么的或者自己封的網(wǎng)絡(luò)api缺谴,發(fā)請(qǐng)求去咯但惶,注意是get請(qǐng)求
break;
caseRETURN_MSG_TYPE_SHARE:
break;
}
break;
casecom.tencent.mm.opensdk.modelbase.BaseResp.ErrCode.ERR_USER_CANCEL:
break;
casecom.tencent.mm.opensdk.modelbase.BaseResp.ErrCode.ERR_AUTH_DENIED:
break;
casecom.tencent.mm.opensdk.modelbase.BaseResp.ErrCode.ERR_UNSUPPORT:
break;
default:
break;
}
}
}
四、微信登錄湿蛔、分享等一些需要注意的問題
微信第三方登錄膀曾、分享等代碼寫起來不多也不難,但需要遵循騰訊規(guī)定的步驟嚴(yán)格執(zhí)行阳啥,在做的過程有如下問題需要注意:
1添谊、AppID和AppSecret必須和平臺(tái)一致
2、簽名需要保持一致察迟,對(duì)于簽名的生成的問題可以查看文章鏈接地址“Android集成微信分享功能應(yīng)用簽名生成方法及分享不生效的問題”