Android集成微信登录

Android集成微信登录

这篇文章给同学们图文详解Android集成微信登录的步骤,通过文章整理的内容,大家只需要几行代码就可以实现微信登录的功能。

一、首先在Application的onCreate中写:

public static IWXAPI sApi;
@Override
public void onCreate() {
 super.onCreate();
 sApi = WXEntryActivity.initWeiXin(this, "**********");
}

二、在需要登录的地方添加:

 //微信登录,跳转至微信授权页面
WXEntryActivity.loginWeixin(mActivitySelf, MyApplication.sApi);

三、下面对具体的集成步骤做详细的描述。

集成步骤:

1、在开放平台注册创建应用,申请登录权限

2、下载sdk或配置依赖,拷贝相关文件到项目工程目录

3、全局初始化微信组件

4、请求授权登录,获取code

5、通过code获取授权口令access_token

6、使用access_token获取用户信息

1. 在开放平台注册创建应用,申请登录权限

img

需要注意的是:应用签名的部分

img

需要注意的事关于应用签名这里,可以查看此博客进行获取"http://www.tangchaowang.com/kexuezhishi/3874.html"

注册成功获取到key后配置到MyApplication中,在app目录的building.gradle中添加依赖

" api ‘com.tencent.mm.opensdk:wechat-sdk-android:6.8.0’"

并在包中创建wxapi文件夹,在文件夹中创建WXEntryActivity页面,如果wxapi这个文件夹放的位置不对,将无法登录,微信sdk无法找到登录的Activity授权功能。

接着在AndroidManifest.xml文件中添加:

 <activity
            android:name=".wxapi.WXEntryActivity"
            android:label="@string/app_name"
            android:configChanges="keyboardHidden|orientation|screenSize"
            android:exported="true"
            android:screenOrientation="portrait"
            android:taskAffinity="包名" />


3. 全局初始化微信组件

全局初始化微信组件,当然是Application的onCreate里(当然Activity的onCreate也是可以的,为了全局使用微信api对象方便操作):

public static IWXAPI sApi;
public void onCreate() {
        super.onCreate();
sApi = WXEntryActivity.initWeiXin(this, "注册后获得的key");
}

4. 请求授权登录,获取code

为了统一业务的单一原则我把微信相关的都统一封装到了wxapi包下和WXEntryActivity中:

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private IWXAPI api;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.wx_result);
        api = MyApplication.sApi;
        api.handleIntent(getIntent(), this);
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //解除注册
        EventBus.getDefault().unregister(this);
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        setIntent(intent);
        api.handleIntent(intent, this);
    }

    /**
     * 微信组件注册初始化
     *
     * @param context       上下文
     * @param weixin_app_id appid
     * @return 微信组件api对象
     */
    public static IWXAPI initWeiXin(Context context, @NonNull String weixin_app_id) {
        if (TextUtils.isEmpty(weixin_app_id)) {
            //Toast.makeText(context.getApplicationContext(), "app_id 不能为空", Toast.LENGTH_SHORT).show();
        }
        IWXAPI api = WXAPIFactory.createWXAPI(context, weixin_app_id, true);
        api.registerApp(weixin_app_id);
        return api;
    }

    /**
     * 登录微信
     *
     * @param api 微信服务api
     */
    public static void loginWeixin(Context context, IWXAPI api) {
        // 判断是否安装了微信客户端
        if (!api.isWXAppInstalled()) {
            Toast.makeText(context.getApplicationContext(), "您还未安装微信客户端!", Toast.LENGTH_SHORT).show();
            return;
        }
        // 发送授权登录信息,来获取code
        SendAuth.Req req = new SendAuth.Req();
        // 应用的作用域,获取个人信息
        req.scope = "snsapi_userinfo";
        /**
         * 用于保持请求和回调的状态,授权请求后原样带回给第三方
         * 为了防止csrf攻击(跨站请求伪造攻击),后期改为随机数加session来校验
         */
        req.state = "app_wechat";
        api.sendReq(req);
    }

    @Override
    public void onResp(BaseResp resp) {
        Intent intent;
        int code = resp.errCode;
        switch (code) {
            case BaseResp.ErrCode.ERR_OK:
                String codeWx = ((SendAuth.Resp) resp).code;
                EventBus.getDefault().post(new WxLoginEvent(codeWx));
                finish();
                break;
            default:
                finish();
                break;
        }
    }
    @Override
    public void onReq(BaseReq baseReq) {

    }

    @Subscribe
    public void onEventMainThread(WxLoginEvent event) {
    }
}

第三方通过code进行获取access_token的时候需要用到,code的超时时间为10分钟,一个code只能成功换取一次access_token即失效。code的临时性和一次保障了微信授权登录的安全性。第三方可通过使用https和state参数,进一步加强自身授权登录的安全性。

这样客户端使用的地方只要:

 //微信登录,跳转至微信授权页面
WXEntryActivity.loginWeixin(mActivitySelf, MyApplication.sApi);

5. 通过code获取授权口令access_token

我们在onResp的回调方法中获取了code,然后通过EventBus将code回调给调用微信登录的类,比如LoginActivity:

WxLoginEvent:

public class WxLoginEvent {

    private String code;

    public WxLoginEvent(String wxCode) {
        code = wxCode;
    }

    public String getData() {
        return code;
    }
}

LoginActivity:

@Subscribe
    public void onEventMainThread(WxLoginEvent event) {
        //通过Wx回调成功后调用Wx登录接口
        showDialogLoading(R.string.loading);
        wxLogin(event.getData());
    }

LoginActivity:

@Subscribe
    public void onEventMainThread(WxLoginEvent event) {
        //通过Wx回调成功后调用Wx登录接口
        showDialogLoading(R.string.loading);
        wxLogin(event.getData());
    }

接下来就根据我们的业务流程去完成登录微信登录模块

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>