使用Umeng统计跟分享,使用原生微信登陆(umeng跟微信原生登陆冲突)

使用Umeng统计跟分享,使用原生微信登陆(umeng跟微信原生登陆冲突)

本文根据项目经验得出,已经经过测试:
因项目中使用umeng的分享统计等功能,但是在接入微信原生登陆的时候发现
umeng会调用获取AsscesToken的接口,导致原生方式获取到的code码在调用
获取AsscesToken接口是报错“40163 code been used”;


出现问题原因

因为使用umeng 全家桶以后,创建的WXEntryActivity必须继承自WXCallbackActivity(umeng封装),umeng会在内部接收原生请求的回调并执行获取AsscesToken的接口,这个时候拿到的code已经失效了,所以会有这个问题。

解决方式

在看了umeng封装的WXCallbackActivity类以后,发现他内部创建了几个方法,还有回调处理。根据java的继承关系,子类覆写了父类的方法,会优先执行子类中的方法。

package com.umeng.socialize.weixin.view;

public abstract class WXCallbackActivity extends android.app.Activity implements com.umeng.weixin.umengwx.e {
    private final java.lang.String b;
    protected com.umeng.weixin.handler.UmengWXHandler a;

    public WXCallbackActivity() { /* compiled code */ }

    protected void onCreate(android.os.Bundle bundle) { /* compiled code */ }

    protected void a(android.content.Intent intent) { /* compiled code */ }

    protected void onNewIntent(android.content.Intent intent) { /* compiled code */ }

    public void a(com.umeng.weixin.umengwx.b b) { /* compiled code */ }

    public void a(com.umeng.weixin.umengwx.a a) { /* compiled code */ }
}

看上边的代码。我们只要覆写其中被混淆过的方法即可。以下是覆写代码:

/**
 * Created by zenmen on 2018/3/23.
 */

public class WXEntryActivity extends WXCallbackActivity implements IWXAPIEventHandler {
    private static final int RETURN_MSG_TYPE_LOGIN = 1;
    private static final int RETURN_MSG_TYPE_SHARE = 2;
    @Override
    protected void onDestroy() {
        super.onDestroy();

        hintKeyboard();
        //如果没回调onResp,八成是这句没有写
        JIXiangApplication.mWxApi.handleIntent(getIntent(), this);
    }

    private void hintKeyboard() {
        InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
        if(imm.isActive()&&getCurrentFocus()!=null){
            if (getCurrentFocus().getWindowToken()!=null) {
                imm.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
            }
        }
    }

    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Override
    public void onResp(BaseResp baseResp) {

        CustomLog.e("getPlatformInfo="+baseResp.errCode);

        LoginEvent event = new LoginEvent();
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_BAN:
            case BaseResp.ErrCode.ERR_AUTH_DENIED:
            case BaseResp.ErrCode.ERR_USER_CANCEL:

                event.setAuthSucess(false);
                if (RETURN_MSG_TYPE_SHARE == baseResp.getType()) {
                    event.setMsg("分享失败");
                    Toasty.normal(this, "分享失败");
                }
                else {
                    event.setMsg("登录失败");
                    Toasty.normal(this, "登录失败");
                }
                break;
            case BaseResp.ErrCode.ERR_OK:
                switch (baseResp.getType()) {
                    case RETURN_MSG_TYPE_LOGIN:
                        event.setAuthSucess(true);
                        //拿到了微信返回的code,立马再去请求access_token
                        String code = ((SendAuth.Resp) baseResp).code;
                        //就在这个地方,用网络库什么的或者自己封的网络api,发请求去咯,注意是get请求
                        CustomLog.e("getPlatformInfo="+code);
                        event.setLoginCode(code);
                        event.setMsg("授权成功");
                        break;

                    case RETURN_MSG_TYPE_SHARE:
                        Toasty.normal(this,"微信分享成功");
                        break;
                }
                break;
        }

        EventBus.getDefault().post(event);
    }
    //该方法执行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();
    }
}

手动结束页面以后,会自动调用onResp方法,这个时候就可以拿到code,然后进行下一步操作。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值