簡體   English   中英

檢索 Stripe 元數據並對其進行處理

[英]Retrieving Stripe metadata and process it

我正在將購物車數據從 cookies 發送到 Stripe 並檢索它,但我無法找到正確處理它的解決方案。

請幫忙!

我正在學習 Django 並想將未登錄用戶的購物車項目保存到 cookies 中並將其作為元數據發送到 Stripe。 從那里檢索它,如果結帳已完成以處理訂單,但我無法處理檢索到的數據以保存訂單。

條紋結帳 Session:

@csrf_exempt
def create_checkout_session(request):
    stripe.api_key = settings.STRIPE_SECRET_KEY
    domain_url = 'http://localhost:8000/checkout/'

    if request.user.is_authenticated:
        customer = request.user.customer
    else:
        data = json.loads(request.body)
        total = data['form']['total'].replace('.', '')
        email = data['form']['email']
        first_name = data['form']['first_name']
        last_name = data['form']['last_name']
        customer, created = Customer.objects.get_or_create(
            email=email
        )
        customer.first_name = first_name
        customer.last_name = last_name
        customer.save()

    cart_info = cart_details(request)

    cart_items = cart_info['cart_items']
    order = cart_info['order']
    items = cart_info['items']

    print(items)

    if request.method == 'GET':
        checkout_session = stripe.checkout.Session.create(
            shipping_address_collection={
                "allowed_countries":
                    ["US", "CA", "NL", "GB"]
                },
            client_reference_id=request.user.id,
            customer_email=request.user.email,
            success_url=domain_url + 'success?session_id={CHECKOUT_SESSION_ID}',
            cancel_url=domain_url + 'cancelled/',
            payment_method_types=['card'],
            mode='payment',
            line_items=[
                {
                    'name': 'Kenpachi Katana Store',
                    'quantity': 1,
                    'currency': 'usd',
                    'amount': int(order.get_cart_total*100),
                }
            ]
        )
        return JsonResponse({'sessionId': checkout_session['id']})
    else:
        checkout_session = stripe.checkout.Session.create(
            shipping_address_collection={
                "allowed_countries":
                    ["US", "CA", "NL"]
                },
            **metadata=[items]**,
            client_reference_id=customer.id,
            customer_email=email,
            success_url=domain_url + 'success?session_id={CHECKOUT_SESSION_ID}',
            cancel_url=domain_url + 'cancelled/',
            payment_method_types=['card'],
            mode='payment',
            line_items=[
                {
                    'name': 'Kenpachi Katana Store',
                    'quantity': 1,
                    'currency': 'usd',
                    'amount': total,
                }
            ]
        )
        return JsonResponse({'sessionId': checkout_session['id']})

帶有 Cookie Cart 變量的終端 Output:

print(type(items))

<類“列表”>

和:

[{'product': 

`{'id': 1, 
'name': 'Sasuke Katana', 
'price': Decimal('270.00'), 
'imageURL': '/media/1_ccbb983f-a35d-40f8-8efb-dc55db02ad8f_700x.webp'}, 
'quantity': 1, 
'get_total': Decimal('270.00')}, 
`
{'product': 
{'id': 3, 
'name': 'Zoro Katana', 
'price': Decimal('260.00'), 
'imageURL': '/media/1_466b0afb-d483-4a32-b0bb-89388aeccaa4_700x.webp'}, 
'quantity': 1, 
'get_total': Decimal('260.00')
}]

並且很容易遍歷它

for item in items:
        print(item)

Output:

在此處輸入圖像描述

訂單完成后,我檢索 Stripe Session 來完成訂單

@csrf_exempt
def stripe_webhook(request):
    stripe.api_key = settings.STRIPE_SECRET_KEY
    endpoint_secret = settings.STRIPE_ENDPOINT_SECRET
    payload = request.body
    sig_header = request.META['HTTP_STRIPE_SIGNATURE']
    event = None

    try:
        event = stripe.Webhook.construct_event(
            payload,
            sig_header,
            endpoint_secret
        )
    except ValueError as e:
        return HttpResponse(status=400)
    except stripe.error.SignatureVerificationError as e:
        return HttpResponse(status=400)

    if event['type'] == 'checkout.session.completed':
        session = event['data']['object']
        session = stripe.checkout.Session.retrieve(
            event['data']['object']['id'],
            expand=['line_items'],
        )

        stripe_metadata = session['metadata'].setdefault('0')
        print(stripe_metadata)
        print(type(stripe_metadata))

        # Fulfill the purchase...

        #   TODO: drill down on the metadata from stripe
        transaction_id = datetime.datetime.now().timestamp()
        total = session['amount_total']
        customer_id = session['client_reference_id']
        customer = Customer.objects.get(pk=customer_id)
        order, created = Order.objects.get_or_create(
            customer=customer,
            complete=False
        )
        order.transaction_id = transaction_id

        if (total / 100) == int(order.get_cart_total):
            order.complete = True

        ShippingAddress.objects.create(
            customer=customer,
            order=order,
            address=session['shipping']['address']['line1'],
            city=session['shipping']['address']['city'],
            state=session['shipping']['address']['state'],
            zipcode=session['shipping']['address']['postal_code'],
            country=session['shipping']['address']['country'],
        )
        order.save()
        print('Order was added to the database')
        return HttpResponse(status=200)

終端Output:

在此處輸入圖像描述

以相同格式檢索它的最佳選擇是什么,以便能夠遍歷購物車的產品。

任何幫助將不勝感激。

GitHub 帶有 cookie 購物車的 repo function: https://github.com/GeorgianF/Kenpachi-P5-CI/blob/main/cart/utils.py

謝謝!

也許你可以試試

stripe_metadata = json.loads(str(stripe_metadata))

將字符串轉換為 JSON 格式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM