热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图文详解Android开发微信授权登录与微信分享解析

本篇文章主要介绍了Android微信授权登录与微信分享,具有一定的参考价值,有需要的可以了解一下。
本篇文章主要介绍了图文详解Android开发微信授权登录与微信分享解析,具有一定的参考价值,有需要的可以了解一下。

前言

在移动互联网浪潮中,联网APP已经把单机拍死在沙滩上,很多公司都希望自家应用能够有一套帐号系统,可是许多用户却并不一定买账:我凭啥注册你家应用的帐号?微博,微信,QQ几乎成了每个人手机中的必装应用,于是微信,微博,QQ说了:来来来,你们都可以用我家的帐号登录你家应用,只要你遵循OAuth2.0协议标准就行。于是第三方社交帐号登陆成为了许多新兴应用的选择,由于腾讯官方微信开放平台的在线文档相对最新的SDK有些出入,并且登录相关的文档结构次序有些紊乱,今天就把我的一些经验记录在此,对微信开放平台官方的在线文档进行一定的整理。同时微信分享可以扩大自身APP影响力,于是微信分享功能也是很多开发者需要的功能,一并整理在此,希望能对后来的同道朋友有所帮助。

微信登录

以下部分内容摘自腾讯开放平台:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=6bfe3acd2969037c7217667f24f8eeaf714e5113&lang=zh_CN

授权流程说明

微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。

微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:

1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;

2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;

3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。

获取access_token时序图:

{ 
  // 发出授权申请
  Final SendAuth.Req req = new SendAuth.Req();
  req.scope = "snsapi_userinfo";
  req.state = "wechat_sdk_微信登录,分享demo_test";
  api.sendReq(req);
}

上两条箭头向左的流程在代码体现出来的就是:


public void onResp(BaseResp resp) ;// 这个回调接口位于IWXAPIEventHandler中

返回的数据为resp,用作请求登录授权时,它是SendAuth.Resp的实例,携带的数据有:

  1. ErrorCode:ERR_OK = 0(用户同意);ERR_AUTH_DENIED = -4(用户拒绝授权);ERR_USER_CANCEL = -2(用户取消)

  2. code:用户换取access_token的code,仅在ErrCode为0时有效

  3. state:第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K

  4. lang:微信客户端当前语言

  5. country:微信客户端当前国家

以上数据均以static String形式存在SendAuth.Resp的resp对象中。

注意:当使用微信提供最新的SDK/library时,上面有些数据是不存在,微信开放平台的文档和API及SDK没有同步更新。读者可使用最下方微信登录,分享demo中的笔者使用的jar包构建工程。

获取access_token & openid

最后一条向右的箭头表示:使用得到的code,获取access_token,openid,接口为:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

注意:微信的接口链接是使用SSL的安全链接,普通的HttpClient访问会导致应用崩溃或报错,详细方法请下载最下方的微信登录,分享demo代码

参数说明

  • appid: 应用唯一标识,在微信开放平台提交应用审核通过后获得

  • secret:应用密钥AppSecret,在微信开放平台提交应用审核通过后获得

  • code :填写第一步获取的code参数

  • grant_type:固定值,填authorization_code

最下方向左的箭头表示使用code访问完链接返回的数据,json携带的数据有:

  • access_token:接口调用凭证

  • expires_in:access_token的有效期,一般为7200(秒),也即是两小时

  • refresh_token:用户刷新access_token

  • openid:授权用户唯一标识

  • scope:用户授权的作用域,使用逗号(,)分隔

检查access_token是否有效

由于access_token有效期为两小时,所以进行下一步操作前最好进行一次检查,接口为:
https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

传入的参数为accesss_token和openid。

access_token有效时返回的json是:


{ 
"errcode":0,"errmsg":"ok"
}

失效时的返回数据为:


{ 
"errcode":40003,"errmsg":"invalid openid"
}

如果access_token有效,则跳过下一步,失效时需要刷新或续期access_token。

刷新或续期access_token

接口说明

access_token是调用授权关系接口的调用凭证,由于access_token有效期(目前为2个小时)较短,当access_token超时后,可以使用refresh_token进行刷新,access_token刷新结果有两种:

1.若access_token已超时,那么进行refresh_token会获取一个新的access_token,新的超时时间;

2.若access_token未超时,那么进行refresh_token不会改变access_token,但超时时间会刷新,相当于续期access_token。

refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。

刷新accessToken接口为:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN

参数说明:

  • appid:应用唯一标识

  • grant_type:固定值,填refresh_token

  • refresh_token:填写前面获取到的refresh_token的值

返回的json数据有:

  • access_token:接口调用凭证

  • expires_in:access_token接口调用凭证超时时间,单位(秒)

  • refresh_token:用户刷新access_token

  • openid:授权用户唯一标识

  • scope:用户授权的作用域,使用逗号(,)分隔

获取微信用户详细信息

获取access_token,openid后,就可以用来获取更多用户信息,比如微信昵称,头像,性别等。接口为:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

可获取的json携带的数据有:

  • openid:普通用户的标识,对当前开发者帐号唯一

  • nickname:普通用户昵称

  • sex:普通用户性别,1为男性,2为女性

  • province:普通用户个人资料填写的省份

  • city:普通用户个人资料填写的城市

  • country:国家,如中国为CN

  • headimgurl:用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空

  • privilege:用户特权信息,json数组,如微信沃卡用户为(chinaunicom)

  • unionid:用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

微信官方建议:

开发者最好保存unionID信息,以便以后在不同应用之间进行用户信息互通。

微信登录的流程结束了, 至于开发者需要将那些用户信息上传到自家的app服务器就取决于开发者了。

微信分享

1、微信分享分为微信好友分享,朋友圈分享,当然,还有收藏也是共用分享的接口,无需授权登录即可调用分享接口。

2、由于好友分享,朋友圈分享和收藏只是一个参数的区别,所以下面只讲好友分享,具体的可以下载最下方的微信登录,分享demo源码进行查看。

3、微信可以分享的内容包括,纯文字,图片,链接,音乐,视频,app,emoji表情等。

微信分享流程

1、在你的工程里面新建一个wxapi包,并且新建一个WXEntryActivity,继承Activity,或其他Activity(这两步是必须的,微信开发文档中有提到),详见:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=1417751808&token=&lang=zh_CN

2、并在manifest文件里面加上exported属性,设置为true。

-keep class com.tencent.mm.sdk.** { 
 *; 
 }

微信分享详细代码流程是:


IWXAPI api = WXAPIFactory.createWXAPI(this, APP_ID, false);// 传入申请到的appid,得到一个IWXAPI的实例
api.registerApp(APP_ID);// 将app注册到微信列表,我不知道这是什么意思,有知道的请告诉我,谢谢!

// 开始分享纯文本到给好友
WXTextObject textObj = new WXTextObject();
textObj.text = text;

// 用WXTextObject对象初始化一个WXMediaMessage对象
WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = textObj;

// 发送文本类型的消息时,title字段不起作用
// msg.title = "Will be ignored";
msg.title = "分享文字标题";
msg.description = text;

// 构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("text"); // transaction字段用于唯一标识一个请求
req.message = msg;

req.scene = SendMessageToWX.Req.WXSceneTimeline;// 表示发送场景为朋友圈,这个代表分享到朋友圈
// req.scene = SendMessageToWX.Req.WXSceneSession;//表示发送场景为好友对话,这个代表分享给好友
// req.scene = SendMessageToWX.Req.WXSceneFavorite;// 表示发送场景为收藏,这个代表添加到微信收藏
// 调用api接口发送数据到微信 
api.sendReq(req);

上面大致的表现了一个分享纯文本给好友的场景,如果需要分享到朋友圈,只需要更改req.scene字段值。

1、其中IWXAPI.registerAPP(APP_ID)是官方demo中的一行代码,表示的是将app注册到微信列表,我并不知道有什么用,所谓的微信列表出现在哪儿?该行代码删除后,仍然可以获取登录授权,实现分享等功能。有知道的请告诉我,谢谢!

2、目前笔者遇到无法分享在线图片WXImageObject的问题,分享在线图片时出现分享界面右上角“发送”按钮灰色,无法点击的情况,希望分享成功的朋友告诉我,谢谢!问题如下图

//1、 注册到微信列表有什么用,微信列表在哪儿可以看到
IWXAPI.registerApp(APP_ID);
//2、 我为什么无法使用以下代码分享在线图片
WXImageObject imgObj = new WXImageObject();
imgObj.imageUrl = imgUrl;// 在线图片链接

WXMediaMessage msg = new WXMediaMessage();
msg.mediaObject = imgObj;

Bitmap bmp = BitmapFactory.decodeStream(new URL(url).openStream());
Bitmap thumbBmp = Bitmap.createScaledBitmap(bmp, THUMB_SIZE, THUMB_SIZE, true);
bmp.recycle();
msg.thumbData = Util.bmpToByteArray(thumbBmp, true);

SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("img");
req.message = msg;
req.scene = isTimelineCb.isChecked() ? SendMessageToWX.Req.WXSceneTimeline : SendMessageToWX.Req.WXSceneSession;
api.sendReq(req);

最近有人向我反映生成的apk无法正常运行。在此进行解释:

demo源码生成的apk不可正常运行的原因是:在微信开放平台添加应用时,包名,应用签名,app_id是绑定的。你们签名的apk不起作用,demo代码仅供参考交流。

以上就是图文详解Android开发微信授权登录与微信分享解析的详细内容,更多请关注php中文网其它相关文章!


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • 禁止程序接收鼠标事件的工具_VNC Viewer for Mac(远程桌面工具)免费版
    VNCViewerforMac是一款运行在Mac平台上的远程桌面工具,vncviewermac版可以帮助您使用Mac的键盘和鼠标来控制远程计算机,操作简 ... [详细]
  • 【Windows】实现微信双开或多开的方法及步骤详解
    本文介绍了在Windows系统下实现微信双开或多开的方法,通过安装微信电脑版、复制微信程序启动路径、修改文本文件为bat文件等步骤,实现同时登录两个或多个微信的效果。相比于使用虚拟机的方法,本方法更简单易行,适用于任何电脑,并且不会消耗过多系统资源。详细步骤和原理解释请参考本文内容。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Google Play推出全新的应用内评价API,帮助开发者获取更多优质用户反馈。用户每天在Google Play上发表数百万条评论,这有助于开发者了解用户喜好和改进需求。开发者可以选择在适当的时间请求用户撰写评论,以获得全面而有用的反馈。全新应用内评价功能让用户无需返回应用详情页面即可发表评论,提升用户体验。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 如何在服务器主机上实现文件共享的方法和工具
    本文介绍了在服务器主机上实现文件共享的方法和工具,包括Linux主机和Windows主机的文件传输方式,Web运维和FTP/SFTP客户端运维两种方式,以及使用WinSCP工具将文件上传至Linux云服务器的操作方法。此外,还介绍了在迁移过程中需要安装迁移Agent并输入目的端服务器所在华为云的AK/SK,以及主机迁移服务会收集的源端服务器信息。 ... [详细]
  • PDF内容编辑的两种小方法,你知道怎么操作吗?
    本文介绍了两种PDF内容编辑的方法:迅捷PDF编辑器和Adobe Acrobat DC。使用迅捷PDF编辑器,用户可以通过选择需要更改的文字内容并设置字体形式、大小和颜色来编辑PDF文件。而使用Adobe Acrobat DC,则可以通过在软件中点击编辑来编辑PDF文件。PDF文件的编辑可以帮助办公人员进行文件内容的修改和定制。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文介绍了前端人员必须知道的三个问题,即前端都做哪些事、前端都需要哪些技术,以及前端的发展阶段。初级阶段包括HTML、CSS、JavaScript和jQuery的基础知识。进阶阶段涵盖了面向对象编程、响应式设计、Ajax、HTML5等新兴技术。高级阶段包括架构基础、模块化开发、预编译和前沿规范等内容。此外,还介绍了一些后端服务,如Node.js。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
author-avatar
温济鸿_345
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有