条纹订阅取消:KeyError 'HTTP_STRIPE_SIGNATURE'

时间:2021-06-07 01:51:14

标签: python django django-models django-rest-framework stripe-payments

我正在尝试为 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'] 时会发生错误,因为此视图的其他部分可以执行此代码。

我刚刚在这个问题中提到了上述设置,但如果需要更多代码,请告诉我我会用该信息更新我的问题。谢谢

1 个答案:

答案 0 :(得分:0)

我认为您在此处将 webhook 处理程序和常规 POST 请求路由混为一谈作为应用程序的一部分。您要么需要一个,要么我怀疑您根本不需要 webhook 的东西,因为您正在尝试这样做。