Android对接微信登录记录
Android项目要对接下微信登录,稍微记录下踩坑点
代码
1.添加依赖
implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'
2.声明Activity
在你的清单文件添加下面Activity声明
<application>
<activity
android:name="com.test.my.wxapi.WXEntryActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.Translucent.NoTitleBar"
android:exported="true"
android:taskAffinity="${applicationId}"
android:launchMode="singleTask">
</activity>
</application>
<queries>
<!-- 指定微信包名-->
<package android:name="com.tencent.mm" />
</queries>
注意这里android:name="com.test.my.wxapi.WXEntryActivity"
实际上,我的applicationId就是com.test.my
2.创建Activity和处理回调
由于我的applicationId是com.test.my
,但是由于我packageName不是这个,所以我得创建一个包名存放WXEntryActivity
class WXEntryActivity : Activity(), IWXAPIEventHandler {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//没有这个,不会走下面的2个onReq和onResp回调的
WxLoginUtil.api.handleIntent(intent,this)
}
override fun onReq(p0: BaseReq) {
}
override fun onResp(resp: BaseResp) {
Log.d(WxLoginUtil.TAG, "onResp: 进入WXEntryActivity onResp回调处理")
if (resp is SendAuth.Resp) {
Log.d(WxLoginUtil.TAG, "onResp: onResp回调处理")
//微信登录回调处理
WxLoginUtil.handleResp(resp)
}
//关闭当前微信页面(是透明的),否则会拦截掉原页面点击事件
finish()
}
}
4.处理回调
这里补充下handleResp里的写法,实际上很简单
有以下步骤:
- 处理回调,得到授权code
- 根据授权code,获取到access_token
- 根据access_token,得到最终的用户信息
- 拿到用户信息,之后编写你自己需要的逻辑即可
这里不详细说了,就是依次调用接口就完事了
步骤2调用此https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=${code}&grant_type=authorization_code
步骤3调用此https://api.weixin.qq.com/sns/userinfo?access_token=${token}&openid=${wxAccessInfo.openid}&lang=${lang}
lang是微信回调SendAuth.Resp对象里的数据
坑点
1.无法回调WxEntryActivity页面
从以下步骤排查:
- WxEntryActivity是否调用
api.handleIntent(intent,this)
- 注意WxEntryActivity包名应该与你的applicationId相同,而不是你的包名文件夹
微信wxapi的文件结构包名必须和你填写的applicationId相同
例如你的程序结构是
com.wx.mm
,但是你的applicationId是com.wx.mm.qq
。这时候创建wxapi包的时候,路径就必须是com.wx.mm.qq.wxapi
这时候微信才能正常回调。
2.回到登录页面,无法点击
实际上,从登录页唤起微信,再返回,此时上一层页面是微信的那个WXEntryActivity页面,因为它是透明的,所以拦截了我们原来登录页面的点击事件
解决方法就是在回调的时候,把它页面调用finish关掉即可
3.出现错误40163 code been used
这个问题是请求获取access_token数据的接口返回的,解释说code参数是已被消费
我检测了一遍代码,发现没有重复请求
但最后想起了,项目里用的网络请求框架liangjingkanji/Net: Android 基于协程/OkHttp网络请求工具
然后赶紧直接用okhttp写了个简单的get请求,于是就是完美解决问题...无语了,只能说不要轻信别人封装的框架
真相是Net这个网络框架始终返回的是第二次调用接口给回的数据
还有其他网友说如果和友盟分享一起使用,可能也会有这个问题,因为微信分享和微信登录最终都会回调WxEntryActivity页面的
所以如果是和友盟分享使用的话,可以直接继承友盟分享里的那个WxEntryActivity页面,然后添加逻辑就可以了