一、问题来源:
已接入友盟的统计分享,测试可用。后期要求接入微信登录,微信登录后获取到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);