Android对接微信登录记录 – Stars-One的杂货小窝

Android项目要对接下微信登录,稍微记录下踩坑点

代码1.添加依赖

implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0'

2.声明Activity

在你的清单文件添加下面Activity声明

注意这里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里的写法,实际上很简单

有以下步骤:

  1. 处理回调,得到授权code
  2. 根据授权code,获取到access_token
  3. 根据access_token,得到最终的用户信息
  4. 拿到用户信息,之后编写你自己需要的逻辑即可

这里不详细说了,就是依次调用接口就完事了
步骤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页面

从以下步骤排查:

  1. WxEntryActivity是否调用api.handleIntent(intent,this)
  2. 注意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页面,然后添加逻辑就可以了


提问之前,请先看提问须知点击右侧图标发起提问或者加入QQ群一起学习TornadoFx学习交流群:1071184701<!––>