首页 > 解决方案 > 我正在尝试使用条纹支付。但是在提交卡详细信息时遇到一些问题

问题描述

我只关注 django 教程。单击提交按钮后,我无法收到任何成功消息或错误消息。单击提交按钮后,页面甚至没有被重定向。不知道我的帖子方法哪里出错了。Ps 我已经创建了我的条带账户,并且我使用了这些公钥和私钥。任何帮助表示赞赏。TIA

付款.html

{% extends 'base.html' %}

{% block content %}
  <main class="mt-5 pt-4">
    <div class="container wow fadeIn">

      <h2 class="my-5 h2 text-center">Payment</h2>

      <div class="row">

        <div class="col-md-12 mb-4">

          <div class="card">

              <script src="https://js.stripe.com/v3/"></script>

                <form action="." method="post" id="stripe-form">
                {% csrf_token %}
                    <div class="stripe-form-row">
                    <label for="card-element" id="stripeBtnLabel">
                        Credit or debit card
                    </label>
                    <div id="card-element" class="StripeElement StripeElement--empty"><div class="__PrivateStripeElement" style="margin: 0px !important; padding: 0px !important; border: medium none !important; display: block !important; background: transparent none repeat scroll 0% 0% !important; position: relative !important; opacity: 1 !important;"><iframe allowtransparency="true" scrolling="no" name="__privateStripeFrame5" allowpaymentrequest="true" src="https://js.stripe.com/v3/elements-inner-card-fbfeb5b62d598125b16ab6addef894d6.html#style[base][color]=%2332325d&amp;style[base][fontFamily]=%22Helvetica+Neue%22%2C+Helvetica%2C+sans-serif&amp;style[base][fontSmoothing]=antialiased&amp;style[base][fontSize]=16px&amp;style[base][::placeholder][color]=%23aab7c4&amp;style[invalid][color]=%23fa755a&amp;style[invalid][iconColor]=%23fa755a&amp;componentName=card&amp;wait=false&amp;rtl=false&amp;keyMode=test&amp;apiKey=pk_test_i0vc3rYRd3tcPmIsJIIQOiiI00khWr20iQ&amp;origin=https%3A%2F%2Fstripe.com&amp;referrer=https%3A%2F%2Fstripe.com%2Fdocs%2Fstripe-js&amp;controllerId=__privateStripeController1" title="Secure payment input frame" style="border: medium none !important; margin: 0px !important; padding: 0px !important; width: 1px !important; min-width: 100% !important; overflow: hidden !important; display: block !important; height: 19.2px;" frameborder="0"></iframe><input class="__PrivateStripeElement-input" aria-hidden="true" aria-label=" " autocomplete="false" maxlength="1" style="border: medium none !important; display: block !important; position: absolute !important; height: 1px !important; top: 0px !important; left: 0px !important; padding: 0px !important; margin: 0px !important; width: 100% !important; opacity: 0 !important; background: transparent none repeat scroll 0% 0% !important; pointer-events: none !important; font-size: 16px !important;"></div></div>
                    <!-- Used to display form errors. -->
                    <div id="card-errors" role="alert"></div>
                    </div>

                    <button id="stripeBtn">Submit Payment</button>
                </form>

          </div>
          <!--/.Card-->

        </div>
        <!--Grid column-->

      </div>
      <!--Grid row-->

    </div>
  </main>

    {% endblock content %}

    {% block extra_scripts %} 
<script type="text/javascript" nonce="zQL2oP9DrQhQ+sjXkd3Usg==">  // Create a Stripe client.
  var stripe = Stripe('acc key');
  var elements = stripe.elements();
  var card = elements.create('card', {style: style});
  card.mount('#card-element');
  card.addEventListener('change', function(event) {
    var displayError = document.getElementById('card-errors');
    if (event.error) {
      displayError.textContent = event.error.message;
    } else {
      displayError.textContent = '';
    }
  });
  var form = document.getElementById('stripe-form');
  form.addEventListener('submit', function(event) {
    event.preventDefault();

    stripe.createToken(card).then(function(result) {
      if (result.error) {

        var errorElement = document.getElementById('card-errors');
        errorElement.textContent = result.error.message;
      } else {

        stripeTokenHandler(result.token);
      }
    });
  });


  function stripeTokenHandler(token) {
    // Insert the token ID into the form so it gets submitted to the server
    var form = document.getElementById('stripe-form');
    var hiddenInput = document.createElement('input');
    hiddenInput.setAttribute('type', 'hidden');
    hiddenInput.setAttribute('name', 'stripeToken');
    hiddenInput.setAttribute('value', token.id);
    form.appendChild(hiddenInput);

    // Submit the form
    form.submit();
  }

  var successElement = document.getElementById('stripe-token-handler');
  document.querySelector('.wrapper').addEventListener('click', function() {
    successElement.className = 'is-hidden';
  });

  function stripeTokenHandler(token) {
    successElement.className = '';
    successElement.querySelector('.token').textContent = token.id;
  }
</script>
    {% endblock extra_scripts %}

视图.py

class PaymentView(View):
    def get(self, *args, **kwargs):
        print("get mothod")
        return render(self.request, "payment.html")

    def post(self, *args, **kwargs):
        print("post method")
        order = Order.objects.get(user=self.request.user, ordered=False)
        token = self.request.POST.get('stripeToken')
        amount=order.get_total_price()
        print(self.user.POST)


        try:
            print("try loop")
            # Use Stripe's library to make requests...
            charge = stripe.Charge.create(
                amount=amount,
                currency="inr",
                source=token            )

                #create paymeny
            payment = Payment()
            payment.stripe_charge_id = charge['id']
            payment.amount = amount
            payment.save()

            #assign payment to order
            order.odered = True
            order.payment = payment
            order.save()

            messages.success(self.request, "payment successful")
            return redirect("/")


        except stripe.error.CardError as e:
            # Since it's a decline, stripe.error.CardError will be caught
            body = e.json_body
            err = body.get('error', {})
            messages.warning(self.request, f"{err.get('message')}")
            return redirect("/")


        except stripe.error.RateLimitError as e:
                # Too many requests made to the API too quickly
                messages.error(self.request, f"{err.get('message')}")
                return redirect("/")

        except stripe.error.InvalidRequestError as e:
                # Invalid parameters were supplied to Stripe's API
                messages.error(self.request,"invalid parameters")
                return redirect("/")

        except stripe.error.AuthenticationError as e:
            # Authentication with Stripe's API failed
            # (maybe you changed API keys recently)
                messages.error(self.request, "not authenticated")
                return redirect("/")

        except stripe.error.APIConnectionError as e:
            # Network communication with Stripe failed
                messages.error(self.request, "no network")
                return redirect("/")

        except stripe.error.StripeError as e:
            # Display a very generic error to the user, and maybe send
            # yourself an email
                messages.error(self.request, "soemthng went wrong")
                return redirect("/")

        except Exception as e:
            # Something else happened, completely unrelated to Stripe
                messages.error(self.request, "soemthing went wrong. we re notified")
                return redirect("/")

标签: pythondjangostripe-payments

解决方案


推荐阅读