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.
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
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
POST /api/finance/store/confirm/after the app finishes a StoreKit or Play Billing purchase.Client: ai_ml_operations/chat_web_app#122
Config
APPLE_IAP_BUNDLE_ID(defaultai.hesychia.chat)GOOGLE_PLAY_PACKAGE_NAMEGOOGLE_PLAY_SERVICE_ACCOUNT_JSON(JSON or a file path)revenuecat_product_idorREVENUECAT_PRODUCT_PLAN_MAPmaps the store product to a planTest plan
python manage.py test monetization.tests.test_store_purchases monetization.tests.test_revenuecat monetization.tests.test_plans_quotasGET /subscription/returnsstore_account_tokenand flips a lapsed store sub to canceled