前段时间,遇到了一个需求涉及到对账号登录体系的修改。由于之前没有相关的经验,在阅读和理解代码的过程中遇到了一些困难。因为涉及到集成多个第三方API(手机号码登陆会接入运营商的API,微信登陆会接入微信相关的API),代码逻辑在不同模块间跳转,对我来说还是有点复杂的,所以现在基本上完成了之后,打算在这里梳理和记录一下,以便未来参考和回顾。这不仅是一个学习的过程,也是对复杂问题解决能力的一次提升。
在Android端接入微信登录的流程大致如下:
1、注册微信开放平台账号:
在微信开放平台注册开发者账号,并创建一个移动应用,获取相应的AppID和AppSecret。确保申请微信登录功能并通过审核。
2、集成微信SDK:
在项目的build.gradle文件中添加微信SDK的依赖:
dependencies {
//微信
implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+'
}
将微信SDK的jar包复制到项目的libs目录下,并在项目的build.gradle文件中添加依赖。
3、创建微信回调的WXEntryActivity
在发送请求之后,用户是否授权的结果和授权临时code会在这个activity中接收,创建这个activity需要注意下面几点:
Activity路径一定要为:你的包名+/wxapi/WXEntryActivity,并且这个Activity需要实现IWXAPIEventHandler的接口。
exported属性一定要为true!
注册文件AndroidManifest.xml中在权限下方添加安装包查询的请求权限,否则新版本无法检查出是否安装微信,直接拉不起来。
<activity
android:name=".wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/print_app_name"
android:launchMode="singleTask"
android:taskAffinity="com.xbxxhz.box"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
在我们的项目中写的比较复杂,项目中的WXEntryActivity是这样的:(还有很多地方没有吃透)
class WXEntryActivity : Activity(), IWXAPIEventHandler {
override fun onResp(baseResp: BaseResp?) {
when (baseResp?.type) {
ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX -> {
if (baseResp is SendMessageToWX.Resp) {
……
}
}
ConstantsAPI.COMMAND_SENDAUTH -> {
if (baseResp.errCode == BaseResp.ErrCode.ERR_OK && baseResp is SendAuth.Resp) {
……
}
ConstantsAPI.COMMAND_LAUNCH_WX_MINIPROGRAM -> {
if (baseResp is WXLaunchMiniProgram.Resp) {
……
}
}
finish()
}
}
这里的baseResp?.type的type类型是API提供的,点进去可以看到有四十几种常量,对应的应该是不同的状态:
在腾讯提供的官方文档中可以看到返回的参数的含义,所以在ErrCode为0时进行处理用户授权成功后的逻辑
在另一篇博主的博客中他是这样写WXEntryActivity的,通过简单的判断ErrCode的值,来处理不同的操作逻辑,也是可以的
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
@Override
public void onReq(BaseReq baseReq) {
}
@Override
public void onResp(BaseResp baseResp) {
switch (baseResp.errCode){
case BaseResp.ErrCode.ERR_OK:
//拉起微信成功
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
//("授权出错");
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//"用户取消登陆"
break;
default:
break;
}
}
}
4、成功授权
在微信发起授权请求后,用户授权的结果会返回给上面描述的WXEntryActivity,通过判断ErrCode的值,来进行成功授权的逻辑,先看官方文档描述三方接入微信登陆的流程图:
在ErrCode等于0时,我们创建一个广播,并将刚刚返回的code发送出去,这样才能进行下一步操作
val intent = Intent()
intent.action = WeChatConfig.WE_CHAT_ACTION_LOGIN
intent.putExtra(WeChatConfig.WE_CHAT_CODE, baseResp.code)
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
5、收到Code
在我们发送请求授权的同时会注册一个微信登陆的广播接收器WeChatReceiver(),判断是否事登陆成功的action,成功的话就调用oauthCode方法用传过来的code去调用微信绑定接口
internal inner class WeChatReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action
if (TextUtils.equals(WeChatConfig.WE_CHAT_ACTION_LOGIN, action)) {
chatReceiver?.let {
LocalBroadcastManager.getInstance(this@AccountSafeAct).unregisterReceiver(it)
}
chatReceiver = null
val code = intent.getStringExtra(WeChatConfig.WE_CHAT_CODE)
if (TextUtils.isEmpty(code)) {
tipSad(R.string.personal_setpersonact_bind_error, false)
return
}
mViewModel.oauthCode(code)
}
}
}
因为本次需求就是处理绑定微信的流程,到这基本上就没有特别的内容了,后面就是用这个code去调用相应的接口,处理网络请求的相关情况,后面流程的具体细节有需求的可以参考下面这篇文章: