前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android微信之登录授权(ShareSDK-Eclipse)

Android微信之登录授权(ShareSDK-Eclipse)

作者头像
专注APP开发
发布2019-11-07 15:10:41
9150
发布2019-11-07 15:10:41
举报
文章被收录于专栏:移动大前端移动大前端

有时候我们需要通过微信登录授权实现第三方登录,扩大用户量 ShareSDK不仅仅可以做到分享相关操作,原来第三方登录授权也可以做到,之前一直没有发现 好了,废话少说,先上个效果图

效果图.png

1.gif

2.gif

登录授权分为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

源码打包签名.png

1.权限配置
代码语言:javascript
复制
<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配置
代码语言:javascript
复制
 <!--分享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.核心代码
代码语言:javascript
复制
    // 授权登录
    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

代码语言:javascript
复制
补充说明:
要数据,不要功能
如果你的应用拥有用户系统,就是说你的应用自己就有注册和登录功能,使用第三方登录只是为了拥有更多用户,那么你可以依照下面的步骤来做:
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

代码语言:javascript
复制
补充说明:
要功能,不要数据
如果你的应用不具备用户系统,而且也不打算维护这个系统,那么你可以依照下面的步骤来做:
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

image

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 一.前期准备
  • 二.代码整合
  • 三.项目实战
  • 参考资料
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档