## 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 - [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 Reviewed-on: #79
This commit was merged in pull request #79.
This commit is contained in:
1 parent
bb5c43a4e7
commit
4fc2b87bb4
14 files changed
+1141
-119
No files matched your search
@@ -134,6 +134,8 @@ class UserSubscription(TimeInfoBase):
|
||||
NONE = "none", "None"
|
||||
STRIPE = "stripe", "Stripe"
|
||||
REVENUECAT = "revenuecat", "RevenueCat"
|
||||
APP_STORE = "app_store", "App Store"
|
||||
PLAY_STORE = "play_store", "Play Store"
|
||||
BACKER = "backer", "Backer"
|
||||
ADMIN = "admin", "Admin"
|
||||
|
||||
@@ -214,6 +216,8 @@ class Invoice(TimeInfoBase):
|
||||
class Provider(models.TextChoices):
|
||||
STRIPE = "stripe", "Stripe"
|
||||
REVENUECAT = "revenuecat", "RevenueCat"
|
||||
APP_STORE = "app_store", "App Store"
|
||||
PLAY_STORE = "play_store", "Play Store"
|
||||
|
||||
class Status(models.TextChoices):
|
||||
DRAFT = "draft", "Draft"
|
||||
@@ -308,6 +312,8 @@ class Payment(TimeInfoBase):
|
||||
class Provider(models.TextChoices):
|
||||
STRIPE = "stripe", "Stripe"
|
||||
REVENUECAT = "revenuecat", "RevenueCat"
|
||||
APP_STORE = "app_store", "App Store"
|
||||
PLAY_STORE = "play_store", "Play Store"
|
||||
|
||||
class Status(models.TextChoices):
|
||||
PENDING = "pending", "Pending"
|
||||
|
||||
Reference in new issue
Block a user