友盟第三方登录实现QQ和微信登录

前言

市面上的app大部分都可以使用qq,微信这些第三方平台的账号来登录,这样可以提高用户体验,避免手工输入账号和密码的麻烦。那么第三方登录的原理到底是什么,以及使用友盟这个平台怎样实现qq和微信的联合登录?下面就来开始本片文章的正文。

原理

使用第三方登录,通过访问第三方平台,拿到QQ、微信的用户id,拿着第三方平台平台(QQ、微信)返回uid或者openid这些用户的唯一标识,然后拿着这些唯一标识访问自己APP的后台服务,如果已经在后台注册则直接登录返回用户信息。若没有登录会直接后台创建新的用户,并返回用户信息。下载再使用这个账号登录就可以直接登录了。这是一般APP第三方登录的流程。

流程图:

这里写图片描述

但是对于一些商城类的APP就不可以这么搞了,需要去绑定已经存在的用户。

流程图:

这里写图片描述

前期准备

  • 友盟后台申请AppKey

    这里写图片描述

    这里写图片描述

  • 微信开发者平台申请AppID,AppSecret
    链接:https://open.weixin.qq.com/
    申请微信的appId是比较麻烦的,首先需要在微信开发者平台上申请一个开发者账号,并进行开发者资质认证(花钱的)
    这里写图片描述

    认证完成后,点击移动应用,并按照要求一步一步填写信息,创建应用
    这里写图片描述

    这里写图片描述
    注意填写平台信息的时候需要填写一个应用签名,这个签名是和签名文件相对应的,一个签名文件对应一个签名。

  • 腾讯开发平台注册账号,申请appid和appkey
    链接: http://open.qq.com/
    申请QQ的appid没有像微信那么麻烦了,直接注册了账号就可以创建应用了
    这里写图片描述

接入步骤

官方文档:http://dev.umeng.com/social/android/quick-integration

  • 下载sdk

    根据需求下载对应平台的sdk,对于QQ,微信,新浪微博都有完整版和精简版的区别,这里自行选择。精简版的就可以实现第三方登录了。根据要实现的功能下载具体的版本。
    这里写图片描述

  • 拷贝资源(jar,res)到工程中

    拷贝jar和res有如下两种形式

    a .将main文件夹以及platform(选择你想使用的平台即可)文件下,对应的资源文件和jar放入你的工程

    这里写图片描述
    b.如果不想像a方式一样一个个拷贝,可以使用集成工具umeng_integrate_tool.jar

    双击点开这个工具,如下图所示:
    这里写图片描述

    选择你想使用的平台,以及你所使用的开发工具,点击ok 会在当前目录下生成一个新的文件夹umeng_integratetool_result
    只需将该文件夹下生成的对应文件对应放入你的工程中即可 这里注意如果使用了新浪微博精简版,或者豆瓣人人腾讯微博,需要加入umeng_social_shareview.jar及其对应的资源文件,如果没有使用这些平台可以不加 如果您的程序不想使用我们的分享面板,想自定义UI分享UI界面,umeng_social_shareboard.jar以及对应的资源文件也可以不用加 如果您使用了我们的分享面板,您的工程已经依赖的v4,可以不使用我们的umeng_shareboard_widget.jar

  • 添加对应的回调Activity

    使用微信分享或者登陆功能

    在包名目录下创建wxapi文件夹,新建一个名为WXEntryActivity的activity继承WXCallbackActivity。这里注意一定是包名路径下,例如我的包名是com.umeng.soexample,则配置如下:(需要注意,如果使用精简版WXCallbackActivity的路径为com.umeng.weixin.callback.WXCallbackActivity,如果使用完整版路径是com.umeng.socialize.weixin.view.WXCallbackActivity)
    这里写图片描述

    同理需要建立回调的平台还有支付宝与易信,支付宝是需要建立一个apshare的文件夹,然后建立一个ShareEntryActivity的类,继承ShareCallbackActivity。易信是需要建立一个yxapi的文件夹,建立一个YXEntryActivity的类继承YXCallbackActivity。如果不使用这两个平台可以不用建立。 同理新浪微博也需要一个回调的Activity,与微信不同的是它只需要在包名目录下建立一个名为WBShareActivity类即可,不用建立文件夹,该类继承WBShareCallBackActivity,如下图所示(注意看目录结构)
    这里写图片描述

  • 修改AndroidManiFest

    • 首先需要添加权限:

      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
      <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
      <uses-permission android:name="android.permission.READ_PHONE_STATE" />
      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
      <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
      <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
      
    • 然后加入sdk中需要的Activity:

      新浪:

      <activity
                  android:name=".WBShareActivity"android:configChanges="keyboardHidden|orientation"android:screenOrientation="portrait" ><intent-filter><action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" /><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" />
      

      支付宝:

          <activity
              android:name=".apshare.ShareEntryActivity"android:configChanges="keyboardHidden|orientation|screenSize"android:exported="true"android:screenOrientation="portrait"android:theme="@android:style/Theme.Translucent.NoTitleBar" />

      qq精简版:

          <activity
                  android:name="com.umeng.qq.tencent.AuthActivity"android:launchMode="singleTask"android:noHistory="true" ><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="tencent100424468" /></intent-filter></activity><activity
                  android:name="com.umeng.qq.tencent.AssistActivity"android:screenOrientation="portrait"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="orientation|keyboardHidden|screenSize"/>

      qq完整版:

          <activity
                  android:name="com.tencent.tauth.AuthActivity"android:launchMode="singleTask"android:noHistory="true" ><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="tencent100424468" /></intent-filter></activity><activity
                  android:name="com.tencent.connect.common.AssistActivity"android:screenOrientation="portrait"android:theme="@android:style/Theme.Translucent.NoTitleBar"android:configChanges="orientation|keyboardHidden|screenSize"/>

      添加友盟key:

          <meta-dataandroid:name="UMENG_APPKEY"android:value="561cae6ae0f55abd990035bf" ></meta-data>
  • 修改build.gradle文件

    • 将文件夹中的签名文件放入到工程中,例如我的签名文件是appKey.jks
      这里写图片描述

    • 然后增加签名文件的密码:

        signingConfigs {debug {storeFile file('../appKey.jks')storePassword "******"keyAlias "******"keyPassword "******"}}
    • 然后在buildTypes中将这个signingConfigs配置进去,如下图所示:

      buildTypes {release {minifyEnabled falsesigningConfig signingConfigs.debugproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}debug {minifyEnabled falsesigningConfig signingConfigs.debugproguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'}}
  • 配置各个平台的appkey

    • 在application文件中配置对应平台的key:

      {PlatformConfig.setWeixin("wxbec65736501d0564", "82bc1e49bbb56cdded05cc8875d02ea79");PlatformConfig.setQQZone("1105979137", "jODSgRir417714vY");}
    • 在application中初始化sdk,这个初始化最好放在application的程序入口中,防止意外发生:

        UMShareAPI.get(this);

    以上以精简版的为例,如果是完整版的就需要把完整版的jar和res拷贝到工程中,在清单文件中配置完整版的activity。

  • 混淆文件

        -dontusemixedcaseclassnames
        -dontshrink
        -dontoptimize
        -dontwarn com.google.android.maps.**
        -dontwarn android.webkit.WebView
        -dontwarn com.umeng.**
        -dontwarn com.tencent.weibo.sdk.**
        -dontwarn com.facebook.**
        -keep public class javax.**
        -keep public class android.webkit.**
        -dontwarn android.support.v4.**
        -keep enum com.facebook.**
        -keepattributes Exceptions,InnerClasses,Signature
        -keepattributes *Annotation*
        -keepattributes SourceFile,LineNumberTable
    -keep public interface com.facebook.**
        -keep public interface com.tencent.**
        -keep public interface com.umeng.socialize.**
        -keep public interface com.umeng.socialize.sensor.**
        -keep public interface com.umeng.scrshot.**
        -keep class com.android.dingtalk.share.ddsharemodule.** { *; }
        -keep public class com.umeng.socialize.* {*;}
    -keep class com.facebook.**
        -keep class com.facebook.** { *; }
        -keep class com.umeng.scrshot.**
        -keep public class com.tencent.** {*;}
        -keep class com.umeng.socialize.sensor.**
        -keep class com.umeng.socialize.handler.**
        -keep class com.umeng.socialize.handler.*
        -keep class com.umeng.weixin.handler.**
        -keep class com.umeng.weixin.handler.*
        -keep class com.umeng.qq.handler.**
        -keep class com.umeng.qq.handler.*
        -keep class UMMoreHandler{*;}
        -keep class com.tencent.mm.sdk.modelmsg.WXMediaMessage {*;}
        -keep class com.tencent.mm.sdk.modelmsg.** implements   com.tencent.mm.sdk.modelmsg.WXMediaMessage$IMediaObject {*;}
        -keep class im.yixin.sdk.api.YXMessage {*;}
        -keep class im.yixin.sdk.api.** implements im.yixin.sdk.api.YXMessage$YXMessageData{*;}
        -keep class com.tencent.mm.sdk.** {
         *;}-keep class com.tencent.mm.opensdk.** {
       *;}-dontwarn twitter4j.**
        -keep class twitter4j.** { *; }
    -keep class com.tencent.** {*;}
        -dontwarn com.tencent.**
        -keep public class com.umeng.com.umeng.soexample.R$*{
        public static final int *;}-keep public class com.linkedin.android.mobilesdk.R$*{
        public static final int *;}-keepclassmembers enum * {
        public static **[] values();public static ** valueOf(java.lang.String);}-keep class com.tencent.open.TDialog$*
        -keep class com.tencent.open.TDialog$* {*;}
        -keep class com.tencent.open.PKDialog
        -keep class com.tencent.open.PKDialog {*;}
        -keep class com.tencent.open.PKDialog$*
        -keep class com.tencent.open.PKDialog$* {*;}
    -keep class com.sina.** {*;}
        -dontwarn com.sina.**
        -keep class  com.alipay.share.sdk.** {
           *;}-keepnames class * implements android.os.Parcelable {
        public static final ** CREATOR;}-keep class com.linkedin.** { *; }
        -keepattributes Signature
  • 调用代码:友盟官方有两种方式,一种直接获取用户资料,另外一种是先去授权,获取accesstoken后再去回去用户资料,对于安全性要求高的话可以使用第二种方式。这里以第一种为例:

    • UMShareAPI.get(this).getPlatformInfo(this, SHARE_MEDIA.WEIXIN, authListener);
    • 其中umAuthListener为授权回调,构建如下,其中授权成功会回调onComplete,取消授权回调onCancel,授权错误回调onError,对应的错误信息可以用过onError的Throwable参数来打印

      private UMAuthListener umAuthListener = new UMAuthListener() {@Overridepublic void onStart(SHARE_MEDIA platform) {//授权开始的回调}@Overridepublic void onComplete(SHARE_MEDIA platform, int action, Map<String, String> data) {Toast.makeText(getApplicationContext(), "Authorize succeed", Toast.LENGTH_SHORT).show();}@Overridepublic void onError(SHARE_MEDIA platform, int action, Throwable t) {Toast.makeText( getApplicationContext(), "Authorize fail", Toast.LENGTH_SHORT).show();}@Overridepublic void onCancel(SHARE_MEDIA platform, int action) {Toast.makeText( getApplicationContext(), "Authorize cancel", Toast.LENGTH_SHORT).show();}
      };
    • 最后在登录所在的Activity里复写onActivityResult方法,注意不可在fragment中实现,如果在fragment中调用登录,在fragment依赖的Activity中实现,如果不实现onActivityResult方法,会导致登录或回调无法正常进行

      @Override
      protected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);UMShareAPI.get(this).onActivityResult(requestCode, resultCode, data);}
      
  • 登录成功后,第三方平台会将用户资料传回, 全部会在Map data中返回 ,由于各个平台对于用户资料的标识不同,因此为了便于开发者使用,我们将一些常用的字段做了统一封装,开发者可以直接获取,不再需要对不同平台的不同字段名做转换,这里列出封装的字段及含义
    这里写图片描述

  • 用户资料与各平台的对应关系:

    • QQ

      name:name(6.2以前用screen_name)

      用户id:uid

      accesstoken: accessToken (6.2以前用access_token)

      过期时间:expiration (6.2以前用expires_in)

      性别:gender

      头像:iconurl(6.2以前用profile_image_url)

      是否黄钻:is_yellow_year_vip

      黄钻等级:yellow_vip_level

      城市:city

      省份:province

    • 微信

      微信返回的openID和unionID都可以实现用户标识的需求,二者的区别在于,unionID可以实现同一个开发者账号下的应用之间账号打通的需求

      openid:openid

      unionid:(6.2以前用unionid)用户id

      accesstoken: accessToken (6.2以前用access_token)

      refreshtoken: refreshtoken: (6.2以前用refresh_token)

      过期时间:expiration (6.2以前用expires_in)

      name:name(6.2以前用screen_name)

      城市:city

      省份:prvinice

      国家:country

      性别:gender

      头像:iconurl(6.2以前用profile_image_url)

效果:

QQ
这里写图片描述

返回的信息

这里写图片描述

微信

这里写图片描述

返回的信息

这里写图片描述

拿到对应平台的信息后,用uid或openid请求服务器,进行后续的操作。每个app的产品定义可能会有一定的差别。这里就不在说,大体流程在上面已经说过。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/64527.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仿Twitter源代码/社交网络源码/基于脉聊二开版本

☑️ 编号&#xff1a;ym309 ☑️ 品牌&#xff1a;无 ☑️ 语言&#xff1a;PHP ☑️ 大小&#xff1a;104MB ☑️ 类型&#xff1a;仿Twitter ☑️ 支持&#xff1a;h5 &#x1f389; 欢迎关注&#xff0c;私信&#xff0c;领取 &#x1f389; ✨ 源码介绍 仿Twitter源代码是…

新版同城定位付费进群完整源码+对接支付/无问题

正文: 最近很多人都在找这个&#xff0c;但是大多都不完整不能用&#xff0c;好吧&#xff0c;给大家找了一套完美修复的出来&#xff0c;并且对接好了免签支付&#xff0c;可以直接使用&#xff0c;搭建简单&#xff0c;这个东西就不用我多说了把&#xff0c;推广引流神器&am…

如何通过免填邀请码,实现App用户增长

做App推广&#xff0c;裂变营销越来越难做怎么办&#xff1f; 拼命拉新&#xff0c;效果依然不明显&#xff0c;究竟是什么环节出了问题&#xff1f; 用户流失率大&#xff0c;推广中是否存在让用户极度反感的流程&#xff1f; … 在如今App产品高度同质化的背景下&#xff0c;…

唯一邀请码生成策略

需求&#xff1a;按照随机策略生成一个不重复的邀请码&#xff08;字母数字&#xff09;&#xff0c;既要不重复又要保证性能。每个用户对应一个邀请码&#xff0c;必须做到唯一性。邀请码的需要手动输入所以长度不能太长&#xff0c;同时不能让用户猜到邀请码的生成逻辑&#…

DMES-2023第十三届数字营销与电商峰会大会 火热报名中

2023第十三届数字营销与电商峰会将于7月6-7日在上海召开&#xff01; 本次峰会线上线下同步举行&#xff0c;将通过七大热点主题帮助品牌主突破模式能力&#xff0c;回归初心、精耕细作&#xff0c;实现可持续增长&#xff1b;提升产品能力&#xff0c;实现可持续长期增长&…

2023第十三届中国数字营销与电商创新峰会 嘉宾揭晓

2023第十三届中国数字营销与电商创新峰会将于7月6日-7日在上海召开。 本次峰会将通过七大热点主题帮助品牌主突破模式能力&#xff0c;回归初心、精耕细作&#xff0c;实现可持续增长&#xff1b;提升产品能力&#xff0c;实现可持续长期增长&#xff1b;优化营销能力&#xf…

MIMIC-IT:280万条多模态指令-响应对,八种语言通用,首个涵盖视频内容的指令数据集...

本文来源 机器之心 编辑&#xff1a;蛋酱 在包含 280 万条多模态上下文指令 - 相应对的数据集上训练之后&#xff0c;Otter 展现出了优秀的问答能力&#xff0c;并在 ChatGPT 及人类的两项评估中获得了很高的评价。 近段时间来&#xff0c;AI 对话助手在语言任务上取得了不小…

MIMIC-IT

在包含 280 万条多模态上下文指令 - 相应对的数据集上训练之后&#xff0c;Otter 展现出了优秀的问答能力&#xff0c;并在 ChatGPT 及人类的两项评估中获得了很高的评价。 近段时间来&#xff0c;AI 对话助手在语言任务上取得了不小的进展。这种显著的进步不只是基于 LLM 强大…

【Mac】Mac安装telnet

1.美图 2. 安装 Homebrew 安装 Homebrew 3.安装 (base) lcc@lcc github$ brew install telnet Updating Homebrew... ==> Downloading https://homebrew.bintray.com/bottles/telnet-60.mojave.bottle.tar.gz #########################################################…

mac新版本安装telnet

升级之后突然发现telnet不能用了&#xff0c;执行如下操作即可&#xff1a; telnet安装 安装 homebrew /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 这一步&#xff0c;输入密码之后一直回车就可以了。…

苹果电脑安装wintogo不能启动,不妨试试这个软件

2018年&#xff0c;我的联想笔记本电脑太老了&#xff1b;分辨率明显不够&#xff0c;看起也不是很舒服&#xff0c;于是考虑买电脑&#xff1b;起初选择是想买macbook&#xff0c;看了很久要配置高只能买macbookpro&#xff0c;mbp价格要1.8万&#xff1b;准备买的时候还是心痛…

Mac OS 安装telnet命令

telnet安装 安装 homebrew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"下载时的效果&#xff1a; 查看homebrew 是否安装成功 brew help 使用 homebrew 安装telnet brew install telnet 查看telnet是否安装成功 teln…

Mac上的seata安装

太难了太难了 满百度找不到Mac端的seata安装的教程 github上下载seata&#xff0c;或者下面的wp链接 因为我使用的版本是0.9&#xff0c;目前我这里只有0.9的版本 用网盘的形式分享&#xff0c;需要的话直接下就行了 别的版一搜就有了 链接: https://pan.baidu.com/s/1fkRWn1E…

WTG:给苹果电脑安装Windows

通过WTG把Windows安装到U盘、移动硬盘上&#xff0c;这样苹果电脑&#xff08;MacBook&#xff09;就无需把Windows安装到苹果电脑本地硬盘&#xff0c;占用苹果电脑磁盘空间了&#xff1b;不仅方便携带而且即插即用。 同样也支持Windows设备&#xff0c;只需要把软件安装到WTG…

【苹果imessage群发苹果推位置推】软件安装在系统中集成 USBMuxd 服务

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

[MAC 苹果电脑] [Linux 系统] ”苹果电脑使用虚拟机安装 Linux Ubuntu系统”教程

一.前述 研究员买了MAC苹果电脑后&#xff0c;大多想到的一件事&#xff1a;能不能再装一个Linux系统。 MAC的强大办公能力 Linux的开源能力 一个优秀的编程环境。 因为苹果电脑并没有为Linux系统配置相应的驱动&#xff0c;所以不能将其作为双系统安装。这里选择 虚拟机 的方…

非苹果机安装 Mac OS X 全教程~~~~转

安装雪豹系统全攻略 转向Intel阵营为在PC安装Mac OS提供可能 泡泡网主板频道5月13日 从目前桌面级操作系统的格局来看&#xff0c;主要分为Windows、Mac OS以及Linux三大阵营。其中Windows阵营最为强大&#xff0c;占据全球整个桌面级操作系统90%以上的市场份额&#xff0c;苹果…

mac下安装cnpm淘宝镜像

在mac安装cnpm时&#xff0c;输入npm install -g cnpm -registryhttps://registry.npm.taobao.org 报错&#xff1a; npm ERR! code EACCES npm ERR! syscall mkdir npm ERR! path /usr/local/lib/node_modules/cnpm npm ERR! errno -13 npm ERR! Error: EACCES: permission de…

埃隆·马斯克:Facebook Sucks

西雅图IT圈&#xff1a;seattleit 【今日作者】宇直 宇宙第一直男 " 特斯拉CEO埃隆马斯克(Elon Musk)不喜欢脸书&#xff0c;这不是秘密。 今年2月&#xff0c;马斯克公开鼓动脸书用户注销账户&#xff0c;旗下特斯拉和SpaceX均没有注册脸书账户。上周&#xff0c;马斯克又…

89元之小度音箱测评

作为AI行业的渣渣&#xff0c;出于对技术的热爱&#xff0c;抢了几次&#xff0c;终于抢到了89元的小度音箱&#xff0c;说到抢&#xff0c;期间还有几多曲折&#xff0c;这里不细细展开了&#xff08;之前看到过科大的阿尔法蛋&#xff0c;感觉贵&#xff0c;没出手&#xff0…