社会化登录分享-微信SDK接入

2017-01-14 15:49:46来源:http://www.jianshu.com/p/71b6be4d1e0b作者:Tsy远人点击

第七城市

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


具体代码项目Github地址:https://github.com/tsy12321/SocialSDKAndroid


0 系列文章

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


1 官方文档

微信的官方接入文档:


https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN


2 登录授权

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


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


https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317851&token=&lang=zh_CN


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


code 调出微信授权确定后会返回的code,需要用这个code去换取access_token
access_token 授权成功后都是微信提供的接口都是通过access_token去获取的。由于access_token是code+appid+secret请求后获取的,所以建议客户端获得到code后,该接口放在服务端进行。(这边封装的sdk secret是放在本地,调用比较方便,如果是对安全性要求较高的建议将这个步骤放到服务端进行,客户端不要存放secret)
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。


@Override
public 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 object
WXWebpageObject 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 object
WXTextObject 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 object
WXImageObject imageObject = new WXImageObject();
//image限制10M
imageObject.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 ;
}
//压缩缩略图到32kb
if(msg.thumbData != null && msg.thumbData.length > '耀') { //微信sdk里面判断的大小
msg.thumbData = BitmapUtils.compressBitmap(msg.thumbData, '耀');
}
//发起request
SendMessageToWX.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");
}
}

分享中注意几点:


图片分享的图片大小在10M内
所有的缩略图要控制在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包同时引用进项目,即可调用微信相关的登录和分享。


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




第七城市

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台