https://wohugb.gitbooks.io/wechat/content/qrconnent/refresh_token.htmlhtml
http://blog.csdn.net/xiong_it/article/details/48317527git
PS: access_token是微信认证成功和微信平台作交互用的,access_token有2小时有效期。若是access_token过时后,使用refresh_token得到新的access_token。refresh_token的有效期为30天,30天后须要用户从新登陆微信了json
在移动互联网浪潮中,联网APP已经把单机拍死在沙滩上,不少公司都但愿自家应用可以有一套账号系统,但是许多用户却并不必定买帐:我凭啥注册你家 应用的账号?微博,微信,QQ几乎成了每一个人手机中的必装应用,因而微信,微博,QQ说了:来来来,大家均可以用我家的账号登陆你家应用,只要你遵循OAuth2.0协议标准就 行。因而第三方社交账号登录成为了许多新兴应用的选择,因为腾讯官方微信开放平台的在线文档相对最新的SDK有些出入,而且登陆相关的文档结构次序有些紊 乱,今天就把个人一些经验记录在此,对微信开放平台官方的在线文档进行必定的整理。同时微信分享能够扩大自身APP影响力,因而微信分享功能也是不少开发 者须要的功能,一并整理在此,但愿能对后来的同道朋友有所帮助。
转载请注明原做者xiong_it和原文链接:http://blog.csdn.net/xiong_it/article/details/48317527,谢谢!api
微信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大洋,官方在线文档说无需缴费,其实那已是过去式了,只是在线文档没有更新而异。bash
下面将依次讲解微信受权登陆流程。全部网络请求均为GET请求。服务器
一、获取临时票据code 二、获取access_token & openid 三、检查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的实例,携带的数据有:
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包构建工程。
最后一条向右的箭头表示:使用获得的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代码,或者点击下方连接直接搜索
谷歌搜索:Android 访问Https连接
百度搜索:Android 访问Https连接
参数说明
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有效期为两小时,因此进行下一步操做前最好进行一次检查,接口为:
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有效期(目前为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、4六、6四、9六、132数值可选,0表明640*640正方形头像),用户没有头像时该项为空 privilege:用户特权信息,json数组,如微信沃卡用户为(chinaunicom) unionid:用户统一标识。针对一个微信开放平台账号下的应用,同一用户的unionid是惟一的。
微信官方建议:
开发者最好保存unionID信息,以便之后在不一样应用之间进行用户信息互通。
微信登陆的流程结束了, 至于开发者须要将那些用户信息上传到自家的app服务器就取决于开发者了。
一、微信分享分为微信好友分享,朋友圈分享,固然,还有收藏也是共用分享的接口,无需受权登陆便可调用分享接口。 二、因为好友分享,朋友圈分享和收藏只是一个参数的区别,因此下面只讲好友分享,具体的能够下载最下方的微信登陆,分享demo源码进行查看。 三、微信能够分享的内容包括,纯文字,图片,连接,音乐,视频,app,emoji表情等。
一、在你的工程里面新建一个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
二、并在manifest文件里面加上exported属性,设置为true。
三、实现一个IWXAPIEventHandler接口。
微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法
在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法,示例以下图:
当微信发送请求到你的应用,将经过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字段值。
一、其中IWXAPI.registerAPP(APP_ID)是官方demo中的一行代码,表示的是将app注册到微信列表,我并不知道有什么用,所谓的微信列表出如今哪儿?该行代码删除后,仍然能够获取登陆受权,实现分享等功能。有知道的请告诉我,谢谢!
二、目前笔者遇到没法分享在线图片WXImageObject的问题,分享在线图片时出现分享界面右上角“发送”按钮灰色,没法点击的状况,但愿分享成功的朋友告诉我,谢谢!问题以下图
要分享连接,图片,音乐,视频等须要将WXTextObject 对象改为对应的obj对象。详细请下载文章下方的微信登陆,分享demo。
因为微信官方demo中并未提供微信登陆的代码示例,分享的代码很齐全,但是分享在线图片的代码在我这里却又问题,因此笔者将本身的一些经验和遇到的坑总结在这里,包括了微信第三方登陆,微信分享的内容,但愿对你们有所帮助。也但愿笔者在文中提到的问题有热心人可以解答
//一、 注册到微信列表有什么用,微信列表在哪儿能够看到 IWXAPI.registerApp(APP_ID); //二、 我为何没法使用如下代码分享在线图片 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);
update:20150917
最近有人向我反映生成的apk没法正常运行。在此进行解释:
demo源码生成的apk不可正常运行的缘由是:在微信开放平台添加应用时,包名,应用签名,app_id是绑定的。大家签名的apk不起做用,demo代码仅供参考交流。
demo源码下载:http://download.csdn.net/detail/xiong_it/9099037
udapte:20160507
感谢6楼评论,指正了两个笔误,已修正,若是读者只想实现分享功能,能够参考笔者的另外一篇博客: Anroid开发:友盟分享SDK v5使用指南(Android Studio)
update:20160711
笔者前段时间更新一篇博文:《微信支付SDK接入指南》。有兴趣的能够前往阅读。