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时序图:

注意:如果开发者需要调用登录接口,需要进行进行开发者认证并交300大洋,官方在线文档说无需缴费,其实那已经是过去式了,只是在线文档没有更新而异。

下面将依次讲解微信授权登录流程。所有网络请求均为GET请求。

1、获取临时票据code

2、获取access_token & openid

3、检查access_token是否有效

4、刷新或续期access_token

5、获取微信用户详细信息

获取临时票据code

前三条向右的箭头

{ // 发出授权申请 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的实例,携带的数据有:

ErrorCode:ERR_OK = 0(用户同意);ERR_AUTH_DENIED = -4(用户拒绝授权);ERR_USER_CANCEL = -2(用户取消) code:用户换取access_token的code,仅在ErrCode为0时有效 state:第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K lang:微信客户端当前语言 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。

3、实现一个IWXAPIEventHandler接口。

微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法

在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例如下:

api.handleIntent(getInent(),this);

当微信发送请求到你的应用,将通过IWXAPIEventHandler接口的onReq方法进行回调,类似的,应用请求微信的响应结果将通过onResp回调。

注意

如果需要混淆代码,为了保证sdk的正常使用,需要在proguard.cfg加上下面两行配置:

-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的问题,分享在线图片时出现分享界面右上角“发送”按钮灰色,无法点击的情况,希望分享成功的朋友告诉我,谢谢!问题如下图

要分享链接,图片,音乐,视频等需要将WXTextObject 对象改成对应的obj对象。详细请下载文章下方的微信登录,分享demo。

后记

由于微信官方demo中并未提供微信登录的代码示例,分享的代码很齐全,可是分享在线图片的代码在我这里却又问题,所以笔者将自己的一些经验和遇到的坑总结在这里,包括了微信第三方登录,微信分享的内容,希望对大家有所帮助。也希望笔者在文中提到的问题有热心人能够解答

//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代码仅供参考交流。

demo源码下载:源码demo

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-11-02 05:27:01

Android开发:微信授权登录与微信分享完全解析的相关文章

Android开发:微信授权登录与微信分享完全解析_Android

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

android-Android 微信授权登录获取code的问题

问题描述 Android 微信授权登录获取code的问题 已经根据微信的接入方式接入了,Manifest文件,WXEntryActivity也放对了位置,代码都是根据SDK文档做的,而且已经跳到微信授权页面,可是点了确认授权之后,并没有回调onResq方法(打的log没有显示出来),所以拿不到code.求各路大神帮忙,最后给出成功案例啦 解决方案 http://bbs.csdn.net/topics/390931372 解决方案二: 微信登录的code获取坑爹的微信授权登录关于微信支付andro

android微信授权登录接口

问题描述 android微信授权登录接口 code已经拿到怎么拿到token请求已经发送出去没有返回,有没有详细的请求函数,新手求助 解决方案 发出数据没有返回你应该先检查你的服务器在外网能不能访问到,你的地址和端口对不对. 解决方案二: 百度友盟.他给你封装好了,你直接拿来用.

Android实现第三方授权登录、分享以及获取用户资料_Android

由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo.实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相交流.学习和参考,只求能和大家共同进步.希望能多多支持! 这篇文章中,我们使用到了Share SDK,它是为iOS.Android.WP8的APP提供社会化功能的一个组件,目前支持如QQ.微信.新浪微博.腾讯微博.开心网.人人网.豆瓣.网易微博.搜狐微博.facebook.twitter.google+

Android实现第三方授权登录、分享以及获取用户资料

由于公司项目的需要,要实现在项目中使用第三方授权登录以及分享文字和图片等这样的效果,几经波折,查阅了一番资料,做了一个Demo.实现起来的效果还是不错的,不敢独享,决定写一个总结的教程,供大家互相交流.学习和参考,只求能和大家共同进步.希望能多多支持! 这篇文章中,我们使用到了Share SDK,它是为iOS.Android.WP8的APP提供社会化功能的一个组件,目前支持如QQ.微信.新浪微博.腾讯微博.开心网.人人网.豆瓣.网易微博.搜狐微博.facebook.twitter.google+

android开发如何实现一键关注微信公众号功能? 微信有提供api吗

问题描述 android开发如何实现一键关注微信公众号功能? 微信有提供api吗 android开发如何实现一键关注微信公众号功能,微信有提供api吗? 求大神指导..谢谢 解决方案 有的,你百度一下就知道了 简单问题简单解决!!!!!!!!!!!!!!!!!!!!11 解决方案二: 现在已经没有一键关注的功能了.接口被封了. 解决方案三: 遍历一遍,一个个关注咯

Android 开发 使用WebUploader解决安卓微信浏览器上传图片中遇到的bug_Android

先给大家分析下微信浏览器上传图片bug的原因 微信在新版本中采用的是自己的X5内核浏览器,而在较老的版本中还有可能是安卓的原生浏览器.具体的环境我也不太了解,但是经过实际多台安卓机型的测试,我采取的方案可以基本确保在安卓机中微信浏览器的成功上传.苹果机型没问题,因为微信的ios客户端使用的是Safari的内核,没有各种坑,且效果最好. 这里给出一个 WebUploader 官方关于移动端适配的 issues 链接.里面提供的方法确实有效,但就是解决的方案并没有很清楚的展示出来,从该issues中

Android开发中用户登录信息怎么关联整个APP

问题描述 Android开发中用户登录信息怎么关联整个APP 5C Android开发,App的某些功能显示是用户登录后才能用的.可是用户登录后怎么关联整个APP呢? 解决方案 用一个全局变量(单例类)保存用户信息. 解决方案二: 看你的App需不需要实现自动登录功能,如果需要的话可以存到SharedPreferences中 解决方案三: 你可以写一个reciever,监听进程的启动和停止,进程package就是你项目的package,是android唯一的.

android开发,模拟登录时的问题,求助大神~~

问题描述 android开发,模拟登录时的问题,求助大神~~ 尝试做一个学校的教务系统android app,模拟登陆过程都没有问题,使用的是asynhttpclient.只是登陆成功后,只会跳转至如图中(2)这个url中,里面content的内容只是是:{success:true,tips:'登录成功',newsms:0,uid:'xxxxxxxxx'},没有其他内容.所以AsyncHttpResponseHandler的onSuccess()方法得到的也只是这个页面的信息,而我想要进一步操作