我正在尝试为 WebApp 配置 Django Stripe 订阅。
我想让订阅用户自己取消订阅。
下面的代码是从 StripeAPI 和 Django StripeCustomer 模型中删除用户信息。
这里是view.py
import stripe
from django.conf import settings
from django.contrib.auth.decorators import login_required
from django.contrib.auth.models import User
from django.http.response import JsonResponse, HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth import get_user_model
from subscriptions.models import StripeCustomer
@login_required
@csrf_exempt
def cancel_subscription(request):
if request.user.is_authenticated:
endpoint_secret = settings.STRIPE_ENDPOINT_SECRET
payload = request.body
event = None
sig_header = request.META['HTTP_STRIPE_SIGNATURE']
event = stripe.Webhook.construct_event(
payload, sig_header, endpoint_secret
)
session = event['data']['object']
stripe_customer = StripeCustomer.objects.get(user=request.user)
stripe.api_key = settings.STRIPE_SECRET_KEY
sub_id = stripe.Subscription.retrieve(stripe_customer.stripeSubscriptionId)
client_reference_id = session.get('client_reference_id')
user = get_user_model().objects.get(id=client_reference_id)
try:
#delete from stripeapi
stripe.Subscription.delete(sub_id)
#delete from StripeCustomer model
StripeCustomer.objects.delete(
user=user,
stripeCustomerId=stripe_customer_id,
stripeSubscriptionId=stripe_subscription_id,
)
print(user.username + ' unsubscribed.')
except Exception as e:
import traceback
traceback.print_exc()
return JsonResponse({'error': (e.args[0])}, status =403)
return render(request, 'home.html')
当我执行代码时出现错误
sig_header = request.META['HTTP_STRIPE_SIGNATURE']
错误信息如下
异常类型:keyError
异常值:'HTTP_STRIPE_SIGNATURE'
我不明白为什么在 request.META['HTTP_STRIPE_SIGNATURE'] 时会发生错误,因为此视图的其他部分可以执行此代码。
我刚刚在这个问题中提到了上述设置,但如果需要更多代码,请告诉我我会用该信息更新我的问题。谢谢
答案 0 :(得分:0)
我认为您在此处将 webhook 处理程序和常规 POST 请求路由混为一谈作为应用程序的一部分。您要么需要一个,要么我怀疑您根本不需要 webhook 的东西,因为您正在尝试这样做。