Android对接微信登录记录

发布时间 2023-12-23 14:50:32作者: Stars-one

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

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

有以下步骤:

  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页面,然后添加逻辑就可以了