友盟(Umeng)统计跟分享,原生微信登录冲突

一、问题来源:

已接入友盟的统计分享,测试可用。后期要求接入微信登录,微信登录后获取到code,后台根据code获取openid,用于打款给用户。可是code传给后台,后台去获取openid,一直提示code been used。

二、出现问题的原因

微信回调的WXEntryActivity必须继承自WXCallbackActivity(umeng封装),umeng会在内部接收原生请求的回调并执行获取AsscesToken的接口,这个时候拿到的code已经失效了“40163 code been used”,如上图所示。

三、解决方式

查看友盟封装的类WXCallbackActivity,WXCallbackActivity自定义几个回调处理方法,根据java的继承关系,子类覆写了父类的方法,会优先执行子类中的方法。所以只要覆写其中被混淆过的方法即可。

整个微信回调的方法如下:

在Application中的设置如下

代码如下:

public class WXEntryActivity extends WXCallbackActivity implements IWXAPIEventHandler {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        BaseApplication.api = WXAPIFactory.createWXAPI(this, "wxb8bfbb8ae27*****", false);
        BaseApplication.api.handleIntent(getIntent(), this);  //必须调用此句话
    }
    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        BaseApplication.api.handleIntent(intent, this);
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {
        switch (baseResp.errCode){
            case BaseResp.ErrCode.ERR_USER_CANCEL://取消登录
                if (2 == baseResp.getType()) {
                    ToastUtils.showToast(R.string.strCancelShareWechat);
                } else {
                    ToastUtils.showToast(R.string.strCancelBindWechat);
                }
                finish();
                break;
            case BaseResp.ErrCode.ERR_OK://登录成功
                switch (baseResp.getType()){
                    case 1:
                        Bundle bundle = getIntent().getExtras();
                        SendAuth.Resp resp = new SendAuth.Resp(bundle);
                        final String code = resp.code;
                        SystemOutClass.syso("绑定微信成功后返回的值code。。。。",code);
                        if (getResources().getString(R.string.strBindWechat).equals(GlobalConstants.SHARE_MISSION)) {
                            SystemOutClass.syso("绑定微信成功后返回的值sssssssssscode。。。。",code);
                            bindWX(code);
                        }
                        break;
                }
                break;
        }
    }

    /**
     * 把code传给后台
     * @param code 微信登录获取到的code。
     */
    private void bindWX(String code) {
//        LogUtil.e("绑定微信》》》" + code);
        OkGo.post(Api.apiWechatCode)
                .params("code", code)
                .execute(new JsonCallback<BaseEntity<BaseBean>>() {
                    @Override
                    public void onSuccess(BaseEntity<BaseBean> entity, Call call, Response response) {
                        SystemOutClass.syso("绑定微信成功后传code的给后台。。。。","");
                        if (entity != null) {
                            if (entity.getCode() == 0 && entity.data != null) {
                                ToastUtils.showToast(R.string.strSuccessBindWechat);
                                finish();
                            } else {
                                ToastUtils.showToast(entity.getMsg());
                            }
                        } else {
                            ToastUtils.showToast(R.string.strFailBindWechat);
                        }
                        finish();
                    }

                    @Override
                    public void onError(Call call, Response response, Exception e) {
                        super.onError(call, response, e);
                        ToastUtils.showToast(R.string.strFailBindWechat);
                        finish();
                    }
                });

    }
    //该方法执行umeng登陆的回调的处理
    @Override
    public void a(com.umeng.weixin.umengwx.b b) {
//        super.a(b);
    }

    @Override
    protected void a(Intent intent) {
        super.a(intent);
    }
    //在onResume中处理从微信授权通过以后不会自动跳转的问题,手动结束该页面
    @Override
    protected void onResume() {
        super.onResume();
        finish();
    }
}

四、微信原生登录的方法

微信登录就四行代码:

final SendAuth.Req req = new SendAuth.Req();

req.scope = "snsapi_userinfo";//随便写

req.state = "diandi_wx_login";//随便写

BaseApplication.api.sendReq(req);

猜你喜欢

转载自blog.csdn.net/zaq977684/article/details/89356438
今日推荐