【问题标题】:Stripe IntegrationError: stripe.redirectToCheckout: You must provide one of lineItems, items, or sessionIdStripe IntegrationError: stripe.redirectToCheckout: 您必须提供 lineItems、items 或 sessionId 之一
【发布时间】:2021-04-11 09:58:06
【问题描述】:

我有一个 Django 网站,我正在尝试使用 Django 集成 Stripe,后端的 Stripe API 和前端的 Vue.js。但是,当我尝试运行应该将我重定向到付款处理页面的结帐链接时,我收到以下错误:

Error: IntegrationError: stripe.redirectToCheckout: You must provide one of lineItems, items, or sessionId.
    at new r (https://js.stripe.com/v3/:1:6143)
    at Js (https://js.stripe.com/v3/:1:165350)
    at $s (https://js.stripe.com/v3/:1:165646)
    at https://js.stripe.com/v3/:1:166758
    at Qs (https://js.stripe.com/v3/:1:166769)
    at nc (https://js.stripe.com/v3/:1:167275)
    at Ec.redirectToCheckout (https://js.stripe.com/v3/:1:188030)
    at http://localhost:8000/dashboard/myaccount/teams/plans/:342:39

这是负责此操作的 Vue.js 方法:

    <script src="https://js.stripe.com/v3/"></script>
    <script>
        const PlansApp = {
            data() {
                return {

                }
            },
            delimiters: ['[[', ']]'],
            methods: {
                subscribe(plan) {
                    console.log('Subscribe:', plan);

                    const stripe = Stripe('{{ stripe_pub_key }}');

                    fetch('/dashboard/myaccount/teams/api/create_checkout_session/', {
                        method: 'POST',
                        headers: {
                            'Content-Type': 'application/json',
                            'X-CSRFToken': '{{ csrf_token }}'
                        },
                        body: JSON.stringify({
                            'plan': plan
                        })
                    })
                    .then(function(response) {
                        return response.json()
                    })
                    .then(function(session) {
                        console.log(session)
                        return stripe.redirectToCheckout({ sessionId: session.sessionId })
                    })
                    .then(function(result) {
                        if (result.error) {
                            console.log('Error:', result.error.message)
                        }
                    })
                    .catch(function(error) {
                        console.log('Error:', error);
                    });
                }
            }
        }

        Vue.createApp(PlansApp).mount('#plans-app')
    </script>

这是在后端创建会话的 Django 代码:

@login_required
def create_checkout_session(request):
    stripe.api_key = settings.STRIPE_SECRET_KEY
    
    data = json.loads(request.body)
    plan = data['plan']

    if plan == 'basic':
        price_id = settings.STRIPE_BASIC_PRICE_ID
    else:
        price_id = settings.STRIPE_PRO_PRICE_ID

    try:
        checkout_session = stripe.checkout.Session.create(
            client_reference_id = request.user.userprofile.active_team_id,
            success_url = '%s%s?session_id={CHECKOUT_SESSION_ID}' % (settings.WEBSITE_URL, reverse('team:plans_thankyou')),
            cancel_url = '%s%s' % (settings.WEBSITE_URL, reverse('team:plans')),
            payment_method_types = ['card'],
            mode = 'subscription',
            line_items = [
                {
                    'price': price_id,
                    'quantity': 1
                }
            ]
        )
        return JsonResponse({'sessionId': checkout_session['id']})
    except Exception as e:
        return JsonResponse({'error': str(e)})

我正在努力找出为什么我会收到我遇到的错误,并会感谢任何帮助!

【问题讨论】:

    标签: python django stripe-payments


    【解决方案1】:

    我的问题来自“success_url”和“cancel_url”。

    尝试在您的网址中添加 http:// 或 https://

    真诚的

    【讨论】: