26 lines
1.1 KiB
Python
26 lines
1.1 KiB
Python
import os, stripe
|
|
from clerk_backend_api import Clerk # Clerk backend SDK
|
|
from fastapi import APIRouter, Request, HTTPException
|
|
|
|
router = APIRouter()
|
|
stripe.api_key = os.getenv("STRIPE_SECRET")
|
|
clerk = Clerk(bearer_auth=os.getenv("CLERK_SECRET_KEY"))
|
|
|
|
@router.post("/stripe/webhook")
|
|
async def stripe_hook(req: Request):
|
|
payload, sig = await req.body(), req.headers["stripe-signature"]
|
|
try:
|
|
event = stripe.Webhook.construct_event( # Stripe-recommended verify
|
|
payload, sig, os.getenv("STRIPE_WEBHOOK_SECRET"))
|
|
except stripe.error.SignatureVerificationError:
|
|
raise HTTPException(400, "Bad sig")
|
|
|
|
if event["type"] == "customer.subscription.updated":
|
|
item = event["data"]["object"]["items"]["data"][0]
|
|
plan = item["price"]["nickname"] # "Pro", "Enterprise"…
|
|
userID = event["data"]["object"]["metadata"]["clerk_user_id"]
|
|
clerk.users.update_user_metadata( # merge into unsafe_metadata
|
|
userID, unsafe_metadata={"plan": plan})
|
|
return {"ok": True}
|
|
|