Android通过微信实现第三方登录并使用OKHttp获得Token及源码下载

这里对于App在微信开放平台上申请AppID和secret在这里就略过了,我们微信的授权登录流程,腾讯官网给的流程如下:
  1. 1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
  2. 2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
  3. 3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
  4. 下边我们看看代码是怎么实现的。  源码地址
  5. 一、加载腾讯SDK
  6. 开发环境是Android Studio,在build.gradle文件中,添加如下依赖即可:
  7. dependencies {
  8. compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+'
    }
    二、添加网络及存储等授权
    在AndroidManifest.xml中设置如下权限:
    <uses-permission android:name="android.permission.INTERNET"/>
  9. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  10. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  11. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    三、代码

    1、初始化IWXApi并注册到微信

    我们这里是在登录窗口发起的登录授权,IWXAPI我们是在Application类中声明创建的,代码如下:
    public  IWXAPI  iwxapi ;
    @Override
    public void  onCreate() {
    super .onCreate();
    this . instance = this ;
    //利用工厂类获得IWXAPI实例
    iwxapi = WXAPIFactory. createWXAPI ( this , appID , true ); // (this, Constants.APP_ID);
    //将应用的AppID注册到微信
    iwxapi .registerApp( appID );
    //UMShareAPI.get(this);
    }
    2、获取code

    环境和初始化完成了,按照腾讯登录流程,首先要获取code,代码如下:
    Button wxSignInButton=(Button) findViewById(R.id. wx_sign_in_button );
    wxSignInButton.setOnClickListener( new  OnClickListener() {
    @Override
    public void  onClick(View view) {
    final  SendAuth.Req req =  new  SendAuth.Req();
    req. scope  "snsapi_userinfo" ;
    req. state  "wechat_sdk_demo_test" ;
    GlobalApplication. getInstance (). iwxapi .sendReq(req);
    }
    });

    3、创建WXEntryActivity类并获取Token

    WXEntryActivity是腾讯的硬性要求,包名必须为wxapi,我们这里是:package com.jxkj.solution.solutionandroid.wxapi。WXEntryActivity为Activity子类并且要实现IWXAPIEventHandler接口,用户获得登录请求后微信返回的结果,如果正确会返回code。onResp中返回code后,直接通过HttpGet方法获得AccessToken。在onCreate方法中调用handleIntent方法将接收到的intent及实现了IWXAPIEventHandler接口的对象传递给IWXAP。
    WXEntryActivity在AndroidManifest.xml中的配置:
    <!-- 微信 -->
    < activity
    android :name= ".wxapi.WXEntryActivity"
    android :exported= "true" //必须的
    android :theme= "@android:style/Theme.Translucent.NoTitleBar"  />
    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);
    必须调用此句话,否则回调不起作用
    GlobalApplication. getInstance (). iwxapi .handleIntent(getIntent(),WXEntryActivity. this );
    }
    @Override
    public void  onReq(BaseReq baseReq) {
    switch  (baseReq.getType()) {
    case  ConstantsAPI. COMMAND_GETMESSAGE_FROM_WX :
    break ;
    case  ConstantsAPI. COMMAND_SHOWMESSAGE_FROM_WX :
    break ;
    default :
    break ;
    }
    }
    @Override
    public void  onResp(com.tencent.mm.opensdk.modelbase.BaseResp baseResp) {
    Toast. makeText ( this "baseresp.getType = "  + baseResp.getType(), Toast. LENGTH_SHORT ).show();
    switch  (baseResp. errCode ) {
    case  com.tencent.mm.opensdk.modelbase.BaseResp.ErrCode. ERR_OK :
    switch  (baseResp.getType()) {
    case  RETURN_MSG_TYPE_LOGIN :
    //拿到了微信返回的code,立马再去请求access_token
    String code = ((SendAuth.Resp) baseResp). code ;
    try  {
    //获取access_token为http get请求
    String res= OkhttpUtils. getSyncAsString ( "https://api.weixin.qq.com/sns/oauth2/access_token?appid=AppID&secret=AppSecret&code=" + code +  "&grant_type=authorization_code" );
    Toast. makeText ( this , res, Toast. LENGTH_LONG ).show();
    catch  (IOException e) {
    e.printStackTrace();
    }
    Toast. makeText ( this , code, Toast. LENGTH_LONG ).show();
    //就在这个地方,用网络库什么的或者自己封的网络api,发请求去咯,注意是get请求
    break ;
    case  RETURN_MSG_TYPE_SHARE :
    break ;
    }
    break ;
    case  com.tencent.mm.opensdk.modelbase.BaseResp.ErrCode. ERR_USER_CANCEL :
    break ;
    case  com.tencent.mm.opensdk.modelbase.BaseResp.ErrCode. ERR_AUTH_DENIED :
    break ;
    case  com.tencent.mm.opensdk.modelbase.BaseResp.ErrCode. ERR_UNSUPPORT :
    break ;
    default :
    break ;
    }
    }
    }
    四、微信登录、分享等一些需要注意的问题
    微信第三方登录、分享等代码写起来不多也不难,但需要遵循腾讯规定的步骤严格执行,在做的过程有如下问题需要注意:
    1、AppID和AppSecret必须和平台一致
    2、签名需要保持一致,对于签名的生成的问题可以查看  文章链接地址 Android集成微信分享功能应用签名生成方法及分享不生效的问题




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凡梦_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值