如何在订阅模式下发送Stripe会话结账参数

问题描述 投票:0回答:1

我对条带集成还很陌生,并且由于我来自的国家/地区,由于帐户激活要求,我无法访问结帐会话页面。 因此,我无法看到结帐页面中可见的所有详细信息,并且无法对其进行调试。 (我处于测试模式)

我很困惑如何发送我选择的产品的价格 ID。 我在仪表板中创建了两个产品,然后在前端显示一个调用

checkout-session
端点的支付按钮。

这是我的 checkoutSession 视图

class CreateCheckoutSession(APIView):
    def post(self, request):
        if request.method == 'POST':
            

            try:

                if request.user.is_authenticated:
                    print(request.user)
                    print(request.user.id)
                    checkout_session = stripe.checkout.Session.create(
                        client_reference_id=request.user.id,
                        payment_method_types=['card'],
                        line_items=[
                            {
                                'price': "",  
                                'quantity': 1,
                            },
                        ],
                        mode='subscription',
                        success_url=os.environ['DOMAIN_URL']+'/dashboard',
                        cancel_url=os.environ['DOMAIN_URL'],
                    )
                    return Response({'sessionId': checkout_session.id})
                else:
                    return Response({'message': 'You need to register first.'}, status=403)

            except InvalidRequestError as e:
                error_message = str(e)
                return Response({'error': error_message}, status=400)

        else:
            return Response({'error': 'Method not allowed'}, status=405)

我认为我应该只发送我想购买的订阅的价格 ID 或产品 ID(我应该发送哪一个?)。我不知道我该怎么做。有人可以帮我吗? 我的前端是 NEXTJS,后端是 django 和 DRF

const handleSubscription = async () => {
    try {
      const response = await AxiosInstance.post("/checkout-session", {
        
      });
      
      const sessionId = response.data.sessionId;
      const stripe = await loadStripe(
        process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
      );
      const { error } = await stripe.redirectToCheckout({
        sessionId: sessionId,
      });

      if (error) {
        console.error("Error:", error);
      }

调用产品 api 时,它给我两个数组,每个产品一个。 我需要您的帮助了解,我订阅的产品需要发送哪些参数? 我该如何发送?

我尝试使用 stripe 元素实现 stripe 代码实现,现在切换到 stripe 低代码,因为它最适合我当前的用例。 我无法检查我的付款是否成功完成,因为由于条带政策,在帐户激活之前我无法从我的国家/地区进行任何付款。

django django-rest-framework stripe-payments payment-gateway
1个回答
0
投票

在您的

CreateCheckoutSession
视图中,您需要传递要购买的订阅计划的正确
price
ID。您可以通过以下方式修改代码来实现此目的:

class CreateCheckoutSession(APIView):
    def post(self, request):
        if request.method == 'POST':
            try:
                # Retrieve the selected price ID from the request data
                price_id = request.data.get('price_id')

                if request.user.is_authenticated:
                    print(request.user)
                    print(request.user.id)
                    checkout_session = stripe.checkout.Session.create(
                        client_reference_id=request.user.id,
                        payment_method_types=['card'],
                        line_items=[
                            {
                                'price': price_id,  # Pass the selected price ID here
                                'quantity': 1,
                            },
                        ],
                        mode='subscription',
                        success_url=os.environ['DOMAIN_URL']+'/dashboard',
                        cancel_url=os.environ['DOMAIN_URL'],
                    )
                    return Response({'sessionId': checkout_session.id})
                else:
                    return Response({'message': 'You need to register first.'}, status=403)

            except InvalidRequestError as e:
                error_message = str(e)
                return Response({'error': error_message}, status=400)

        else:
            return Response({'error': 'Method not allowed'}, status=405)

在前端代码中,调用

/checkout-session
端点时,请确保在请求数据中包含
price_id
。具体方法如下:

const handleSubscription = async (priceId) => {  // Pass the price ID as an argument
    try {
      const response = await AxiosInstance.post("/checkout-session", {
        price_id: priceId,  // Include the selected price ID in the request data
      });
      
      const sessionId = response.data.sessionId;
      const stripe = await loadStripe(
        process.env.NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
      );
      const { error } = await stripe.redirectToCheckout({
        sessionId: sessionId,
      });

      if (error) {
        console.error("Error:", error);
      }
    } catch (error) {
      console.error("Error:", error);
    }
}

确保在调用

priceId
时从前端正确传递
handleSubscription
。这将使您能够将正确的订阅计划传递给 Stripe Checkout 并继续付款。如果您需要进一步的帮助,请告诉我!

© www.soinside.com 2019 - 2024. All rights reserved.