Hi,
I have an application that I want to integrate with stripe. I have created a webhook that on Stripe CLI when one pays a permission is turned on from the django side and an email is sent to the client. My problem is taking the webhook to production. I get a 500 error. Anyone who has done the integration successfully to help me?
Regards
My View
class AdvancedHalfHourPricingView(TemplateView):
template_name = "courses/landing.html"
def get_context_data(self, **kwargs):
product = ModuleVariations.objects.get(variation_name__name="Advanced Swahili", lesson_duration="30 Minutes")
# product = Module.objects.get(name="Advanced Swahili")
context = super(AdvancedHalfHourPricingView, self).get_context_data(**kwargs)
context.update({
"product": product,
"user": self.request.user.username,
"STRIPE_PUBLIC_KEY": settings.STRIPE_PUBLIC_KEY
})
print(context)
return context
class CreateCheckoutSessionView(View):
# @csrf_exempt
def post(self, request, *args, **kwargs):
product_id = self.kwargs["pk"]
user = self.request.user.username
user_email = self.request.user.email
product = ModuleVariations.objects.get(id=product_id)
print(product)
domain = Site.objects.get_current().domain
checkout_session = stripe.checkout.Session.create(
payment_method_types=['card'],
line_items=[
{
'price_data': {
'currency': 'usd',
'unit_amount': product.get_display_price(),
'product_data': {
'name': product.variation_name.name,
},
},
'quantity': 1,
},
],
metadata={
"product_id": product.id,
"username": user,
"user_email": user_email
},
mode='payment',
success_url=f'https://{domain}/dashboard/',
cancel_url=f'https://{domain}/cancel/',
#
# success_url='http://localhost:8000/success/',
# cancel_url='https://localhost:8000/cancel/',
)
print(checkout_session)
return JsonResponse({'id': checkout_session.id})
@csrf_exempt
def stripe_webhook(request):
payload = request.body.decode('utf-8')
sig_header = request.META['HTTP_STRIPE_SIGNATURE']
event = None
try:
event = stripe.Webhook.construct_event(
payload, sig_header, settings.STRIPE_WEBHOOK_SECRET
)
except ValueError as e:
# Invalid payload
return HttpResponse(status=400)
except stripe.error.SignatureVerificationError as e:
# Invalid signature
return HttpResponse(status=400)
# Handle the checkout.session.completed event
if event['type'] == 'checkout.session.completed':
session = event['data']['object']
customer_email = session["customer_details"]["email"]
user_email = session["metadata"]["user_email"]
product_id = session["metadata"]["product_id"]
user_name = session["metadata"]["username"]
product = ModuleVariations.objects.get(id=product_id)
# send email to access the dashboard
send_mail(
subject="Here is your product",
message=f"Thanks for your purchase. {user_name} Here is the product you ordered. The URL is {product.variation_name.name}",
recipient_list=[customer_email, user_email],
from_email="admissions@africadiasporaci.com"
)
# change a user permission to access the Lessons
permission = Permission.objects.get(name="Can view lesson")
user = CustomUser.objects.get(username=user_name)
user.user_permissions.add(permission)
user.save()
return HttpResponse(status=200)