Android微信之登錄授權(ShareSDK-AndroidStudio)

  • 2019 年 11 月 7 日
  • 筆記

之前通過Eclipse來實現,那麼Android Studio如何來實現呢? 先上個效果圖

效果圖.png

登錄授權分為SSO,和非SSO 通俗點講SSO就是調用微信客戶端進行登錄授權(前提是:手機端必須安裝微信客戶端) 非SSO就是通過網頁的方式請求授權(可以不用安裝微信客戶端哦)

前言

開發工具:Android Studio 2.1.2(mac版本) 開發環境:OS X EI Capitan 版本 10.11.5

系統版本.png

ShareSDK版本:V2.7.2

(下載地址:https://dn-epoint.qbox.me/ShareSDK-Android-2.7.2.tar.gz)

一.前期準備

1.帳號申請 https://open.weixin.qq.com/ 首先登錄微信開放平台,註冊一個帳號 2.提交APP審核 為什麼必須提交app審核呢?

請看下圖微信開放平台接口使用權限 不提交審核,根本沒法用,無語了。。。 提交需要準備:應用名稱,應用簡介,應用圖片(2828,108108),應用官網 android版本:需要提供應用簽名,應用包名 具體參考官網,安裝步驟一步步來 這裡需要注意幾點: 第一:關於應用簽名,需要把你的app打包成APK安裝到手機,然後通過簽名工具,生成對應的簽名 不得不說官方的簽名工具真的是給人用的嗎?

官方簽名工具截圖

我還是推薦使用新浪的簽名工具吧! 下載地址 https://dn-epoint.qbox.me/app_signatures.apk

新浪簽名工具截圖

第二:如果每次打包都是採用相關的證書,那麼生成的簽名是一樣的!!! 下面就可以提交審核了,審核周期官方說是7天,一般1-2天就可以審核通過了!

審核通過

APPID還是非常有用的,後面會用到。 3.手機安裝微信客戶端 補充:由於本Demo只是簡單使用了文本分享API,如果你需要使用微信登錄API,那麼就需要進行開發者認證(具體認證流程請參考官網),非政府,事業單位,每年300,政府事業單位認證免費。 至此,前期所有的準備工作完成,下面進行代碼的整合。

二.代碼整合

源碼:

https://github.com/andli0626/wx_loginauth_by_sharesdk_AndroidStudio.git

特別說明1:微信登錄授權必須取得接口使用權限,既必須在微信開放平台進行開發者認證,否則會提示以下錯誤

無授權登錄接口使用權限.png

特別說明2:微信登錄必須要正式打包簽名才可以,直接通過Eclipse安裝是無效的(又得吐槽了,很不方便調試啊…….)

由於本人暫時沒有微信登錄接口權限,所以直接使用了ShareSDK提供的AppID,AppSecret,打包的時候就必須使用ShareSDK提供的簽名文件,大家在使用源碼的時候特別注意,否則Demo是無法運行的

簽名文件.png

打包.png

0.新建項目

1.png

2.png

3.png

1.權限配置
<uses-permission android:name="android.permission.GET_TASKS" />  <uses-permission android:name="android.permission.INTERNET" />  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>  <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  <uses-permission android:name="android.permission.READ_PHONE_STATE" />  <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"/>  <uses-permission android:name="android.permission.GET_ACCOUNTS"/>  <!-- 藍牙分享所需的權限 -->  <uses-permission android:name="android.permission.BLUETOOTH" />  <uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
2.AndroidManifest.xml配置
 <!--分享UI配置-->   <activity          android:name="com.mob.tools.MobUIShell"          android:configChanges="keyboardHidden|orientation|screenSize"          android:screenOrientation="portrait"          android:theme="@android:style/Theme.Translucent.NoTitleBar"          android:windowSoftInputMode="stateHidden|adjustResize" >          <intent-filter>              <data android:scheme="tencent100371282" />                <action android:name="android.intent.action.VIEW" />                <category android:name="android.intent.category.BROWSABLE" />              <category android:name="android.intent.category.DEFAULT" />          </intent-filter>    </activity>     <!-- 微信分享回調 -->    <activity          android:name=".wxapi.WXEntryActivity"          android:configChanges="keyboardHidden|orientation|screenSize"          android:exported="true"          android:screenOrientation="portrait"          android:theme="@android:style/Theme.Translucent.NoTitleBar" />
3.ShareSDK.xml配置配置

首先需要在項目中新建個assets目錄,步驟如下:

新建assets1.png

新建assets2.png

OK,新建完成

新建assets3.png

需要配置ShareSDK AppKey,微信AppID,AppSecret

ShareSDK.xml配置.png

特別注意:需要配置三處,分別針對微信好友,微信朋友圈,微信收藏

微信AppID,AppSecret配置.png

4.導入SDK文件

首先通過SDK自帶的工具生成相應的文件

生成ShareSDK.png

然後將相應的文件拷貝到對應的目錄即可

文件目錄對應關係.png

5.核心代碼
    // 授權登錄      private void authorize(Platform plat,Boolean isSSO) {       // 判斷指定平台是否已經完成授權       if (plat.isValid()) {        // 已經完成授權,直接讀取本地授權信息,執行相關邏輯操作(如登錄操作)        String userId = plat.getDb().getUserId();        if (!TextUtils.isEmpty(userId)) {         UIHandler.sendEmptyMessage(MSG_USERID_FOUND, this);         login(plat.getName(), userId, null);         return;        }       }       plat.setPlatformActionListener(this);       // 是否使用SSO授權:true不使用,false使用       plat.SSOSetting(isSSO);       // 獲取用戶資料       plat.showUser(null);      }      // 取消授權      private void cancleAuth(){       Platform wxPlatform = ShareSDK.getPlatform(Wechat.NAME);       wxPlatform.removeAccount();       Toast.makeText(this,"取消授權成功!", Toast.LENGTH_SHORT).show();      }        // 回調:授權成功      public void onComplete(Platform platform, int action,HashMap<String, Object> res) {       if (action == Platform.ACTION_USER_INFOR) {        UIHandler.sendEmptyMessage(MSG_AUTH_COMPLETE, this);        // 業務邏輯處理:比如登錄操作        String userName = platform.getDb().getUserName(); // 用戶昵稱        String userId = platform.getDb().getUserId();   // 用戶Id        String platName = platform.getName();     // 平台名稱          login(platName, userName, res);       }      }      // 回調:授權失敗      public void onError(Platform platform, int action, Throwable t) {       if (action == Platform.ACTION_USER_INFOR) {        UIHandler.sendEmptyMessage(MSG_AUTH_ERROR, this);       }       t.printStackTrace();      }      // 回調:授權取消      public void onCancel(Platform platform, int action) {       if (action == Platform.ACTION_USER_INFOR) {        UIHandler.sendEmptyMessage(MSG_AUTH_CANCEL, this);       }      }      // 業務邏輯:登錄處理      private void login(String plat, String userId,HashMap<String, Object> userInfo) {       Toast.makeText(this, "用戶ID:"+userId, Toast.LENGTH_SHORT).show();       Message msg = new Message();       msg.what    = MSG_LOGIN;       msg.obj     = plat;       UIHandler.sendMessage(msg, this);      }        // 統一消息處理      private static final int MSG_USERID_FOUND  = 1; // 用戶信息已存在      private static final int MSG_LOGIN    = 2; // 登錄操作      private static final int MSG_AUTH_CANCEL  = 3; // 授權取消      private static final int MSG_AUTH_ERROR  = 4; // 授權錯誤      private static final int MSG_AUTH_COMPLETE  = 5; // 授權完成        public boolean handleMessage(Message msg) {       switch (msg.what) {         case MSG_USERID_FOUND:        Toast.makeText(this, "用戶信息已存在,正在跳轉登錄操作......",  Toast.LENGTH_SHORT).show();        break;       case MSG_LOGIN:        Toast.makeText(this, "使用微信帳號登錄中...",      Toast.LENGTH_SHORT).show();        break;       case MSG_AUTH_CANCEL:        Toast.makeText(this, "授權操作已取消",       Toast.LENGTH_SHORT).show();        break;       case MSG_AUTH_ERROR:        Toast.makeText(this, "授權操作遇到錯誤,請閱讀Logcat輸出",   Toast.LENGTH_SHORT).show();        break;       case MSG_AUTH_COMPLETE:        Toast.makeText(this,"授權成功,正在跳轉登錄操作…",     Toast.LENGTH_SHORT).show();        // 執行相關業務邏輯操作,比如登錄操作        String userName = new Wechat(MainActivity.this).getDb().getUserName(); // 用戶昵稱        String userId = new Wechat(MainActivity.this).getDb().getUserId();   // 用戶Id        String platName = new Wechat(MainActivity.this).getName();      // 平台名稱          login(platName, userId, null);        break;       }       return false;      }

初始化ShareSDK.png

至此,一個微信登錄授權的Demo就完成了。 是不是就完了,NO,具體項目中怎麼應用呢?下面我們就來分析下項目如何應用

三.項目實戰

主要分2種情況:

第一種:APP有註冊,登錄功能

APP本身有一套自己的用戶系統,微信登錄只是一種登錄方式,那麼就需要實現原有用戶與微信用戶的綁定

第一種情況.png

補充說明:  要數據,不要功能  如果你的應用擁有用戶系統,就是說你的應用自己就有註冊和登錄功能,使用第三方登錄只是為了擁有更多用戶,那麼你可以依照下面的步驟來做:  1、用戶觸發第三方登錄事件  2、showUser(null)請求授權用戶的資料(這個過程中可能涉及授權操作)  3、如果onComplete()方法被回調,將其參數Hashmap代入你應用的Login流程  4、否則提示錯誤,調用removeAccount()方法,刪除可能的授權緩存數據  5、Login時客戶端發送用戶資料中的用戶ID給服務端  6、服務端判定用戶是已註冊用戶,則引導用戶進入系統,否則返回特定錯誤碼  7、客戶端收到「未註冊用戶」錯誤碼以後,代入用戶資料到你應用的Register流程  8、Register時在用戶資料中挑選你應用的註冊所需字段,並提交服務端註冊  9、服務端完成用戶註冊,成功則反饋客戶端引導用戶進入系統  10、否則提示錯誤,調用removeAccount()方法,刪除可能的授權緩存數據

參考示例:比如簡書,網易雲音樂的帳號綁定實現過程,都是值得借鑒的

第二種:APP無註冊功能

APP本身沒有自己的用戶系統,微信登錄是唯一的入口,只要授權通過,就可以進入APP

第二種情況.png

補充說明:  要功能,不要數據  如果你的應用不具備用戶系統,而且也不打算維護這個系統,那麼你可以依照下面的步驟來做:  1、用戶觸發第三方登錄事件  2、調用platform.getDb().getUserId()請求用戶在此平台上的ID  3、如果用戶ID存在,則認為用戶是合法用戶,允許進入系統;否則調用authorize()  4、authorize()方法將引導用戶在授權頁面輸入帳號密碼,然後目標平台將驗證此用戶  5、如果onComplete()方法被回調,表示授權成功,引導用戶進入系統  6、否則提示錯誤,調用removeAccount()方法,刪除可能的授權緩存數據

建議: 對於Android應用,建議總是顯示微信登錄按鈕,當用戶手機沒有安裝微信客戶端時,請引導用戶下載安裝微信客戶端。 對於iOS應用,考慮到iOS應用商店審核指南中的相關規定,建議開發者接入微信登錄時,先檢測用戶手機是否已安裝微信客戶端,對未安裝的用戶隱藏微信登錄按鈕,只提供其他登錄方式(比如手機號註冊登錄、遊客登錄等)

參考資料

ShareSDK 官方Android Studio整合說明 http://www.cnblogs.com/smyhvae/p/4585340.html

ShareSDK 第三方登錄 官方文檔 http://wiki.mob.com/%E7%AC%AC%E4%B8%89%E6%96%B9%E7%99%BB%E5%BD%95/#h1-0 微信開放平台 登錄授權整合 官方說明文檔 https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN

image