i have django react app, i added stripe to django, react build files i set on static django
i have tested on localhost with stripe cli is working fine but after i deploy my django project on vercel and create endpoint on https://dashboard.stripe.com/test/webhooks to handle stripe webhooks event i get error https://i.sstatic.net/51zS8MrH.png, (after i create new webhook endpoint i set new webhook_secret_key so problem not in webhook_secret_key)
I searched on the Internet how to fix it, they advised to set on payload
request.body.decode('utf-8)
or
request.data
but nothing helped
my code (this code on localhost is working fine but on deployed server i get error, for deployed server i changed webhook_secret_key to new secret_webhook_key from https://dashboard.stripe.com/test/webhooks and site_url to deployed server)
from django.conf import settings
from django.http import HttpResponse
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import DepositHistory
from django.views.decorators.csrf import csrf_exempt
from decimal import Decimal
import stripe
from rest_framework.decorators import api_view
from usersAuth.models import AppUser
stripe.api_key = settings.STRIPE_SECRET_KEY
class StripeCheckoutView(APIView):
def post(self, request):
if self.request.user.is_authenticated:
try:
checkout_session = stripe.checkout.Session.create(
line_items=[
{
'price': 'price_1PY4d6GKlfpQfnx9EFKpod75',
'quantity': 1,
},
],
metadata={"user": f'{self.request.user}'},
mode='payment',
success_url=settings.SITE_URL + '/?success=true&session_id={CHECKOUT_SESSION_ID}',
cancel_url=settings.SITE_URL + '/?canceled=true',
)
return Response({"url": checkout_session.url})
except:
return Response(
{'error': 'Something went wrong when creating stripe checkout session'},
status=status.HTTP_500_INTERNAL_SERVER_ERROR
)
return Response({'error': 'You must be logged in to pay'}, status=status.HTTP_401_UNAUTHORIZED)
@csrf_exempt
@api_view(['POST'])
def stripe_webhook_view(request):
payload = request.body
sig_header = request.META['HTTP_STRIPE_SIGNATURE']
event = None
try:
event = stripe.Webhook.construct_event(
payload,
sig_header,
settings.STRIPE_SECRET_WEBHOOK
)
except ValueError as e:
# Invalid payload
#print('Error parsing payload: {}'.format(str(e)))
return HttpResponse({'Error parsing payload'},status=400)
except stripe.error.SignatureVerificationError as e:
# Invalid signature
#print('Error verifying webhook signature: {}'.format(str(e)))
return HttpResponse({'Error verifying webhook signature'},status=400)
if event['type'] == 'checkout.session.completed':
print('we are in checkout.session.completed')
session = event['data']['object']
user = session.metadata.user
amount = Decimal(session.amount_total / 100)
appuser = AppUser.objects.get(email=user)
DepositHistory.objects.create(user=appuser, amount=amount)
appuser.balance += amount
appuser.save()
if event.type == 'payment_intent.succeeded':
payment_intent = event.data.object # contains a stripe.PaymentIntent
print('PaymentIntent was successful!')
elif event.type == 'payment_method.attached':
payment_method = event.data.object # contains a stripe.PaymentMethod
print('PaymentMethod was attached to a Customer!')
# ... handle other event types
else:
print('Unhandled event type {}'.format(event.type))
return HttpResponse(status=200)