From 6f1d97fa50700e6c94c2a28c310a9652367093b1 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin <59914433+mdmohsin7@users.noreply.github.com> Date: Sun, 9 Feb 2025 20:58:13 +0530 Subject: [PATCH 1/2] add separate webhook for stripe connect events --- backend/routers/payment.py | 19 ++++++++++++++++--- backend/utils/stripe.py | 9 ++++++++- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/backend/routers/payment.py b/backend/routers/payment.py index a5a9247259..78ab32a070 100644 --- a/backend/routers/payment.py +++ b/backend/routers/payment.py @@ -40,6 +40,20 @@ async def stripe_webhook(request: Request, stripe_signature: str = Header(None)) # paid paid_app(app_id, uid) + return {"status": "success"} + + +@router.post('/v1/stripe/connect/webhook', tags=['v1', 'stripe', 'webhook']) +async def stripe_webhook(request: Request, stripe_signature: str = Header(None)): + payload = await request.body() + + try: + event = stripe_utils.parse_connect_event(payload, stripe_signature) + except ValueError as e: + raise HTTPException(status_code=400, detail="Invalid payload") + except stripe.error.SignatureVerificationError as e: + raise HTTPException(status_code=400, detail="Invalid signature") + if event['type'] == 'account.updated': # this event occurs for the connected account, check if the account is fully onboarded to set default method account = event['data']['object'] @@ -50,9 +64,8 @@ async def stripe_webhook(request: Request, stripe_signature: str = Header(None)) set_default_payment_method(uid, 'stripe') # TODO: handle this event to link transfers? - if event['type'] == 'transfer.created': - transfer = event['data']['object'] - print(transfer) + # if event['type'] == 'transfer.created': + # transfer = event['data']['object'] return {"status": "success"} diff --git a/backend/utils/stripe.py b/backend/utils/stripe.py index 39f6178325..4d8723a04b 100644 --- a/backend/utils/stripe.py +++ b/backend/utils/stripe.py @@ -5,6 +5,7 @@ stripe.api_key = os.getenv('STRIPE_API_KEY') endpoint_secret = os.getenv('STRIPE_WEBHOOK_SECRET') +connect_secret = os.getenv('STRIPE_CONNECT_WEBHOOK_SECRET') def create_product(name: str, description: str, image: str): @@ -58,6 +59,13 @@ def parse_event(payload, sig_header): ) +def parse_connect_event(payload, sig_header): + """Parse the Stripe Connect event.""" + return stripe.Webhook.construct_event( + payload, sig_header, connect_secret + ) + + def create_connect_account(base_url: str, uid: str): account = stripe.Account.create( controller={ @@ -111,7 +119,6 @@ def refresh_connect_account_link(account_id: str, base_url: str): } - def is_onboarding_complete(account_id: str): account = stripe.Account.retrieve(account_id) return account.charges_enabled and account.payouts_enabled and account.details_submitted From 45f21b2a250c44e272239c9bfcb05381cdf20bc2 Mon Sep 17 00:00:00 2001 From: Mohammed Mohsin <59914433+mdmohsin7@users.noreply.github.com> Date: Sun, 9 Feb 2025 20:58:36 +0530 Subject: [PATCH 2/2] update env template to include stripe keys --- backend/.env.template | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/backend/.env.template b/backend/.env.template index 45bdf7adeb..fc4f5991e3 100644 --- a/backend/.env.template +++ b/backend/.env.template @@ -28,4 +28,8 @@ HOSTED_PUSHER_API_URL= TYPESENSE_HOST= TYPESENSE_HOST_PORT= -TYPESENSE_API_KEY= \ No newline at end of file +TYPESENSE_API_KEY= + +STRIPE_API_KEY= +STRIPE_WEBHOOK_SECRET= +STRIPE_CONNECT_WEBHOOK_SECRET= \ No newline at end of file