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