一,问题
微信分享后,都会有一个弹窗:返回应用还是留在微信
当选择返回应用时...,没反应,尴尬了...
二,分析
调试一下发现这里报了一个错误:
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;
}
}