android實現(xiàn)微信聯(lián)合登錄開發(fā)示例
隨著現(xiàn)在社交app的越來越普及,微信,QQ,微博幾乎成了我們每個人的手機必備,而且第三方應(yīng)用也越來越多,不是每個用戶都想為你的應(yīng)用注冊一個獨立帳號的,所以聯(lián)合登錄也就顯得尤為重要,成了我們不得不掌握的開發(fā)要點,但你要用微信等帳號實現(xiàn)聯(lián)合登錄,人家也有要求,就是你必須遵守OAuth2.0協(xié)議標(biāo)準(zhǔn)(https://oauth.net/2/)就行。
接下來我們就以android studio為平臺,介紹下接入微信的整個流程:
那么在接入之前,我們還有一些準(zhǔn)備工作要做:
1):登錄微信開放平臺,完成賬號申請:https://open.weixin.qq.com
2):提交app完成審核,并開通相應(yīng)權(quán)限:

在提交app完成審核的過程中,我們需要提供app的包名與簽名:
包名就是我們創(chuàng)建app時候的名稱,可以通過manifest.xml和build.gradle中查看,如在manifest.xml中:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yeejay.reader" > ...
在build.gradle中:
defaultConfig {
applicationId "com.yeejay.reader"
...
}
如果manifest.xml與build.gradle中不一致,將以build.gradle中的聲明為準(zhǔn):
應(yīng)用簽名的獲取會有一些麻煩,因為我們需要通過簽名工具對我們的應(yīng)用進行簽名,如果不進行簽名,每次安裝apk時android平臺會為我們生成默認簽名,由于平臺的不一致性,導(dǎo)致我們的apk裝到不同的手機上簽名不一致,最后導(dǎo)致無法正常使用微信登錄與分享功能,所以我們要提前做好統(tǒng)一簽名,整個簽名流程如下:
(1)點擊 build ---> Generate Signed Apk... ---> 選擇app module ---> 填寫生成keystore.jks的目錄,密鑰,有效期等信息;
(2)將生成的keystore.jks文件拷貝到project目錄下的app目錄下;
(3)在build.gradle文件中進行配置,代碼如下:
signingConfigs {
release {
storeFile file('keystore.jks')
storePassword 'xxx'
keyAlias 'xxx'
keyPassword 'xxx'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
debug {
signingConfig signingConfigs.release
}
}
將配置中的xxx改為生成keystore.jks時的密碼信息;
(4)Sync同步下項目代碼,完成后在右邊的Gradle projects/app/build目錄下雙擊assembleDebug或assembleRelease即可生成對應(yīng)版本帶有簽名的apk。
(5)下載apk簽名檢測工具:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN
在最下面有一個簽名生成工具,單擊下載進行下載;
(6)將下載的apk簽名工具安裝到手機上,將之前生成的帶有簽名認證的apk也裝到手機上,打開簽名工具apk,如下圖:

輸入包名,點擊按鈕生成對應(yīng)的數(shù)字簽名;
(7) 將包名與數(shù)字簽名注冊到我們的app審核過程中;
(8)漫長的等待...,也許是兩三天,也許一兩個禮拜。當(dāng)我們的應(yīng)用申請通過時,微信開放平臺會返回給我們APP_ID與APP_SECRET信息。
當(dāng)應(yīng)用審核通過后,就到我們的代碼實施階段了,不過在寫代碼之前,我們先來了解一下OAuth2.0它的一個認證流程:

整個過程的交互一共七個流程,當(dāng)用戶使用第三方應(yīng)用請求微信登錄時,此時會調(diào)起微信登錄確認頁面,并請求微信OAuth2.0進行授權(quán),當(dāng)用戶確認登錄時,這時微信平臺會拉起我們的第三方應(yīng)用,并將帶有臨時票據(jù)的信息返回給我們的第三方應(yīng)用,當(dāng)我們的應(yīng)用拿到微信的臨時票據(jù)時,我們就可以根據(jù)它的票據(jù)的code信息,再加上我們應(yīng)用的appId與appSecret信息換取access_token。當(dāng)然,為了用戶帳號信息的保存,這個過程一般都是由我們的第三方應(yīng)用的服務(wù)器完成的,我們只需要將我們的code傳給我們的服務(wù)器,由服務(wù)器最終完成與微信平臺的token換取。
接下來就是開始寫代碼了,首先我們需要下載微信的sdk包,在build.gradle中,添加下面一行代碼:
dependencies {
...
compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
...
}
sync,將會下載我們最新的sdk版本。如果下載失敗我們也可以使用離線包,添加到app/lib目錄中,并添加引用即可(由于前段時間jCenter下架了微信的sdk,導(dǎo)致開發(fā)的過程中發(fā)現(xiàn)不能直接使用,這時候可以考慮在lib中添加即可);
根據(jù)微信開發(fā)平臺的官方要求,調(diào)起微信登錄的處理邏輯必須放在我們應(yīng)用的包名.wxapi目錄下,否則會報錯。這點可以參考微信提供的官方sdkDemo,https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN 在范例代碼進行下載。不過這里下載的代碼可能會因為編碼的原因,導(dǎo)致漢語注釋變成了混亂字符,后來將UTF-8編碼改為GBK就OK了。
我們看一下代碼的實現(xiàn)邏輯:
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
public static final String APP_ID = "xxxxxxxxxx";
public static final String APP_SECRET = "xxxxxxxxxx";
private static final String WEIXIN_SCOPE = "snsapi_userinfo";
private static final String WEIXIN_STATE = "login_wx";
private IWXAPI api;
private SendAuth.Req req;
private TextView loginWx;
private User user;
private String wxCode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.login_wx);
loginWx = (TextView) findViewById(R.id.login_wx);
api = WXAPIFactory.createWXAPI(this, APP_ID, false);
api.registerApp(APP_ID);
try {
api.handleIntent(getIntent(), this);
} catch (NullPointerException e) {
e.printStackTrace();
}
initListener();
}
private void initListener() {
loginWx.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendAuth();
}
});
}
private void sendAuth() {
req = new SendAuth.Req();
req.scope = WEIXIN_SCOPE;
req.state = WEIXIN_STATE;
api.sendReq(req);
}
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
int type = baseResp.getType();
if (type == 1) {
// 登錄
SendAuth.Resp sendAuthResp = (SendAuth.Resp) baseResp;
wxCode = sendAuthResp.code;
String state = ((SendAuth.Resp) baseResp).state;
int errCode = baseResp.errCode;
Intent intent = new Intent(WXEntryActivity.this, HomeActivity.class);
intent.putExtra("login", "login");
intent.putExtra("wxCode", wxCode);
startActivity(intent);
YeeUtils.animOpenActivity(this);
finish();
}
}
@Override
public void finish() {
super.finish();
YeeUtils.animCloseActivity(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
api.unregisterApp();
}
}
要實現(xiàn)微信登錄的功能,我們的代碼就必須實現(xiàn)IWXAPIEventHandler接口,實現(xiàn)onReq()與onResp()接口,首先我們要在activity創(chuàng)建的時候需要進行一些初始化的操作,這個照寫就是:
api = WXAPIFactory.createWXAPI(this, APP_ID, false);
api.registerApp(APP_ID);
try {
api.handleIntent(getIntent(), this);
} catch (NullPointerException e) {
e.printStackTrace();
}
當(dāng)我們進行微信登錄時,整個認證流程也就從sendAuth()開始了,當(dāng)調(diào)起微信登錄并確認后,這個時候微信sdk會調(diào)起我們的當(dāng)前activity并觸發(fā)onResp()回調(diào),并傳回code信息,這時候我們就可以將接下來的處理交給我們的服務(wù)器,由它完成對微信token的換取。
當(dāng)然如果你想自己實現(xiàn)對微信token的獲取以及接下來的操作,也是可以的,不過不建議這樣使用,下面就是獲取token的代碼:
private void getResult(String code) {
String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
+ APP_ID
+ "&secret="
+ APP_SECRET
+ "&code="
+ code
+ "&grant_type=authorization_code";
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, null, new SuccessResponse(), new ErrorListener());
StudyApplication.getInstance().newRequestQueue(this).add(request);
}
class SuccessResponse implements Response.Listener<JSONObject> {
@Override
public void onResponse(JSONObject response) {
if (null != response) {
String openid = null;
try {
openid = response.getString("openid")
.toString().trim();
String access_token = response
.getString("access_token").toString().trim();
SharePreferenceHelper.putValue(getApplicationContext(), "access_token", access_token);
getUID(openid, access_token);
}
catch (JSONException e) {
e.printStackTrace();
}
}
}
}
通過這一步那么我們就拿到了用戶的token信息,使用token我們就可以獲取到用戶信息,包括昵稱,性別,頭像,地址等信息,我們接下來看getUid()中的實現(xiàn):
private void getUID(final String openId, final String accessToken) {
String url = "https://api.weixin.qq.com/sns/userinfo?access_token=" + accessToken + "&openid=" + openId;
JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, url, null, new UIDSuccessResponse(), new ErrorListener());
StudyApplication.getInstance().newRequestQueue(this).add(request);
}
class UIDSuccessResponse implements Response.Listener<JSONObject> {
@Override
public void onResponse(JSONObject response) {
if (response == null) {
return;
}
String nickname = null;
nickname = response.optString("nickname");
String unionid = response.optString("unionid");
String headUrl = response.optString("headimgurl");
SharePreferenceHelper.putValue(getApplicationContext(), "nickname", nickname);
SharePreferenceHelper.putValue(getApplicationContext(), "photourl", headUrl);
SharePreferenceHelper.putValue(getApplicationContext(), "uin", unionid);
if (user == null) {
user = new User();
}
user.setUin(unionid);
user.setNickName(nickname);
user.setHeadImgUrl(headUrl);
...
}
};
當(dāng)拿到用戶的私人信息后,我們就完成了整個流程,但這些信息不應(yīng)該由我們自己處理,所以當(dāng)需要獲取用戶信息時,我們應(yīng)該請求我們自己的服務(wù)器,然后由服務(wù)器再去請求微信服務(wù)器,這樣的流程才是安全可靠的。
除了微信登錄,微信sdk還集成了微信好友分享,朋友圈分享,小程序分享(比較早的版本是沒有的...)等功能,分享內(nèi)容包括圖片,文本,網(wǎng)頁等,這就看我們的需求了,分享這塊我就不寫了,大家可以參考下官方的sdkDemo關(guān)于分享的代碼。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android實現(xiàn)為Notification加上一個進度條的方法
這篇文章主要介紹了Android實現(xiàn)為Notification加上一個進度條的方法,結(jié)合實例形式分析了Android針對Notification組件的相關(guān)操作技巧,需要的朋友可以參考下2016-10-10
Android判斷后臺服務(wù)是否開啟的兩種方法實例詳解
這篇文章主要介紹了Android判斷后臺服務(wù)是否開啟的方法的相關(guān)資料,這里提供了兩種方法及實例,需要的朋友可以參考下2017-07-07
Android開發(fā)使用Message對象分發(fā)必備知識點詳解
這篇文章主要為大家介紹了Android開發(fā)使用Message對象分發(fā)必備知識點詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
Android中父View和子view的點擊事件處理問題探討
當(dāng)屏幕中包含一個ViewGroup,而這個ViewGroup又包含一個子view,這個時候android系統(tǒng)如何處理Touch事件呢,接下來將對此問題進行深入了解,感興趣的朋友可以了解參考下,或許對你有所幫助2013-01-01
Android Studio導(dǎo)入Project與Module的方法及實例
這篇文章主要介紹了Android Studio導(dǎo)入Project與Module的方法及實例的相關(guān)資料,需要的朋友可以參考下2017-04-04
Android開發(fā)實現(xiàn)的標(biāo)準(zhǔn)體重計算器功能示例
這篇文章主要介紹了Android開發(fā)實現(xiàn)的標(biāo)準(zhǔn)體重計算器功能,結(jié)合實例形式分析了Android體重計算器的界面布局與功能實現(xiàn)相關(guān)操作技巧,需要的朋友可以參考下2017-12-12

