Google登錄:
自 2021 年 8 月起,新應用需要使用 Android App Bundle 才能在 Google Play 中發布。如果是通過Android App Bundle方式打包的應用,我們本地實際需要維護兩個密鑰,一個開發用的debug密鑰,一個上傳到GooglePlay時打包用的upload密鑰;由Google維護最終簽名應用的密鑰。
在對接其他第三方服務時,大都需要密鑰簽名,正式簽名要用Google提供的密鑰簽名,位於 Google Play Console -> 你的應用 -> Setup -> App integrity -> App signing key certificate 。測試的話用本地debug密鑰,一般位於C:\ Users \ <User> \.android \ debug.keystore, 默認密碼為“ android”,密鑰別名為“ androiddebugkey”。
Google登錄需要在https://console.cloud.google.com/ -> APIs&Services -> Credentials,注冊Oauth2.0客戶端,得到ClientId后將ClientId配置到代碼中。
我測試時,Webclient這一項是自動生成的。然后使用密鑰SHA-1,手動添加類型為Android的client(如果需要debug和release兩個key,則創建兩個Android的client)。其中要注意的是,代碼中要使用的ClientId為Web Client中的id,測試可以成功使用Google登錄app。
查看密鑰SHA-1命令:
keytool -list -v -keystore debug.keystore
keytool工具默認位置:C:\Program Files\Java\jre1.8.0_311\bin。使用前將目錄添加到環境變量或在該目錄執行命令。
Facebook登錄:
開發文檔:https://developers.facebook.com/docs/facebook-login/
在容易出問題的在於配置簽名。如果Google是已經使用了Android App Bundle, 正式密鑰配置要使用 Google的 App signing key,具體查看上面Google登錄介紹。
設置debug時的登錄所需簽名, 可以用官方文檔上的簽名命令:
keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
但如果Google Play的應用是使用了 Android App Bundle,正式簽名要用下面的命令(windows平台):
echo 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 | xxd -r -p | openssl base64
Google內購(Google Play Billing):
測試結算庫集成文檔:https://developer.android.com/google/play/billing/test
按照文檔完成對應操作,在支付的時候可以正確出現支付卡支付方式,即不需要實際付款,就可以測試各種支付場景。
需要特殊注意的幾點:
1.配置好商品,並確保商品已經激活。此時通過android支付sdk查詢商品庫存api還獲取不到商品信息,需要等待一段時間才能生效。具體時間不確定,可能2小時,也可能1天。
2.等到查詢到商品庫存信息能夠返回正確的信息后,調用sdk購買商品api,此時基本不太可能直接拉起購買,大多數會提示各種各樣的報錯,如app版本不包含內購內容,支付錯誤等等等等。此時可檢查以下容易出錯的項:
3.經過測試,應用發布到內部測試軌道后,錯誤信息會變化,但仍未能拉起支付。按照應用許可文檔所說,一定是要發布到封閉式或開放式測試軌道中。(但是由於會改變錯誤信息,所以無法確定發布內部測試軌道步驟是否必要)。
4.發布到測試軌道后,一定要設置測試人員。此處有兩坑,(1)選擇中testers打上挑后, 要右下角保存設置。(2)仍需要測試者點擊加入鏈接,才能確保擁有測試權限。
5.發布到測試軌道並設置好測試人員后,在手機中打開 App bundle explorer -> Downloads -> Copy shareable link 的鏈接,會跳轉到Google Play 要測試app的下載界面(如果打不開,可能會用到GooglePlay開啟開發者模式,然后開啟內部應用分享功能。文檔)。如果提示找不到應用,檢查第4步,大概率因為沒有權限。Google Play要用有權限的賬號登錄。
6.可以正確的從GooglePlay下載安裝應用,但仍無法拉起支付。嘗試Google Play Console -> Setup -> License testing , 設置對應測試者郵箱,並設置License Response為LICENSED(不確定此操作是否有效)。
遇到問題:
Android12手機測試,facebook登錄異常,報錯日志:
05-05 18:06:00.426 9989 9989 E AndroidRuntime: FATAL EXCEPTION: main 05-05 18:06:00.426 9989 9989 E AndroidRuntime: Process: com.xxx, PID: 9989 05-05 18:06:00.426 9989 9989 E AndroidRuntime: java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=64206, result=-1, data=Intent { (has extras) }} to activity {com.xxx/com.xxx.MainActivity}: java.lang.IllegalArgumentException: com.xxx: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent. 05-05 18:06:00.426 9989 9989 E AndroidRuntime: Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles. 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.ActivityThread.deliverResults(ActivityThread.java:5411) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.ActivityThread.handleSendResult(ActivityThread.java:5450) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.servertransaction.ActivityResultItem.execute(ActivityResultItem.java:54) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2259) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.os.Looper.loopOnce(Looper.java:210) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.os.Looper.loop(Looper.java:299) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:8087) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:556) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1045) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: Caused by: java.lang.IllegalArgumentException: com.xxx: Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent. 05-05 18:06:00.426 9989 9989 E AndroidRuntime: Strongly consider using FLAG_IMMUTABLE, only use FLAG_MUTABLE if some functionality depends on the PendingIntent being mutable, e.g. if it needs to be used with inline replies or bubbles. 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.PendingIntent.checkFlags(PendingIntent.java:375) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.PendingIntent.getBroadcastAsUser(PendingIntent.java:645) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.PendingIntent.getBroadcast(PendingIntent.java:632) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.facebook.AccessTokenManager.setTokenExpirationBroadcastAlarm(AccessTokenManager.java:164) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.facebook.AccessTokenManager.setCurrentAccessToken(AccessTokenManager.java:130) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.facebook.AccessTokenManager.setCurrentAccessToken(AccessTokenManager.java:110) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.facebook.AccessToken.setCurrentAccessToken(AccessToken.java:245) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.facebook.login.LoginManager.finishLogin(LoginManager.java:719) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.facebook.login.LoginManager.onActivityResult(LoginManager.java:242) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.facebook.login.LoginManager$1.onActivityResult(LoginManager.java:181) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.facebook.internal.CallbackManagerImpl.onActivityResult(CallbackManagerImpl.java:81) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.xxx.service.FacebookPlatformService.onActivityResult(FacebookPlatformService.java:216) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at com.xxx.MainActivity.onActivityResult(MainActivity.java:221) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.Activity.dispatchActivityResult(Activity.java:8630) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: at android.app.ActivityThread.deliverResults(ActivityThread.java:5404) 05-05 18:06:00.426 9989 9989 E AndroidRuntime: ... 13 more
解決辦法:升級facebook sdk 到12.3
implementation 'com.facebook.android:facebook-android-sdk:12.3.0'
遇到新的問題會隨時補充