android 微信三方登录总结

Posted by lizubing1992 on 03-01,2019

1.首先引入三方包

api 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:5.3.1'

2.声明权限

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> 
<uses-permission android:name="android.permission.READ_PHONE_STATE"/> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

3.在应用的Application中注册微信API

public IWXAPI getmWxApi() {
    return mWxApi;
  }

  private void registToWX() {
    //AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。
    mWxApi = WXAPIFactory.createWXAPI(this, Constant.WEIXIN_APP_ID, false);
    // 将该app注册到微信
    mWxApi.registerApp(Constant.WEIXIN_APP_ID);
  }

4.在对应的登录界面调用

weixinLoginTV.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        if (!MyApplication.getInstance().getmWxApi().isWXAppInstalled()) {
          MyApplication.showToast("您还未安装微信客户端");
          return;
        }
        final SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "diandi_wx_login";
        MyApplication.getInstance().getmWxApi().sendReq(req);
      }
    });

这样就会吊起微信的登录界面

4.构建WXEntryActivity回调Activity

在包名.wxapi下面创建一个类WXEntryActivity,用来接收微信的响应信息。
创建后在AndroidManifest.xml配置

<activity android:name=".wxapi.WXEntryActivity" android:exported="true" />

WXEntryActivity具体的代码如下

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {

  private static final int RETURN_MSG_TYPE_LOGIN = 1;
  private static final int RETURN_MSG_TYPE_SHARE = 2;

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //如果没回调onResp,八成是这句没有写
    MyApplication.getInstance().getmWxApi().handleIntent(getIntent(), this);
  }

  // 微信发送请求到第三方应用时,会回调到该方法
  @Override
  public void onReq(BaseReq req) {
  }

  // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
  //app发送消息给微信,处理返回消息的回调
  @Override
  public void onResp(BaseResp resp) {
    LogUtils.w(resp.errStr);
    LogUtils.w("错误码 : " + resp.errCode + "");
    switch (resp.errCode) {
      case BaseResp.ErrCode.ERR_AUTH_DENIED:
        MyApplication.showToast("取消登录!");
        break;
      case BaseResp.ErrCode.ERR_USER_CANCEL:
        if (RETURN_MSG_TYPE_SHARE == resp.getType()) {
          MyApplication.showToast("分享失败");
        } else {
          MyApplication.showToast("登录失败");
        }
        break;
      case BaseResp.ErrCode.ERR_OK:
        switch (resp.getType()) {
          case RETURN_MSG_TYPE_LOGIN:
            //拿到了微信返回的code,立马再去请求access_token
            String code = ((SendAuth.Resp) resp).code;
            LogUtils.w("code = " + code);
            RxBus.get().post(RxBusKey.WEIXIN_CODE,code);
            //就在这个地方,用网络库什么的或者自己封的网络api,发请求去咯,注意是get请求
            break;
          case RETURN_MSG_TYPE_SHARE:
            MyApplication.showToast("微信分享成功");
            finish();
            break;
        }
        break;
    }
  }

}

在onResp方法中获取微信code之后把这个code传给后台服务器,之后的会请求微信服务器,返回给客户端相应的客户数据


0评论