有时候我们需要通过微信登录授权实现第三方登录,扩大用户量
ShareSDK不仅仅可以做到分享相关操作,原来第三方登录授权也可以做到,之前一直没有发现
好了,废话少说,先上个效果图
登录授权分为SSO,和非SSO
通俗点讲SSO就是调用微信客户端进行登录授权(前提是:手机端必须安装微信客户端)
非SSO就是通过网页的方式请求授权(可以不用安装微信客户端哦)
前言
开发工具:Eclipse
开发环境:mac os
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_ShareSDK_LoginAuthDemo_V2.7.2.git
特别说明1:微信登录授权必须取得接口使用权限,既必须在微信开放平台进行开发者认证,否则会提示以下错误
无授权登录接口使用权限.png特别说明2:微信登录必须要正式打包签名才可以,直接通过Eclipse安装是无效的(又得吐槽了,很不方便调试啊.......)
由于本人暂时没有微信登录接口权限,所以直接使用了ShareSDK提供的AppID,AppSecret,打包的时候就必须使用ShareSDK提供的签名文件,大家在使用源码的时候特别注意,否则Demo是无法运行的
ShareSDK签名文件.png 源码打包签名.png1.权限配置
<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配置配置
需要配置ShareSDK AppKey,微信AppID,AppSecret
ShareSDK.xml配置.png
特别注意:需要配置三处,分别针对微信好友,微信朋友圈,微信收藏
微信AppID,AppSecret配置.png
4.核心代码
// 授权登录
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 第三方登录 官方文档
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
网友评论