android微信分享后不能返回应用SendMessageToWX$Resp cannot be cast to SendAuth$Resp

一,问题

微信分享后,都会有一个弹窗:返回应用还是留在微信
当选择返回应用时...,没反应,尴尬了...

二,分析

调试一下发现这里报了一个错误:

java.lang.ClassCastException: 
    com.tencent.mm.sdk.modelmsg.SendMessageToWX$Resp 
    cannot be cast to 
    com.tencent.mm.sdk.modelmsg.SendAuth$Resp
因为太长了不便于查看,这里断行一下
这是一个强转错误,发生在分享后点击返回应用时

而这段强制类型转换发生在用户同意微信授权时:

@Override
public void onResp(BaseResp baseResp) {
    switch(baseResp.errCode) {
        // 用户同意
        case BaseResp.ErrCode.ERR_OK:
            SendAuth.Resp respAll = (SendAuth.Resp)baseResp;
            if(respAll.state.equals("wechat_login")){
                wechat_login(respAll.code);
            }else if(respAll.state.equals("wechat_bind")){
                wechat_bind(respAll.code);
            }
            finish();
            break;
        // 用户取消
        case BaseResp.ErrCode.ERR_USER_CANCEL:
            finish();
            break;
        // 用户拒绝授权
        case BaseResp.ErrCode.ERR_AUTH_DENIED:
            finish();
            break;
        // 微信返回默认处理
        default:
            finish();
            break;
    }
}
经过分析发现:
    第三方授权时为SendAuth.Req
    微信分享时为SendMessageToWX.Req
    微信分享回调解析时强转为SendAuth.Req导致报错

三,解决

解决的方法在于如何区分这两种情况的回调解析
而返回的BaseResp中还有一个getType(),用于区别这两种回调类型
public abstract class BaseResp {
    public int errCode;
    public String errStr;
    public String transaction;
    public String openId;

    public BaseResp() {
    }

    public abstract int getType();

    public void toBundle(Bundle var1) {
        var1.putInt("_wxapi_command_type", this.getType());
        var1.putInt("_wxapi_baseresp_errcode", this.errCode);
        var1.putString("_wxapi_baseresp_errstr", this.errStr);
        var1.putString("_wxapi_baseresp_transaction", this.transaction);
        var1.putString("_wxapi_baseresp_openId", this.openId);
    }

    public void fromBundle(Bundle var1) {
        this.errCode = var1.getInt("_wxapi_baseresp_errcode");
        this.errStr = var1.getString("_wxapi_baseresp_errstr");
        this.transaction = var1.getString("_wxapi_baseresp_transaction");
        this.openId = var1.getString("_wxapi_baseresp_openId");
    }

    public abstract boolean checkArgs();

    public interface ErrCode {
        int ERR_OK = 0;
        int ERR_COMM = -1;
        int ERR_USER_CANCEL = -2;
        int ERR_SENT_FAILED = -3;
        int ERR_AUTH_DENIED = -4;
        int ERR_UNSUPPORT = -5;
    }
}
经过测试回调返回的geiType值发现:
    第三方授权返回 baseResp.getType() = 1
    微信分享返回 baseResp.getType() = 2
所以需要对返回的Type做一下判断

修改后的代码:(这里只是举个例子,写法不规范请谅解)

switch(baseResp.errCode) {
    // 用户同意
    case BaseResp.ErrCode.ERR_OK:
        if(baseResp.getType() == 1){
            SendAuth.Resp respAll = (SendAuth.Resp)baseResp;
            if(respAll.state.equals("wechat_login")){
                wechat_login(respAll.code);
            }else if(respAll.state.equals("wechat_bind")){
                wechat_bind(respAll.code);
            }
            finish();
        }else{

        }
        break;
    }
}

猜你喜欢

转载自blog.csdn.net/abap_brave/article/details/80653025