首页 > 解决方案 > 为什么使用 django stripe 时条卡元素不加载?

问题描述

嗨,我一直在尝试学习如何构建电子商务网站,但我一直在使用 Django Stripe 集成来自定义支付流程。我可以让预建的结帐工作,但不能用于自定义支付流程。

几个月前,Stripe 似乎已经更新了他们文档上的代码,所以当我尝试查找教程时,它们似乎都没有相同的代码,我似乎无法弄清楚如何让它工作。我是自学成才,只是一个初学者/中级者,所以可能会遗漏一些明显的东西。

我正在使用此页面https://stripe.com/docs/payments/integration-builder中的代码并尝试将其转换为 Django。

这是我的意见.py

from django.shortcuts import render
import stripe
from django.http import JsonResponse
import json
# Create your views here.
from django.views import View


stripe.api_key = "xxxxxxxxx"


class StripeIntentView(View):
    def post(self, request, *args, **kwargs):
        try:
            
            intent = stripe.PaymentIntent.create(
                amount=2000,
                currency='usd'
            )
            return JsonResponse({
            'clientSecret': intent['client_secret']
            })
        except Exception as e:
            return JsonResponse({'error':str(e)})

def payment_method_view(request):
    

    return render(request, 'custom-landing.html')

这是我的 urls.py

from django.contrib import admin
from django.urls import path
from products.views import payment_method_view,StripeIntentView

urlpatterns = [
    path('admin/', admin.site.urls),
    path('custom-landing/', payment_method_view, name='custom-landing-page'),
    path('create-payment-intent/', StripeIntentView.as_view(), name='create-payment-intent'),

]

这是我的 Landing-page.html

{% load static %}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="utf-8" />
  <title>Accept a card payment</title>
  <meta name="description" content="A demo of a card payment on Stripe" />
  <meta name="viewport" content="width=device-width, initial-scale=1" />

  <link rel="stylesheet" href="global.css" />
  <script src="https://js.stripe.com/v3/"></script>
  <script src="https://polyfill.io/v3/polyfill.min.js?version=3.52.1&features=fetch"></script>
  <script src='{% static "js/client.js" %}'></script>
  <style>
    /* Variables */
    * {
      box-sizing: border-box;
    }

    body {
      font-family: -apple-system, BlinkMacSystemFont, sans-serif;
      font-size: 16px;
      -webkit-font-smoothing: antialiased;
      display: flex;
      justify-content: center;
      align-content: center;
      height: 100vh;
      width: 100vw;
    }

    form {
      width: 30vw;
      min-width: 500px;
      align-self: center;
      box-shadow: 0px 0px 0px 0.5px rgba(50, 50, 93, 0.1),
        0px 2px 5px 0px rgba(50, 50, 93, 0.1), 0px 1px 1.5px 0px rgba(0, 0, 0, 0.07);
      border-radius: 7px;
      padding: 40px;
    }

    input {
      border-radius: 6px;
      margin-bottom: 6px;
      padding: 12px;
      border: 1px solid rgba(50, 50, 93, 0.1);
      height: 44px;
      font-size: 16px;
      width: 100%;
      background: white;
    }

    .result-message {
      line-height: 22px;
      font-size: 16px;
    }

    .result-message a {
      color: rgb(89, 111, 214);
      font-weight: 600;
      text-decoration: none;
    }

    .hidden {
      display: none;
    }

    #card-error {
      color: rgb(105, 115, 134);
      text-align: left;
      font-size: 13px;
      line-height: 17px;
      margin-top: 12px;
    }

    #card-element {
      border-radius: 4px 4px 0 0;
      padding: 12px;
      border: 1px solid rgba(50, 50, 93, 0.1);
      height: 44px;
      width: 100%;
      background: white;
    }

    #payment-request-button {
      margin-bottom: 32px;
    }

    /* Buttons and links */
    button {
      background: #5469d4;
      color: #ffffff;
      font-family: Arial, sans-serif;
      border-radius: 0 0 4px 4px;
      border: 0;
      padding: 12px 16px;
      font-size: 16px;
      font-weight: 600;
      cursor: pointer;
      display: block;
      transition: all 0.2s ease;
      box-shadow: 0px 4px 5.5px 0px rgba(0, 0, 0, 0.07);
      width: 100%;
    }

    button:hover {
      filter: contrast(115%);
    }

    button:disabled {
      opacity: 0.5;
      cursor: default;
    }

    /* spinner/processing state, errors */
    .spinner,
    .spinner:before,
    .spinner:after {
      border-radius: 50%;
    }

    .spinner {
      color: #ffffff;
      font-size: 22px;
      text-indent: -99999px;
      margin: 0px auto;
      position: relative;
      width: 20px;
      height: 20px;
      box-shadow: inset 0 0 0 2px;
      -webkit-transform: translateZ(0);
      -ms-transform: translateZ(0);
      transform: translateZ(0);
    }

    .spinner:before,
    .spinner:after {
      position: absolute;
      content: "";
    }

    .spinner:before {
      width: 10.4px;
      height: 20.4px;
      background: #5469d4;
      border-radius: 20.4px 0 0 20.4px;
      top: -0.2px;
      left: -0.2px;
      -webkit-transform-origin: 10.4px 10.2px;
      transform-origin: 10.4px 10.2px;
      -webkit-animation: loading 2s infinite ease 1.5s;
      animation: loading 2s infinite ease 1.5s;
    }

    .spinner:after {
      width: 10.4px;
      height: 10.2px;
      background: #5469d4;
      border-radius: 0 10.2px 10.2px 0;
      top: -0.1px;
      left: 10.2px;
      -webkit-transform-origin: 0px 10.2px;
      transform-origin: 0px 10.2px;
      -webkit-animation: loading 2s infinite ease;
      animation: loading 2s infinite ease;
    }

    @-webkit-keyframes loading {
      0% {
        -webkit-transform: rotate(0deg);
        transform: rotate(0deg);
      }

      100% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
      }
    }

    @keyframes loading {
      0% {
        -webkit-transform: rotate(0deg);
        transform: rotate(0deg);
      }

      100% {
        -webkit-transform: rotate(360deg);
        transform: rotate(360deg);
      }
    }

    @media only screen and (max-width: 600px) {
      form {
        width: 80vw;
      }
    }
  </style>
</head>

<body>
  <!-- Display a payment form -->
  <form id="payment-form">
    <div id="card-element"><!--Stripe.js injects the Card Element--></div>
    <button id="submit">
      <div class="spinner hidden" id="spinner"></div>
      <span id="button-text">Pay now</span>
    </button>
    <p id="card-error" role="alert"></p>
    <p class="result-message hidden">
      Payment succeeded, see the result in your
      <a href="" target="_blank">Stripe dashboard.</a> Refresh the page to pay again.
    </p>
  </form>




</body>
</html>

这就是我的http://127.0.0.1:8000/custom-landing/上显示的内容

在此处输入图像描述

我不知道为什么,但卡片元素没有出现。

我只更改了python代码。javascript、html 和 CSS 代码与 Stripe 文档中的相同。

关于如何加载卡片元素的任何想法?

非常感谢有关 django 代码是否是视图的任何反馈。

谢谢

编辑:这是在我的浏览器控制台中显示的代码。

在此处输入图像描述

client.js 的第 10 行是

 document.querySelector("button").disabled = true;

标签: pythondjangostripe-payments

解决方案


推荐阅读