Can't get any paid app work on Huawei EMUI 15 (previously purchased in GP)
Nobody has claimed this yet.
- Dominant language
- Java
- Stars
- 14.6k
- Forks
- 3.2k
- Avg merge
- 12d 11h
- Merged PRs (30d)
- 4
Description
**Describe the bug**
On a Huawei Mate X7 running microG, applications that rely on in-app purchases or subscription checks (e.g., FaceApp) fail to restore or recognize existing PRO licenses/subscriptions. The billing service (`com.android.vending`) returns an empty purchase list (`INAPP_PURCHASE_ITEM_LIST=[]`) despite the Google account having a valid, active subscription.
**To Reproduce**
Steps to reproduce the behavior:
1. Set up a Huawei Mate X7 with microG and Aurora Store (or install an app via APK).
2. Log in to microG with a Google account that has a valid, paid subscription for an app (e.g., FaceApp PRO).
3. Install the application (e.g., FaceApp).
4. Launch the application.
5. Observe that the app does not automatically recognize the PRO features and shows a paywall or "Restore Purchases" prompt.
6. (Optional) Tap "Restore Purchases" – the operation will likely fail or report no purchases found.
7. Observe the logcat output for `Finsky`/`Phonesky` and `Billing` services.
**Expected behavior**
Valid license
**Actual behavior**
1. Logs show no attempt by microG/Phonesky to determine the "preferred billing account" from installer data.
2. The billing service responds with an empty purchase list (`INAPP_PURCHASE_ITEM_LIST=[]`).
3. The application remains in a "free" or "unlicensed" state.
**Screenshots**
N/A
**System**
- **Device:** Huawei Mate X7
- **Android Version:** [Fill in your version, e.g., Android 12 / HarmonyOS 4.x]
- **microG Services Core Version:** [Fill in your version, e.g., 0.3.0.233515]
- **microG Companion / Phonesky Version:** [Fill in your version]
**Relevant Logs (Huawei Mate X7 with microG)**
*Empty purchase lists returned by Phonesky billing service:*
```text
04-16 20:10:27.617 23690 23704 D Billing : getPurchasesExtraParams(apiVersion=24, packageName=io.faceapp, type=inapp, continuationToken=null, extraParams=Bundle[{billingClientSessionId=-2548996740595174335, playBillingLibraryVersion=8.0.0, enablePendingPurchases=true}])
04-16 20:10:27.617 23690 23704 D Billing : Result: Bundle[{INAPP_PURCHASE_ITEM_LIST=[], DEBUG_MESSAGE=, RESPONSE_CODE=0, INAPP_PURCHASE_DATA_LIST=[], INAPP_DATA_SIGNATURE_LIST=[]}]
04-16 20:10:27.619 23690 23711 D Billing : getPurchasesExtraParams(apiVersion=24, packageName=io.faceapp, type=subs, continuationToken=null, extraParams=Bundle[{billingClientSessionId=-2548996740595174335, playBillingLibraryVersion=8.0.0, enablePendingPurchases=true}])
04-16 20:10:27.620 23690 23711 D Billing : Result: Bundle[{INAPP_PURCHASE_ITEM_LIST=[], DEBUG_MESSAGE=, RESPONSE_CODE=0, INAPP_PURCHASE_DATA_LIST=[], INAPP_DATA_SIGNATURE_LIST=[]}]
04-16 20:18:45.612 9185 9206 D Billing : getPurchasesExtraParams(apiVersion=24, packageName=io.faceapp, type=subs, continuationToken=null, extraParams=Bundle[{billingClientSessionId=5600665361842319971, playBillingLibraryVersion=8.0.0, enablePendingPurchases=true}])
04-16 20:18:45.618 9185 9206 D Billing : Result: Bundle[{INAPP_PURCHASE_ITEM_LIST=[], DEBUG_MESSAGE=, RESPONSE_CODE=0, INAPP_PURCHASE_DATA_LIST=[], INAPP_DATA_SIGNATURE_LIST=[]}]
04-16 20:18:45.613 9185 11881 D Billing : getPurchasesExtraParams(apiVersion=24, packageName=io.faceapp, type=inapp, continuationToken=null, extraParams=Bundle[{billingClientSessionId=5600665361842319971, playBillingLibraryVersion=8.0.0, enablePendingPurchases=true}])
04-16 20:18:45.618 9185 11881 D Billing : Result: Bundle[{INAPP_PURCHASE_ITEM_LIST=[], DEBUG_MESSAGE=, RESPONSE_CODE=0, INAPP_PURCHASE_DATA_LIST=[], INAPP_DATA_SIGNATURE_LIST=[]}]
```
```text
04-16 20:10:27.634 1767 1932 D ActivityManager: setPrivilegeType serviceRecord: ServiceRecord{48ecb16 u0 com.google.android.gms/org.microg.gms.auth.loginservice.GoogleLoginService}, interfaceDescriptor: android.accounts.IAccountAuthenticator, shouldSetPrivType: false
04-16 20:10:27.634 24783 24849 D GmsAuthenticator: getAuthToken: Account {name=XXXXXXXXX, type=com.google}, oauth2:https://www.googleapis.com/auth/googleplay https://www.googleapis.com/auth/accounts.reauth, Bundle[{androidPackageName=com.android.vending, callerPid=23690, callerUid=10198}]
04-16 20:10:27.636 24783 24849 D GmsAuthManager: peekAuthToken: com.android.vending:38918a453d07199354f8b19af05ec6562ced5788:oauth2:https://www.googleapis.com/auth/googleplay https://www.googleapis.com/auth/accounts.reauth
04-16 20:18:45.625 1795 1913 D ActivityManager: setPrivilegeType serviceRecord: ServiceRecord{663f240 u0 com.google.android.gms/org.microg.gms.auth.loginservice.GoogleLoginService}, interfaceDescriptor: android.accounts.IAccountAuthenticator, shouldSetPrivType: false
04-16 20:18:45.628 9096 9662 D GmsAuthenticator: getAuthToken: Account {name=XXXXXXXXX, type=com.google}, oauth2:https://www.googleapis.com/auth/googleplay https://www.googleapis.com/auth/accounts.reauth, Bundle[{androidPackageName=com.android.vending, callerPid=9185, callerUid=10198}]
04-16 20:18:45.631 9096 9662 D GmsAuthManager: peekAuthToken: com.android.vending:38918a453d07199354f8b19af05ec6562ced5788:oauth2:https://www.googleapis.com/auth/googleplay https://www.googleapis.com/auth/accounts.reauth
```
```text
04-16 20:10:27.809 10978 11118 I PlayCore: UID: [10338] PID: [10978] IntegrityService : requestIntegrityToken(IntegrityTokenRequest{nonce=eVp4VDdrb0xPdUNMNXVxTHdEOVNiZzllVUxJcjJkQ3BnczZKME04TzdSYw==, cloudProjectNumber=554161020816, network=null})
04-16 20:10:28.687 23690 23690 D IntegrityService: requestIntegrityToken() success for io.faceapp)
04-16 20:18:46.117 12148 12274 I PlayCore: UID: [10338] PID: [12148] IntegrityService : requestIntegrityToken(IntegrityTokenRequest{nonce=TWFaaEZrY0lOWVhDdjM1RjZRTkUwWDgzbGhaa0h4VURyRVdlU1N0UDJobw==, cloudProjectNumber=554161020816, network=null})
04-16 20:18:46.853 9185 9185 D IntegrityService: requestIntegrityToken() success for io.faceapp)
```
**_Contrasting Logs (Official Google Play Services on Honor 20 Pro)_**
These logs are provided for comparison to show the expected behavior. On a standard GMS device, Finsky explicitly determines the correct billing account via installer data.
```text
04-16 20:45:44.647 15929 15977 I Finsky : [827] io.faceapp: Account determined from installer data - [8_OSEtGFSOfTV8FlfNP8cmifYxUg3prfpxnUMzlgmrE]
04-16 20:45:44.648 15929 15977 I Finsky : [827] Billing preferred account via installer for io.faceapp: [8_OSEtGFSOfTV8FlfNP8cmifYxUg3prfpxnUMzlgmrE]
```
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by tracing the Phonesky Billing service handling of getPurchasesExtraParams and how it selects an account from installer data. Compare the empty purchase-list logs on microG with the contrasting Finsky logs, then reproduce with a paid subscription and logcat. Done means valid existing purchases are returned and the app recognizes the subscription.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- android, java
- Domain
- mobile, payments
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100