微信分享及授权登录
分享
流程:进行sdk测初始化(就是注册第三方应用的过程)通过调用微信的sdk,打开微信(携带需要分享的数据),用户在微信中进行相应的操作,第三方应用得到相应的回调,如是否分享成功。
开发前需要了解的
- 分享到哪里(朋友or朋友圈)
- 分享的数据类型有哪些
- 回调的类型(Type及Code)
分享到哪里
- 朋友:WXSceneSession
- 朋友圈:WXSceneTimeline
微信分享的常见数据类型
- 文本:WXTextObject
- 图片:WXImageObject
- 音乐:WXMusicObject
- 视频:WXVideoObject
- 网页:WXWebpageObject(其中,网页的分享是开发中最常见。)
微信分享的回调
微信的回调需要在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity,实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法。在WXEntryActivity中将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAPI接口的handleIntent方法。
type
- COMMAND_SENDAUTH:认证请求
- COMMAND_SENDMESSAGE_TO_WX:分享请求
code
- ERR_AUTH_DENIED:认证被否决
- ERR_COMM:一般错误
- ERR_OK:正确返回
- ERR_SENT_FAILED:发送失败
- ERR_UNSUPPORT:不支持
- ERR_USER_CANCEL:用户取消
代码的实现
注册到微信
/*要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id可以把操作放在程序的入口*/
IWXAPI api = WXAPIFactory.createWXAPI(this,ShareID.WEIXIN_ID,true);
api.registerApp(ShareID.WEIXIN_ID);
响应用户的分享操作
这里已分享一个H5页面为例。需要注意的地方有:
- 图片的大小:thumbData,限制内容大小不超过32KB
- description:1kb,title:512byte
private void shareWebPage() {
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl = "http://www.baidu.com";
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title = "title";
msg.description = "WebPage Description";
Bitmap thumb = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
msg.thumbData = Util.bmpToByteArray(thumb, true);
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message = msg;
req.scene = SendMessageToWX.Req.WXSceneTimeline;
iwxapi.sendReq(req);
}
WXEntryActivity中的回调
在
onResp(BaseResp baseResp)
方法中,可以获取getType()
,判断是不是分享的操作。通过resp.code
来判断有没有成功。在上面的code中列出了code的6种类型
微信授权登录
流程:用户点击微信登录,第三方应用通过sdk调起微信的一个授权页面,用户操作后会将回调传回WXEntryActivity类中,然后判断,如果成功,就会得到一个code,通过code再请求微信的接口,获取一个access_token,之后可以利用access_token这个参数请求微信接口,获取用户的个人信息。
开发前需要了解的
- 微信的授权登录需要安装微信客户端。
- 授权作用域:代表第三方应用的接口权限
常见:snsapi_userinfo,用来获取用户的个人信息。- 获取access_token,个人信息需要进行网络请求。
代码的实现
请求授权
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "my_test";
iwxapi.sendReq(req);
其中:state为非必要参数,用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验。
WXEntryActivity中的回调
当用户无论取消授权还是完成授权,同样会来的这里,
/*获取code*/
switch (baseResp.getType()) {
case ConstantsAPI.COMMAND_SENDAUTH:
SendAuth.Resp resp = (SendAuth.Resp) baseResp;
String code = resp.code;
Log.i(TAG, "code:" + code);
getToken(code);
break;
}
通过code获取access_token。
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
利用access_token获取用户的个人信息
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
可以自行打印看看返回的JSON数据。
总结
关于微信的sdk,这里只是一个更加清晰的流程,介绍。在开发过程中还有许多要注意的地方,如WXEntryActivity的关闭,分享的图片清晰度,大小的限制直接的平衡,授权登录时候的网络请求。
一个App中基本上不可能只集成一个微信,需要同时处理新浪,QQ等。
在调试过程去,如果换了appid,签名信息或者其它,代码如果没问题,就是不能分享,可以尝试清空微信的数据。