前言
在移动互联网浪潮中,联网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的实例,携带的数据有:
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,接口为:
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;// 构造一个ReqSendMessageToWX.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中文网其它相关文章!