Grant mobile plans from verified App Store and Play purchases (#78) #79

Merged
westfarn merged 1 commits from feat/78-native-store-purchases into master 2026-10-19 04:37:49 -07:00
Owner

Summary

  • Mobile access is granted by POST /api/finance/store/confirm/ after the app finishes a StoreKit or Play Billing purchase.
  • App Store signed transactions are checked against Apple Root CA G3. Play purchase tokens are checked with the Play Developer API.
  • The RevenueCat webhook no longer grants a plan. Stripe Checkout and the Stripe webhook stay for the website.
  • A purchase account token must match the signed-in user, and a transaction already linked to another account is rejected. Access ends when the verified period end passes unless the app confirms again.

Client: ai_ml_operations/chat_web_app#122

Config

  • APPLE_IAP_BUNDLE_ID (default ai.hesychia.chat)
  • GOOGLE_PLAY_PACKAGE_NAME
  • GOOGLE_PLAY_SERVICE_ACCOUNT_JSON (JSON or a file path)
  • Plan revenuecat_product_id or REVENUECAT_PRODUCT_PLAN_MAP maps the store product to a plan

Test plan

  • python manage.py test monetization.tests.test_store_purchases monetization.tests.test_revenuecat monetization.tests.test_plans_quotas
  • Confirm an App Store sandbox transaction and a Play license-test purchase against a configured backend
  • Confirm a token already linked to another user is rejected
  • Confirm GET /subscription/ returns store_account_token and flips a lapsed store sub to canceled
## Summary - Mobile access is granted by `POST /api/finance/store/confirm/` after the app finishes a StoreKit or Play Billing purchase. - App Store signed transactions are checked against Apple Root CA G3. Play purchase tokens are checked with the Play Developer API. - The RevenueCat webhook no longer grants a plan. Stripe Checkout and the Stripe webhook stay for the website. - A purchase account token must match the signed-in user, and a transaction already linked to another account is rejected. Access ends when the verified period end passes unless the app confirms again. Client: https://git.aimloperations.com/ai_ml_operations/chat_web_app/pulls/122 ## Config - `APPLE_IAP_BUNDLE_ID` (default `ai.hesychia.chat`) - `GOOGLE_PLAY_PACKAGE_NAME` - `GOOGLE_PLAY_SERVICE_ACCOUNT_JSON` (JSON or a file path) - Plan `revenuecat_product_id` or `REVENUECAT_PRODUCT_PLAN_MAP` maps the store product to a plan ## Test plan - [x] `python manage.py test monetization.tests.test_store_purchases monetization.tests.test_revenuecat monetization.tests.test_plans_quotas` - [ ] Confirm an App Store sandbox transaction and a Play license-test purchase against a configured backend - [ ] Confirm a token already linked to another user is rejected - [ ] Confirm `GET /subscription/` returns `store_account_token` and flips a lapsed store sub to canceled
westfarn added 1 commit 2026-10-19 04:14:45 -07:00
Grant mobile plans from verified App Store and Play purchases (#78).
CI / test (pull_request) Successful in 10s
Unit Tests / test (pull_request) Successful in 10s
74e8a4ad71
The app confirms a StoreKit signed transaction or Play purchase token. The backend checks it with Apple or Google before writing the ledger, and the RevenueCat webhook no longer grants access.
westfarn merged commit 4fc2b87bb4 into master 2026-10-19 04:37:49 -07:00
westfarn deleted branch feat/78-native-store-purchases 2026-10-19 04:37:50 -07:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: ai_ml_operations/chat_backend#79