第三方微信登陆授权获取code

准备工作:可写一个Demo

1、我们首先需要去微信平台申请的app应用,绑定一个app,并去申请功能的使用权限。
微信开放平台:https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN(资源中心··网站应用)

2、在微信平台申请的app,先打包(非debug包),在打包后的app应用软件里下载一个app签名工具,在app签名工具里面输入app manifest里的包名,包名是package里的,一定要是这个包名,别把包名弄混了,最后生成一个签名,放在微信开放平台的信息输入框里面。



3、然后就是调用微信的回调类: WXEntryActivity 而且这个类名必须是这个,而这个类名必须在.wxapi包名下,不然微信无法掉起,并在AndroidManifest.xml配置(包名要用自己的包名)。

     <activity            
          android:name="com.example.weixindemo.wxapi.WXEntryActivity"                     
          android:configChanges="keyboardHidden|orientation|screenSize"            
          android:exported="true"            
          android:launchMode="singleTop"            
          android:screenOrientation="portrait"           
          android:theme="@android:style/Theme.Translucent.NoTitleBar" >    
          <intent-filter>
              <action android:name="android.intent.action.VIEW" />
              <category android:name="android.intent.category.DEFAULT" />
              <!-- <data android:scheme="wxXXX0" /> -->
              <!-- <data android:scheme="wxXXX1" /> -->
              <data android:scheme="wxXXX2" />
           </intent-filter>
     </activity>

4、去自己申请的app里面拿到appid和secret这两个key。(可利用其先在网页中先验证获取的code值是不是正常的)

    // 微信APPID,若改动,AndroidManifest中也应修改
    //正式环境
    public static final String WX_APPID = "wxXXX0";
    //测试环境
//    public static final String WX_APPID = "wxXXX1";
    //微信支付APPID
    public static final String WX_APPID_PAY = "wxXXX2";

5、代码:WXEntryActivity.java

 public class WXEntryActivity  extends BaseActivity implements IWXAPIEventHandler {

      private IWXAPI api;

      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           api = WXAPIFactory.createWXAPI(this, Consts.WX_APPID);
           api.handleIntent(getIntent(), this);
      }

      @Override
      protected void onNewIntent(Intent intent) {
          super.onNewIntent(intent);
          setIntent(intent);
          api.handleIntent(intent, this);
      }
      
      // 微信发送请求到第三方应用时,会回调到该方法
      @Override
      public void onReq(BaseReq baseReq) {
          LogUtil.e("rd96", "WxEntryActivity   onReq::::");
      }

      // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法
      @Override
      public void onResp(BaseResp baseResp) {
          LogUtil.e("rd96", "WxEntryActivity 授权回调  code:::" + baseResp.errCode);
          EventBus.getDefault().post(baseResp);
          finish();
      }

      @Override
      protected void onDestroy() {
          super.onDestroy();
          api.detach();
      }
}

去请求授权登录页:

// 授权登陆,前提是设备已安装微信应用并已登录,未登录的会引导你先登录
private static void registerToWx(final BaseActivity context) {
    try {
        // 通过WXAPIFactory工厂获取IWXApI的实例
        IWXAPI wxApi = WXAPIFactory.createWXAPI(context, Consts.WX_APPID, true);
        // 将应用的appid注册到微信
        wxApi.registerApp(Consts.WX_APPID);

        if (null != wxApi && wxApi.isWXAppInstalled()) {
            // send oauth request,Final
            SendAuth.Req req = new SendAuth.Req();
            req.scope = "snsapi_userinfo";
            req.state = "wechat_sdk_demo";
            wxApi.sendReq(req);
        } else {
            EventDispatcher.getInstance().postMainRunnable(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(context.getApplicationContext(), R.string.weChat_uninstall, Toast.LENGTH_SHORT).show();
                }
            });
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Activity中:(获取到--微信授权临时票据code,发送给后台,后台去获取access_token,再去取得具体信息,再发送过来,这边再做处理,同步数据)

@Subscribe(threadMode = ThreadMode.MAIN)
public void registerToWXResp(BaseResp baseResp){
    if (baseResp.getType() == 1) {  // 1是登录 2是分享
        if (baseResp.errCode == BaseResp.ErrCode.ERR_OK) {
            // "授权成功"
            SendAuth.Resp re = ((SendAuth.Resp) baseResp);
            code = re.code;

            getWeChatInfo(); // 向后台发送请求,并更新数据
        } else if (baseResp.errCode == BaseResp.ErrCode.ERR_COMM) {
            // 错误;可能的原因:签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等。
            Toast.makeText(getContext(), "抱歉,授权失败", Toast.LENGTH_SHORT).show();
        } else if (baseResp.errCode == BaseResp.ErrCode.ERR_USER_CANCEL) {
            Toast.makeText(getContext(), "您已取消授权", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(getContext(), "授权被拒绝", Toast.LENGTH_SHORT).show();
        }
    }
}

网络访问工具类--Rxjava(XLUserRpc.WxAuthAndGetBasicUserInfoReq 和 WxAuthAndGetBasicUserInfoResp 后台提供),NettyEndpoint--Socket io 封装(网络情况相关处理)

// 获取微信信息,并更新数据
private void getWeChatInfo() {
    showLoadingProgressDialog(false,false, getString(R.string.weChat_sync));
    Observable.create(new ObservableOnSubscribe<Response>() {
        @Override
        public void subscribe(final ObservableEmitter<Response> e) throws Exception {
            final XLUserRpc.WxAuthAndGetBasicUserInfoReq.Builder req = XLUserRpc.WxAuthAndGetBasicUserInfoReq.newBuilder();
            req.setCode(code);//微信用户的code
            NettyEndpoint.getInstance().sendRequest(req.build(), new NetCallback() {
                @Override
                public void callback(Response response) {
                    e.onNext(response);
                }
            });
        }
    }).subscribeOn(Schedulers.io())
            .compose(this.<Response>bindUntilEvent(FragmentEvent.DESTROY))
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new ConsumerObserver<Response>(new Consumer<Response>(){
                @Override
                public void accept(Response response) throws Exception {
                    hideLoadingProgressDialog();
                    if(response.errorCode == Consts.NETWORK_SUCCESS) {
                        if (null != response.resp) {
                            XLUserRpc.WxAuthAndGetBasicUserInfoResp resp = (XLUserRpc.WxAuthAndGetBasicUserInfoResp)response.resp;
                            updateUserData(resp);
                        }
                    }else {
                        if (ChatUtils.handleTimeoutException(getActivity(), response.errorCode)) {
                            // timeout
                        } else {
                            XLUserRpc.WxAuthAndGetBasicUserInfoResp resp = (XLUserRpc.WxAuthAndGetBasicUserInfoResp) response.resp;
                            if (null == resp || TextUtils.isEmpty(resp.getErrorMessage())) {
                                Toast.makeText(getContext(), getString(R.string.NetworkBusy), Toast.LENGTH_SHORT).show();
                            } else {
                                Toast.makeText(getContext(), getString(R.string.weChat_sync_fail), Toast.LENGTH_SHORT).show();
                            }
                        }
                    }
                }

            }));
}

通过code获取access_token: https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

参考:
android开发第三方微信登录授权且获取用户信息
详解如何进行第三方App接入微信登录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容