本篇在基于之前封装的SocialSDK的项目上增加了微信SDK的登录授权和分享。简单介绍了微信登录分享的接入和使用注意

具体代码项目Github地址:github.com/tsy12321/So…

0 系列文章

系列一 Android SDK的二次封装和使用
系列二 源码解析
系列三 微信SDK接入
系列四 QQ SDK接入
系列五 新浪微博 SDK接入

1 官方文档

微信的官方接入文档:

open.weixin.qq.com/cgi-bin/sho…

2 登录授权

微信的登录授权是基于OAuth2.0标准。

一整套的授权流程官方文档很清晰:

open.weixin.qq.com/cgi-bin/sho…

这里面着重理解几个概念:

  1. code 调出微信授权确定后会返回的code,需要用这个code去换取access_token
  2. access_token 授权成功后都是微信提供的接口都是通过access_token去获取的。由于access_token是code+appid+secret请求后获取的,所以建议客户端获得到code后,该接口放在服务端进行。(这边封装的sdk secret是放在本地,调用比较方便,如果是对安全性要求较高的建议将这个步骤放到服务端进行,客户端不要存放secret)
  3. refresh_token access_token具有时效性。当access_token失效后可以通过refresh_token获取一个新的access_token。但是如果refresh_token过期后,只能再次调用客户端进行授权。

2.1 Android 接入授权代码

先初始化wxapi并注册:

this.mWXApi = WXAPIFactory.createWXAPI(context.getApplicationContext(), this.mConfig.appId);this.mWXApi.registerApp(this.mConfig.appId);复制代码

授权登录时调用:

SendAuth.Req req1 = new SendAuth.Req();
req1.scope = sScope;
req1.state = "snsapi_userinfo,snsapi_friend,snsapi_message";if(!this.mWXApi.sendReq(req1)) {this.mAuthListener.onError(this.mConfig.getName(), "sendReq fail");LogUtils.e("wxapi sendReq fail");
}复制代码

回调结果:

回调处理统一见后面解释。

3 分享

微信对应5种分享,2个渠道(微信会话、朋友圈)

so!根据分享的媒介类型调用微信不同的api。

@Overridepublic void share(IShareMedia shareMedia, ShareListener shareListener) {this.mShareListener = shareListener;WXMediaMessage msg = new WXMediaMessage();String type = "";if(shareMedia instanceof ShareWebMedia) {       //网页分享ShareWebMedia shareWebMedia = (ShareWebMedia) shareMedia;type = "webpage";//web objectWXWebpageObject webpageObject = new WXWebpageObject();webpageObject.webpageUrl = shareWebMedia.getWebPageUrl();msg.mediaObject = webpageObject;msg.title = shareWebMedia.getTitle();msg.description = shareWebMedia.getDescription();msg.thumbData = BitmapUtils.bitmap2Bytes(shareWebMedia.getThumb());} else if(shareMedia instanceof ShareTextMedia) {   //文字分享ShareTextMedia shareTextMedia = (ShareTextMedia) shareMedia;type = "text";//text objectWXTextObject textObject = new WXTextObject();textObject.text = shareTextMedia.getText();msg.mediaObject = textObject;msg.description = shareTextMedia.getText();} else if(shareMedia instanceof ShareImageMedia) {  //图片分享ShareImageMedia shareImageMedia = (ShareImageMedia) shareMedia;type = "image";//image objectWXImageObject imageObject = new WXImageObject();//image限制10MimageObject.imageData = BitmapUtils.compressBitmap(BitmapUtils.bitmap2Bytes(shareImageMedia.getImage()), 10 * 1024 * 1024);msg.mediaObject = imageObject;//直接缩放图片Bitmap thumb = Bitmap.createScaledBitmap(shareImageMedia.getImage(), 200, 200, true);msg.thumbData = BitmapUtils.bitmap2Bytes(thumb);thumb.recycle();} else if(shareMedia instanceof ShareMusicMedia) {  //音乐分享ShareMusicMedia shareMusicMedia = (ShareMusicMedia) shareMedia;type = "music";WXMusicObject musicObject = new WXMusicObject();musicObject.musicUrl = shareMusicMedia.getMusicUrl();msg.mediaObject = musicObject;msg.title = shareMusicMedia.getTitle();msg.description = shareMusicMedia.getDescription();msg.thumbData = BitmapUtils.bitmap2Bytes(shareMusicMedia.getThumb());} else if(shareMedia instanceof ShareVideoMedia) {      //视频分享ShareVideoMedia shareVideoMedia = (ShareVideoMedia) shareMedia;type = "video";WXVideoObject videoObject = new WXVideoObject();videoObject.videoUrl = shareVideoMedia.getVideoUrl();msg.mediaObject = videoObject;msg.title = shareVideoMedia.getTitle();msg.description = shareVideoMedia.getDescription();msg.thumbData = BitmapUtils.bitmap2Bytes(shareVideoMedia.getThumb());} else {if(this.mShareListener != null) {this.mShareListener.onError(this.mConfig.getName(), "shareMedia error");}return ;}//压缩缩略图到32kbif(msg.thumbData != null && msg.thumbData.length > '耀') {        //微信sdk里面判断的大小msg.thumbData = BitmapUtils.compressBitmap(msg.thumbData, '耀');}//发起requestSendMessageToWX.Req req = new SendMessageToWX.Req();req.message = msg;req.transaction = buildTransaction(type);if(this.mConfig.getName() == PlatformType.WEIXIN) {     //分享好友req.scene = SendMessageToWX.Req.WXSceneSession;} else if(this.mConfig.getName() == PlatformType.WEIXIN_CIRCLE) {      //分享朋友圈req.scene = SendMessageToWX.Req.WXSceneTimeline;}if(!this.mWXApi.sendReq(req)) {if(this.mShareListener != null) {this.mShareListener.onError(this.mConfig.getName(), "sendReq fail");}LogUtils.e("wxapi sendReq fail");}}复制代码

分享中注意几点:

  1. 图片分享的图片大小在10M内
  2. 所有的缩略图要控制在32KB

然后还有一些其他参数限制可以参考微信sdk资源下载下来的本地Api文档。

如果参数错误sendReq会返回false,无法分享。

4 微信结果回调

微信要求项目中定死 wxapi.WXEntryActivity这个文件,回调会调用这个文件。所以我们自定义了一个WXCallbackActivity,将所有内容写在这个文件中,然后具体项目中的WXEntryActivity只需要继承该Activity即可。

WXCallbackActivity见下:

public abstract class WXCallbackActivity extends Activity implements IWXAPIEventHandler {protected WXHandler mWXHandler = null;public WXCallbackActivity() {}protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);SocialApi api = SocialApi.get(this.getApplicationContext());this.mWXHandler = (WXHandler)api.getSSOHandler(PlatformType.WEIXIN);this.mWXHandler.onCreate(this.getApplicationContext(), PlatformConfig.getPlatformConfig(PlatformType.WEIXIN));this.mWXHandler.getWXApi().handleIntent(this.getIntent(), this);}protected final void onNewIntent(Intent paramIntent) {super.onNewIntent(paramIntent);SocialApi api = SocialApi.get(this.getApplicationContext());this.mWXHandler = (WXHandler)api.getSSOHandler(PlatformType.WEIXIN);this.mWXHandler.onCreate(this.getApplicationContext(), PlatformConfig.getPlatformConfig(PlatformType.WEIXIN));this.mWXHandler.getWXApi().handleIntent(this.getIntent(), this);}public void onResp(BaseResp resp) {if(this.mWXHandler != null && resp != null) {try {this.mWXHandler.getWXEventHandler().onResp(resp);} catch (Exception var3) {;}}this.finish();}public void onReq(BaseReq req) {if(this.mWXHandler != null) {this.mWXHandler.getWXEventHandler().onReq(req);}this.finish();}
}复制代码

其中发现回调的数据主要是在onResp中处理,然后在WXCallbackActivity中又将最终处理放在了WXHandler中。

WXHandler的回调处理:


public WXHandler() {this.mEventHandler = new IWXAPIEventHandler() {public void onResp(BaseResp resp) {int type = resp.getType();switch(type) {case ConstantsAPI.COMMAND_SENDAUTH:     //授权返回WXHandler.this.onAuthCallback((SendAuth.Resp)resp);break;case ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX:        //分享返回WXHandler.this.onShareCallback((SendMessageToWX.Resp)resp);break;}}public void onReq(BaseReq req) {}};
}//验证回调
protected void onAuthCallback(SendAuth.Resp resp) {switch (resp.errCode) {case BaseResp.ErrCode.ERR_OK:       //授权成功getAuthWithCode(resp.code);break;case BaseResp.ErrCode.ERR_USER_CANCEL:      //授权取消if(this.mAuthListener != null) {this.mAuthListener.onCancel(PlatformType.WEIXIN);}break;default:    //授权失败CharSequence err = TextUtils.concat(new CharSequence[]{"weixin auth error (", String.valueOf(resp.errCode), "):", resp.errStr});if(mAuthListener != null) {mAuthListener.onError(PlatformType.WEIXIN, err.toString());}break;}
}复制代码

注意,在回调的一些常量定义中(ConstantsAPI.COMMAND_SENDAUTH、BaseResp.ErrCode.ERR_OK等)都在本地的API中有定义。所以,如果有问题,多看看微信提供的API文档。

微信本地API文档

结尾

以上即实现了微信平台的接入,当接入方需要接入微信部分时,只需要同时将social_sdk.jar和微信的sdk包同时引用进项目,即可调用微信相关的登录和分享。

本篇结束,后面还会继续接入其他平台。。。

社会化登录分享-微信SDK接入相关推荐

  1. 社会化登录分享-Android SDK的二次封装和使用

    本系列文章将第三方的登录分享功能进行二次封装,统一接口调用,简化了接不同平台登录分享的步骤. 0 系列文章 系列一 Android SDK的二次封装和使用 系列二 源码解析 系列三 微信SDK接入 系 ...

  2. php 屏蔽微信分享,微信sdk实现禁止微信分享(使用原生php实现)

    在此之前我们已经学习过微信的sdk使用,但是之前实在easyWechat的php插件基础上实现的,具体可以参考:https://www.wj0511.com/site/detail.html?id=3 ...

  3. Laravel 社会化登录之微信网页授权登录

    前端在授权微信登录时需要获取用户的微信信息,比如 openId ,头像等信息. 微信网页授权文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&a ...

  4. cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3

    cocos2dx3.15接入微信SDK实现登录和分享android studio2.3.3,首先开始呢,我必须得吐槽一下网上的教程以及微信开放平台官网,网上的教程主要是太老了代码虽然都能用但是不完整有 ...

  5. 快速接入 微信微博QQ钉钉 原生登录分享

    使用 微博.QQ.微信.钉钉 原生 SDK 接入,提供这些平台的登录.分享功能支持.针对业务逻辑对各个平台的接口进行封装,对外提供一致的表现,在减轻接入压力的同时,又能获得原生 SDK 最大的灵活性. ...

  6. 「开源」快速接入微信微博QQ钉钉登录分享

    使用 微博.QQ.微信.钉钉 原生 SDK 接入,提供这些平台的登录.分享功能支持.针对业务逻辑对各个平台的接口进行封装,对外提供一致的表现,在减轻接入压力的同时,又能获得原生 SDK 最大的灵活性. ...

  7. untiy接入微信SDK实现iOS分享

    untiy接入微信SDK实现iOS分享功能 说明: 使用平台:mac电脑 Unity处理 进入微信开发者官网申请应用 2.下载微信的开发工具包sdk导入untiy的 Assest/Plugins/iO ...

  8. android sdk引入 微信分享_微信分享sdk接入总结

    本文主要讲解android微信分享sdk的接入和中级遇到的一些问题解决. 首先需要在微信开放平台申请账号,新建一个应用,生成AppID. 1 下载微信SDK sample demo源码和生成签名的工具 ...

  9. Android应用之——微信微博第三方sdk登录分享使用过程中的一些常见问题

    前言 最近在使用第三方登录和分享的过程中遇到了很多问题,一方面可以归结为自己经验的不足,另一方面其实也说明了官方文档的含糊不清.这篇博文不会写关于如何使用第三方登录分享,因为官方文档已经写明了步骤,这 ...

最新文章

  1. 基础设计模式:单例模式+工厂模式+注册树模式
  2. Android 系统自动重启Bug(高通平台)
  3. python语言特性-------python2.7教程学习【廖雪峰版】(一)
  4. qtablewidget 选中不改变背景_C4D制作不一样的核壳结构
  5. python 判断当前时间是否为零点
  6. gradle学习(19)-log系统
  7. 去海南旅游什么时间段去最好,哪里最好玩?
  8. java哪个软件编程好学吗_自学编程:Java和C语言相比哪个好?哪个更值得学习?...
  9. JAVA有没有比robot更好用的_使用Java/Python提高工作效率01-Java Robot类
  10. 二叉树的深度(剑指 Offer 55 - I)
  11. 用于文本去重(相似度计算)的Simhash算法学习及python实现(持续学习中)
  12. 生物信息相关国家自然科学基金汇总(持续更新中)
  13. Gin源码之gin.Context结构体及其方法
  14. 费解的开关 (蓝桥杯倒计时12天)
  15. 30个响应式大背景网页设计欣赏
  16. 分享112个HTML娱乐休闲模板,总有一款适合您
  17. 效率工具之SecureCRT
  18. 工作快两年了!斗胆谈谈校招社招技术面试那些事
  19. 微信小程序 错题记事本 111111
  20. Xilinx官网大全__PowerPC 架构

热门文章

  1. 计算机上九个数代表什么音乐,backaudio泊声科普背景音乐系统一个分区最多能带几个喇叭...
  2. Java多线程基础(一,java模拟面试视频
  3. 车机高德导航Linux版升级,高德地图车机版 最新版本V2.8.2地图数据+软件更新方法...
  4. 开源算法FMix:用于深度学习中增强混合样本数据增强
  5. 计算机与经济学数据分析,经济管理中的计算机应用:Excel数据分析统计预测和决策模拟...
  6. android 日志框架封装,FLog: 一个基于函数组合的Android日志框架,拥有极简的结构和极高的灵活性、扩展性...
  7. Cesium控制Entity闪烁,闪烁时间可以设定
  8. 2006年网站入侵技术综合总结
  9. Spring Boot定时发送短信
  10. 简谈微信小程序的优劣势?