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