Android對接微信登錄記錄 - Stars-One的雜貨小窩 Android項目要對接下微信登錄,稍微記錄下踩坑點 代碼 1.添加依賴 implementation 'com.tencent.mm.opensdk:wechat-sdk-android:6.8.0' 2.聲明Activity 在你 ...
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頁面,然後添加邏輯就可以了
提問之前,請先看提問須知 點擊右側圖標發起提問


