ShareSDK 微信分享失败问题的解决

时间:2022-09-14 19:21:12

今天在用 ShareSDK 做第三方分享的时候发现微信分享老是失败,点击微信分享按钮后首先提示“分享操作正在后台进行”,然后接着就提示“分享失败”。这特么是什么鬼。

既然问题出现了,那么就找原因解决呗,首先检查在微信开放平台上注册的应用包名,签名,AppKey,AppSecret 等等是不是完全正确,有没有填错或者忘记改的情况。排除了这些第几错误之后就是去查代码了,是不是代码哪里写的不对。

在将文档来来回回翻了几遍,一顿百度,Google 之后,终于找到了问题的原因,特么又是被那些写文档的给坑了(心里一万头*奔过,去踩死那些写文档的吧)。

文档上说的很简单,分享的时候只要调用 OnekeyShare()代码就行了(代码在官方文档里面有,这里不贴了),就这么简单?对,就这么简单,调用吧,少年!

你开开心心了调用了那段代码,你会发现结果不是你想要的,而且如果你把那段代码里面的某一行删掉的话,你会发现你没法分享了,直接分享失败。在 Google 了很久之后终于找到了解决办法,直接上代码:

/**
* 一键分享功能
*/

public static void showShare(final Context context, final Share entity) {
final OnekeyShare oks = new OnekeyShare();
//关闭sso授权
oks.disableSSOWhenAuthorize();

/**
* 下面的这些参数必须要写,某些不写会导致某些平台分享失败
*/

// title标题,印象笔记、邮箱、信息、微信、人人网和QQ空间使用
oks.setTitle(entity.title);
// titleUrl是标题的网络链接,仅在人人网和QQ空间使用
oks.setTitleUrl(entity.shoreUrl);
// text是分享文本,所有平台都需要这个字段
oks.setText(entity.intro);
// imagePath是图片的本地路径,Linked-In以外的平台都支持此参数,
// 使用 imagePath 必须保证SDcard下面存在此张图片
//imagePath,imageUrl 必须保留一个,否则微信不能分享,或者分享过去的图片都是应用的 logo
oks.setImageUrl(Urls.BASE_URL + entity.pic);
// url仅在微信(包括好友和朋友圈)中使用
oks.setUrl(entity.shoreUrl);
// comment是我对这条分享的评论,仅在人人网和QQ空间使用
oks.setComment("我是测试评论文本");
// site是分享此内容的网站名称,仅在QQ空间使用
oks.setSite(context.getString(R.string.app_name));
// siteUrl是分享此内容的网站地址,仅在QQ空间使用
oks.setSiteUrl(entity.shoreUrl);

/**
* 真正分享出去的内容实际上是由下面的这些参数决定的,根据平台不同分别配置
*/

oks.setShareContentCustomizeCallback(new ShareContentCustomizeCallback() {
@Override
public void onShare(Platform platform, cn.sharesdk.framework.Platform.ShareParams paramsToShare) {
if (Wechat.NAME.equals(platform.getName()) ||
WechatMoments.NAME.equals(platform.getName())) {
paramsToShare.setShareType(Platform.SHARE_WEBPAGE);
paramsToShare.setUrl(entity.shoreUrl);
paramsToShare.setText(entity.intro);
paramsToShare.setImageUrl(Urls.BASE_URL + entity.pic);
paramsToShare.setTitle(entity.title);
}
if (SinaWeibo.NAME.equals(platform.getName())) {
paramsToShare.setText(entity.intro);
paramsToShare.setUrl(entity.shoreUrl);
paramsToShare.setImageUrl(Urls.BASE_URL + entity.pic);
}
if (QQ.NAME.equals(platform.getName())) {
paramsToShare.setTitle(entity.title);
paramsToShare.setTitleUrl(entity.shoreUrl);
paramsToShare.setText(entity.intro);
paramsToShare.setUrl(entity.shoreUrl);
paramsToShare.setImageUrl(Urls.BASE_URL + entity.pic);
}
}
});

//启动分享GUI
oks.show(context);
}

上面的代码是我根据我项目的需要简单封装了一个方法,要用的时候直接调一下,不能直接拿去用,请自行修改方法中的参数。

在上面的代码中,前半部分跟官方文档一样,配置各种参数,后半部分是根据各个平台的不同去分别进行配置不同的参数。

细心的人会发现后半部分里面的参数在前半部分里面都配置过了,那能不能把前面的删掉,只保留后面的呢?答案是不行,如果把前面的某些参数去掉就会导致分享失败(虽然它没用),我已知的就是

oks.setImagePath("/sdcard/test.jpg");

这一行去掉就会导致微信分享失败,文档上写的是“确保SDcard下面存在此张图片”,其实不需要,只要把这行原样写在那里就行,删掉它的话反而会失败,呵呵哒!

我不得不说这帮写文档的家伙真是害人不浅,照着文档去做绝对会把你带到坑里面。

关于各个平台具体的分享参数请看这里,这个也是他们的文档,但是是藏在后面的,在快速集成里面是找不到链接的,而且也没有 Demo 可以让你参考怎么用,你如果只做到快速集成那里的话,是达不到功能要求的,,,,

最后补充说一点,微信和新浪平台上都需要上传APK签名,所以他们都有一个签名生成工具,不过还是推荐用微信的,因为新浪的工具生成的签名好像有问题,,,,工具下载地址在这里