专栏首页移动大前端Android微信之登录授权(ShareSDK-AndroidStudio)

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

之前通过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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

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

    专注APP开发
  • Android微信之简单文本分享(ShareSDK-Eclipse)

    开发工具:Eclipse 开发环境:mac os ShareSDK版本:V2.7.2(下载地址:https://dn-epoint.qbox.me/Shar...

    专注APP开发
  • Android微信之登录授权(集成官方SDK-Eclipse)

    文章参考:http://www.jianshu.com/p/2ea8ae0618ef

    专注APP开发
  • Android微信之登录授权(ShareSDK-Eclipse)

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

    专注APP开发
  • 1. 从系统架构到Hello World

    Android起源与发展:   Android操作系统最初在2003年的时候由Andy Rubin开发,主要支持手机。2005年8月由Google收购注资。20...

    SecondWorld
  • 微信小程序:小程序开发工具安装以及新建微信小程序项目的步骤

    微信小程序的开发现在是越来越火,先不说个人开发爱好者自己开发的小程序,就说软件市场,以微信小程序开发为生的软件企业来说,小程序的开发业务非常火爆,但是小程序开发...

    三掌柜
  • 汽车门店开发小程序后实现了引流和变现

    微信小程序上线之后,汽车服务行业做为线下的传统行业也开始逐步的推行和开发属于自己的小程序。但是对于汽车门店开发微信小程序该怎么办呢?

    用户1745481
  • Android RxJava 实战系列:联合判断

    Carson.Ho
  • 【晓头条】微信网页版即将关停 / 小程序将推视频直播能力 / 微信可购港铁车票

    在此次会议上,腾讯云表示,正与微信合作,在小程序实现实时视频串流(直播)相关能力,包括直播视频的录制与广播、以及实时播放能力。腾讯云也会配合推出相关解决方案。

    知晓君
  • Android十八章:5分钟接入微信支付

    现在app最流行微信支付,支付宝支付,都是大部分消费类型app计费方式首选。现在5分钟教你接入微信支付。

    ppjun

扫码关注云+社区

领取腾讯云代金券