美文网首页登录注册系统Android开发移动开发
Android微信之登录授权(ShareSDK-Eclipse)

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

作者: 微小码 | 来源:发表于2016-06-18 22:47 被阅读6707次

    有时候我们需要通过微信登录授权实现第三方登录,扩大用户量
    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.权限配置
    <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

    image

    相关文章

      网友评论

      本文标题:Android微信之登录授权(ShareSDK-Eclipse)

      本文链接:https://www.haomeiwen.com/subject/uuhbdttx.html