当前位置: 主页 > 建站知识 > APP开发

微信分享-微信分享应用向微信发送请求是使用sendReq方法至于怎么配置

发布时间:2023-06-18 22:18   浏览次数:次   作者:佚名

准备打算写一个专题关于一些第三方的SDK的使用,主要是因为有些三方SDK在开发时会碰到一些问题,所以打算记录下。接入功能基本都是挺方便的,主要就是会碰上一些坑。每次遇到新的坑都会抽时间重新更新文章

这里就先说说微信分享的功能。

如果你知道怎么做分享,只是在使用的过程中碰到问题,可以直接跳过 标题一 直接看 标题二

时间描述

2019.5.9

写简单的导入方式和坑1、2

一.接入微信分享SDK1.sdk下载地址

里面有SDK的文件和接入指南(如果实在看不懂,可以下载Demo来看)

2.接入

(1)在Gradle中引用或者导入jar包

(2)配置manifest







WXEntryActivity这个类是主要用来接收微信回调的,如果接过微信的东西一般就会比较熟悉,比如微信分享、微信支付等等,都会要求你的工程加入这个类。

(3)初始化SDK

IWXAPI wxAPI = WXAPIFactory.createWXAPI(context, appId, true);
wxAPI.registerApp(appId);

appId就是在微信后台申请参数的时候生成的一个参数。

注意一下,无论你看文档还是Demo,当前版本给出测试用的appId是wx88888888,设置这个值得话会跳界面,不过会无法分享,这个问题在下面会详细说。

(4)跳转微信分享

应用向微信发送请求是使用sendReq方法

wxAPI.sendReq(req);

至于怎么配置分享的参数,文档里把每种类型都说得很请求,Demo也有写。

微信分享微网站_微信分享_微信公众账号分享到新浪微博

这里就举个最简单的例子,分享一条消息到微信,点开后是打开一个连接,看官网文档的说明

//初始化一个WXWebpageObject,填写url
WXWebpageObject webpage = new WXWebpageObject();
webpage.webpageUrl ="网页url";
//用 WXWebpageObject 对象初始化一个 WXMediaMessage 对象
WXMediaMessage msg = new WXMediaMessage(webpage);
msg.title ="网页标题 ";
msg.description ="网页描述";
Bitmap thumbBmp = BitmapFactory.decodeResource(getResources(), R.drawable.send_music_thumb);
msg.thumbData =Util.bmpToByteArray(thumbBmp, true);
//构造一个Req
SendMessageToWX.Req req = new SendMessageToWX.Req();
req.transaction = buildTransaction("webpage");
req.message =msg;
req.scene =mTargetScene;
req.userOpenId = getOpenId();
//调用api接口,发送数据到微信
api.sendReq(req);

    private String buildTransaction(final String type) {
        return (type == null) ? String.valueOf(System.currentTimeMillis()) : type + System.currentTimeMillis();
    }

其实就直接抄这段就行了,不过设置图片应该是这样

req.setThumbImage(bitmap);

再看看这个req.scene属性

// 分享到微信
 req.scene = SendMessageToWX.Req.WXSceneSession;

// 分享到朋友圈
req.scene = SendMessageToWX.Req.WXSceneTimeline ;

分享后差不多就是这样一个效果

微信分享微网站_微信分享_微信公众账号分享到新浪微博

还要说一个问题是,按照文档和demo的做法是这个图片的设置都是设置bitmap,都是本地的,那如果是给一个网上图片的url怎么办,我不知道有没有办法能直接设置(QQ分享是可以的),目前我的做法是根据url下载图片成bitmap格式再设置,如果有人知道能直接设置图片url微信分享,劳烦在评论指导一下。

(5)接收微信的回调

接收分享的回调我感觉就是坑最多的。按照文档的Demo的写法,要在WXEntryActivity写回调逻辑(这一块建议直接可以看Demo中的WXEntryActivity类),我这里就写一个简单的吧

public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        IWXAPI wxAPI = 获取到你之前初始化的IWXAPI ;
        if (wxAPI != null){
            wxAPI.handleIntent(getIntent(), this);
        }else{
           // callback是个假设,你可以用自己的办法把数据给回调
            callback.result("分享失败");
        }
    }
    @Override
    public void onReq(BaseReq baseReq) {
    }
    @Override
    public void onResp(BaseResp baseResp) {
        // 返回结果
        if (baseResp != null){
            if (baseResp.errCode == BaseResp.ErrCode.ERR_OK){
                callback.result( "分享成功");
            }else {
                callback.result("分享失败,错误码:"+baseResp.errCode);
            }
        }else {
            callback.result("分享失败");
        }
        finish();
    }
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        IWXAPI wxAPI = 获取到你之前初始化的IWXAPI ;
        if (wxAPI != null){
            wxAPI.handleIntent(getIntent(), this);
        }
    }
}

具体的逻辑具体处理,不过不建议在这里处理复杂的逻辑,可以把分享的结果先返回去,再自己的类中再做处理。

还有就是要记得写finish,这是一个Activity,不写finish的话你就无法和你的Activity交互。

可以看出分享的操作还是很简单的微信分享,按照文档和Demo来做基本没问题,我也是随便讲讲,好吧,其实就是凑凑字数。

二. 接入微信分享SDK碰到的坑

好吧,这才是重点,上面的都是在划水。先说一下,可能我碰到了一些问题是读者没碰到的,也有可能读者碰到一些问题我没碰到所以没写下来,希望可以在评论区或者私信留言。

1.跳转弹出页面提示失败

一般来说是参数的问题,比如我上面说的appId,如果你用测试的那个appId来测试的话,在现版本是跳转不了的,官方也有说明。

微信分享微网站_微信分享_微信公众账号分享到新浪微博

所以最好是用正式的参数去测(卧槽,为是什么QQ分享都可以微信却不行)

还有如果包名和签名对不上你在微信后台申请时填的,也是无法跳转的。

2.无法获取到分享的回调

这是一个比较坑的问题了,好像挺早前就有了,简单来说,问题是:

微信分享之后,选择留在微信,再返回应用,接收不到回调。

是的,无论是Android还是IOS都是这样,似乎是微信这样特意去设计的,因为QQ是可以的,QQ分享选择留在QQ,返回之后也是有回调的。

当前版本分享到朋友圈不会有这个选择,所以可以只对分享到微信做处理

那么官方没有处理的办法怎么办?我们只能自己写逻辑去处理了。

先测下一下各种情况下的生命周期情况(可能不同的版本流程不同)

(1)分享直接错误,没有跳转微信的情况

send -> onPause -> WXEntryActivity -> onResume

(2)分享时弹出同一个页面提示分享错误

send -> onPause -> (点击确认之后)onResume

是的,这种情况是不走WXEntryActivity 的

(3)分享跳转到微信,然后直接物理返回应用

send -> onPause -> onStop -> 在微信返回 -> onStart -> WXEntryActivity -> onResume

这种情况下微信给的回调是分享成功

(4)分享跳转到微信,然后切进程返回(只要是切进程返回都是这种情况)

send -> onPause -> onStop -> 在微信切进程 -> onStart -> onResume

可以看出这种情况也不会调用WXEntryActivity

(5)分享成功后选择返回应用

send -> onPause -> onStop -> 分享成功后选返回应用 -> onStart -> WXEntryActivity -> onResume

(6)分享成功后选择留在微信

send -> onPause -> onStop -> 分享成功后选留在微信 -> onStart -> onResume -> onPause -> onStop -> 再手动返回应用 -> onStart -> onResume

不知道为什么会调两次生命周期

(7)分享到朋友圈

send -> onPause -> onStop -> 确认分享朋友圈 -> onStart -> onResume -> onPause -> WXEntryActivity -> onResume

不知道为什么这个生命周期也是很乱

可以看出如果要做的话,我们可以选择只要跳转到微信就分享成功,因为默认就算你跳到微信不分享,他们给的回调也是成功的回调。

从上面的所有情况的生命周期观察,我的做法是判断send方法之后有调用onStop 生命周期就表示跳转微信的情况。

我是自己定义一个状态state去判断分享的结果,onResume的时候返回分享的结果,send之前state为0,默认设置结果为分享失败,send+onStop 之后设置结果为分享成功,WXEntryActivity 之后再把结果覆盖之前的变量,然后onResume返回。

微信分享微网站_微信分享_微信公众账号分享到新浪微博

就算中间某步的方法没调用也没关系,最终都会有返回值,不过这样的做法也会有问题,如果onResume没调用,那就无法接收到回调了。三. 附言

如果大家有什么其它的问题或者有其它的解决方式,欢迎留言。