国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

android實現微信聯合登錄開發示例

2019-10-22 18:26:38
字體:
來源:轉載
供稿:網友

隨著現在社交app的越來越普及,微信,QQ,微博幾乎成了我們每個人的手機必備,而且第三方應用也越來越多,不是每個用戶都想為你的應用注冊一個獨立帳號的,所以聯合登錄也就顯得尤為重要,成了我們不得不掌握的開發要點,但你要用微信等帳號實現聯合登錄,人家也有要求,就是你必須遵守OAuth2.0協議標準(https://oauth.net/2/)就行。

接下來我們就以android/235782.html">android studio為平臺,介紹下接入微信的整個流程:

這里有一個官方參考資料:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=6bfe3acd2969037c7217667f24f8eeaf714e5113&lang

那么在接入之前,我們還有一些準備工作要做:

1):登錄微信開放平臺,完成賬號申請:https://open.weixin.qq.com

2):提交app完成審核,并開通相應權限:

android,實現微信登錄,android微信登錄,微信聯合登錄

在提交app完成審核的過程中,我們需要提供app的包名與簽名:

包名就是我們創建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中的聲明為準:

應用簽名的獲取會有一些麻煩,因為我們需要通過簽名工具對我們的應用進行簽名,如果不進行簽名,每次安裝apk時android平臺會為我們生成默認簽名,由于平臺的不一致性,導致我們的apk裝到不同的手機上簽名不一致,最后導致無法正常使用微信登錄與分享功能,所以我們要提前做好統一簽名,整個簽名流程如下:

(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即可生成對應版本帶有簽名的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,如下圖:

android,實現微信登錄,android微信登錄,微信聯合登錄

輸入包名,點擊按鈕生成對應的數字簽名;

(7) 將包名與數字簽名注冊到我們的app審核過程中;

(8)漫長的等待...,也許是兩三天,也許一兩個禮拜。當我們的應用申請通過時,微信開放平臺會返回給我們APP_ID與APP_SECRET信息。

當應用審核通過后,就到我們的代碼實施階段了,不過在寫代碼之前,我們先來了解一下OAuth2.0它的一個認證流程:

android,實現微信登錄,android微信登錄,微信聯合登錄

整個過程的交互一共七個流程,當用戶使用第三方應用請求微信登錄時,此時會調起微信登錄確認頁面,并請求微信OAuth2.0進行授權,當用戶確認登錄時,這時微信平臺會拉起我們的第三方應用,并將帶有臨時票據的信息返回給我們的第三方應用,當我們的應用拿到微信的臨時票據時,我們就可以根據它的票據的code信息,再加上我們應用的appId與appSecret信息換取access_token。當然,為了用戶帳號信息的保存,這個過程一般都是由我們的第三方應用的服務器完成的,我們只需要將我們的code傳給我們的服務器,由服務器最終完成與微信平臺的token換取。

接下來就是開始寫代碼了,首先我們需要下載微信的sdk包,在build.gradle中,添加下面一行代碼:

dependencies {...compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'...}

sync,將會下載我們最新的sdk版本。如果下載失敗我們也可以使用離線包,添加到app/lib目錄中,并添加引用即可(由于前段時間jCenter下架了微信的sdk,導致開發的過程中發現不能直接使用,這時候可以考慮在lib中添加即可);

根據微信開發平臺的官方要求,調起微信登錄的處理邏輯必須放在我們應用的包名.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  在范例代碼進行下載。不過這里下載的代碼可能會因為編碼的原因,導致漢語注釋變成了混亂字符,后來將UTF-8編碼改為GBK就OK了。

我們看一下代碼的實現邏輯:

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;@Overrideprotected 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);}@Overridepublic void onReq(BaseReq baseReq) {}@Overridepublic 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();  } }  @Overridepublic void finish() {  super.finish();  YeeUtils.animCloseActivity(this);}@Overrideprotected void onDestroy() {  super.onDestroy();  api.unregisterApp();}}

要實現微信登錄的功能,我們的代碼就必須實現IWXAPIEventHandler接口,實現onReq()與onResp()接口,首先我們要在activity創建的時候需要進行一些初始化的操作,這個照寫就是:

api = WXAPIFactory.createWXAPI(this, APP_ID, false);api.registerApp(APP_ID);try {  api.handleIntent(getIntent(), this);} catch (NullPointerException e) {  e.printStackTrace();}

當我們進行微信登錄時,整個認證流程也就從sendAuth()開始了,當調起微信登錄并確認后,這個時候微信sdk會調起我們的當前activity并觸發onResp()回調,并傳回code信息,這時候我們就可以將接下來的處理交給我們的服務器,由它完成對微信token的換取。

當然如果你想自己實現對微信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()中的實現:

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);      ...    }  };

當拿到用戶的私人信息后,我們就完成了整個流程,但這些信息不應該由我們自己處理,所以當需要獲取用戶信息時,我們應該請求我們自己的服務器,然后由服務器再去請求微信服務器,這樣的流程才是安全可靠的。

除了微信登錄,微信sdk還集成了微信好友分享,朋友圈分享,小程序分享(比較早的版本是沒有的...)等功能,分享內容包括圖片,文本,網頁等,這就看我們的需求了,分享這塊我就不寫了,大家可以參考下官方的sdkDemo關于分享的代碼。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 龙江县| 玉山县| 厦门市| 库车县| 辽阳县| 嘉兴市| 板桥市| 龙门县| 甘南县| 新宁县| 扶风县| 酉阳| 和林格尔县| 湖州市| 枝江市| 新邵县| 静海县| 武功县| 巴彦淖尔市| 佛山市| 丹东市| 错那县| 贵德县| 三明市| 邳州市| 大方县| 西贡区| 静乐县| 牙克石市| 邵东县| 张北县| 饶河县| 资中县| 茶陵县| 安陆市| 宜兰市| 三都| 康定县| 屯门区| 共和县| 陆良县|