68 lines
2.2 KiB
Python
68 lines
2.2 KiB
Python
|
|
import json
|
|
import polar
|
|
from django.conf import settings
|
|
from django.http import HttpResponse, HttpResponseRedirect
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from django.contrib.auth.decorators import login_required
|
|
from .models import PolarSubscription
|
|
|
|
polar.api_key = settings.POLAR_API_KEY
|
|
|
|
@csrf_exempt
|
|
def polar_webhook(request):
|
|
if request.method != 'POST':
|
|
return HttpResponse(status=405)
|
|
|
|
payload = request.body
|
|
sig_header = request.headers.get('Polar-Signature-256')
|
|
webhook_secret = settings.POLAR_WEBHOOK_SECRET
|
|
|
|
try:
|
|
event = polar.webhooks.construct_event(
|
|
payload=payload,
|
|
sig_header=sig_header,
|
|
secret=webhook_secret
|
|
)
|
|
except ValueError as e:
|
|
# Invalid payload
|
|
return HttpResponse(status=400)
|
|
except polar.errors.SignatureVerificationError as e:
|
|
# Invalid signature
|
|
return HttpResponse(status=400)
|
|
|
|
# Handle the event
|
|
if event.type == 'subscription.created':
|
|
subscription = event.data
|
|
# Create a new PolarSubscription object
|
|
PolarSubscription.objects.create(
|
|
user_id=subscription['customer_id'], # Assuming customer_id is the user_id
|
|
subscription_id=subscription['id'],
|
|
status=subscription['status'],
|
|
expires_at=subscription['current_period_end'],
|
|
)
|
|
elif event.type == 'subscription.updated':
|
|
subscription = event.data
|
|
# Update the PolarSubscription object
|
|
PolarSubscription.objects.filter(subscription_id=subscription['id']).update(
|
|
status=subscription['status'],
|
|
expires_at=subscription['current_period_end'],
|
|
)
|
|
else:
|
|
print(f'Unhandled event type {event.type}')
|
|
|
|
return HttpResponse(status=200)
|
|
|
|
@login_required
|
|
def create_checkout_session(request):
|
|
# Replace with your actual price ID from Polar.sh
|
|
price_id = "REPLACE_WITH_YOUR_PRICE_ID"
|
|
|
|
checkout_session = polar.checkout.create(
|
|
price=price_id,
|
|
customer_email=request.user.email,
|
|
success_url="http://localhost:8000/", # Replace with your success URL
|
|
)
|
|
|
|
return HttpResponseRedirect(checkout_session.url)
|