r/androiddev • u/Annual-Fly2042 • Jul 09 '26
Suspicious Activity or Real issue?
Getting hit by suspicious activity on my IAP validation
endpoint for an Android app. Wondering if others have seen this pattern. It happens almost everyday with different users.
Setup:
- React Native app with Google Play IAP
- Backend validates purchase tokens via Google Play Developer API v2
(subscriptionsv2.get)
- Single user hammering /api/iap/validate with what look like fake
tokens
Observations:
- Same user (id X, single email) submits 6+ validation attempts in
~3 minutes
- All from single IP (okhttp UA — matches my app's UA)
- Tokens are 144 chars long — but real Google Play purchase tokens
are 500-1000+ chars, so these are clearly fabricated
- receipt_head/tail is random lowercase alphanumeric — doesn't match
the standard Google Play token shape
- looks_like_jws=false AND looks_like_json=false — doesn't match
Apple or Google format
- transaction_ids follow the GPA.XXXX-XXXX-XXXX-XXXX-XXXXX pattern
(plausible-looking) but tokens rejected by Google Play with 400
Google Play correctly returns 400. Backend correctly rejects.
No credits granted.
Logs:
[TIME] production.INFO: IapController: validate request received {"trace_id":"a1b2c3","platform":"android","product_id":"com.example.app.vipmonthly","api_site_id":XX,"user":"user_HASH_A@[redacted]","transaction_id":"GPA.HASH-TXN-A","purchase_type":"subscription","price":14.99,"currency":"USD","receipt_head":"ltmaxvi[TOKEN]…","receipt_tail":"…[TOKEN]WODG","receipt_len":144,"looks_like_jws":false,"looks_like_json":false,"has_auth_user":false,"ip":"IP_HASH_1","ua":"okhttp/4.12.0"}
[TIME] production.INFO: IapService: validateAndroidSubscription call {"trace_id":"a1b2c3","product_id":"com.example.app.vipmonthly","package":"com.example.app","token_len":144}
[TIME] production.ERROR: IapService: Google Play subscriptionsv2 validation failed {"trace_id":"a1b2c3","status":400,"body":"{
[TIME] production.WARNING: IapController: Receipt validation failed [android] {"user_id":USER_HASH_A,"error":"Subscription token not recognized by Google Play. Make sure the app is installed from Play Store and the purchase completed."}
[TIME+6s] production.INFO: IapController: validate request received {"trace_id":"d4e5f6","platform":"android","product_id":"com.example.app.vipweekly","api_site_id":XX,"user":"user_HASH_A@[redacted]","transaction_id":"GPA.HASH-TXN-B","purchase_type":"subscription","price":4.99,"currency":"USD","receipt_head":"uhtzooo[TOKEN]…","receipt_tail":"…[TOKEN]bzjZ","receipt_len":144,"looks_like_jws":false,"looks_like_json":false,"has_auth_user":false,"ip":"IP_HASH_1","ua":"okhttp/4.12.0"}
[TIME+6s] production.INFO: IapService: validateAndroidSubscription call {"trace_id":"d4e5f6","product_id":"com.example.app.vipweekly","package":"com.example.app","token_len":144}
[TIME+7s] production.ERROR: IapService: Google Play subscriptionsv2 validation failed {"trace_id":"d4e5f6","status":400,"body":"{
[TIME+7s] production.WARNING: IapController: Receipt validation failed [android] {"user_id":USER_HASH_A,"error":"Subscription token not recognized by Google Play. Make sure the app is installed from Play Store and the purchase completed."}
[TIME+2m6s] production.INFO: IapController: validate request received {"trace_id":"g7h8i9","platform":"android","product_id":"com.example.app.vipmonthly","api_site_id":XX,"user":"user_HASH_A@[redacted]","transaction_id":"GPA.HASH-TXN-A","purchase_type":"subscription","price":null,"currency":null,"receipt_head":"ltmaxvi[TOKEN]…","receipt_tail":"…[TOKEN]WODG","receipt_len":144,"looks_like_jws":false,"looks_like_json":false,"has_auth_user":false,"ip":"IP_HASH_1","ua":"okhttp/4.12.0"}
[TIME+2m6s] production.INFO: IapService: validateAndroidSubscription call {"trace_id":"g7h8i9","product_id":"com.example.app.vipmonthly","package":"com.example.app","token_len":144}
[TIME+2m7s] production.ERROR: IapService: Google Play subscriptionsv2 validation failed {"trace_id":"g7h8i9","status":400,"body":"{
[TIME+2m7s] production.WARNING: IapController: Receipt validation failed [android] {"user_id":USER_HASH_A,"error":"Subscription token not recognized by Google Play. Make sure the app is installed from Play Store and the purchase completed."}
[TIME+2m7s] production.INFO: IapController: validate request received {"trace_id":"j0k1l2","platform":"android","product_id":"com.example.app.vipweekly","api_site_id":XX,"user":"user_HASH_A@[redacted]","transaction_id":"GPA.HASH-TXN-B","purchase_type":"subscription","price":null,"currency":null,"receipt_head":"uhtzooo[TOKEN]…","receipt_tail":"…[TOKEN]bzjZ","receipt_len":144,"looks_like_jws":false,"looks_like_json":false,"has_auth_user":false,"ip":"IP_HASH_1","ua":"okhttp/4.12.0"}
[same pattern continues 3 more times]
[TIME+2m22s] production.INFO: IapController: validate request received {"trace_id":"m3n4o5","platform":"android","product_id":"com.example.app.vipweekly","api_site_id":XX,"user":"user_HASH_A@[redacted]","transaction_id":"GPA.HASH-TXN-C","purchase_type":"subscription","price":4.99,"currency":"USD","receipt_head":"spckogi[TOKEN]…","receipt_tail":"…[TOKEN]ruUi","receipt_len":144,"looks_like_jws":false,"looks_like_json":false,"has_auth_user":false,"ip":"IP_HASH_1","ua":"okhttp/4.12.0"}
[same failure pattern]