使用条纹令牌向带有条纹元素的信用卡收费

时间:2019-03-04 01:22:38

标签: django stripe-payments payment

我真的很迷恋这个主题,也许有人可以帮助我。我总是可以成功地生成带有条带的令牌,但是以某种方式我的收费功能将无法正常工作。我正在使用他们官方文档中的stripe元素。 因为没有从代码中得到任何错误,我该如何找出必须搜索的错误。在条纹仪表板中,我可以看到生成的令牌,这就是为什么我认为直到现在一切都正确,但是我想我的错误在于视图函数。更准确地说,我认为视图功能不会从javascript获取生成的令牌。非常感谢您的提前帮助!

stripe_form.html

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  {% load static %}
  <link rel="stylesheet" href="{% static 'css/stripe.css' %}">
  <title>Document</title>
</head>

<body>
  <div id="collapseStripe" class="wrapper">
    <script src="https://js.stripe.com/v3/"></script>

    <form action="" method="post" id="payment-form">
      {% csrf_token %}
      <div class="form-row">
        <label for="card-element">
        Credit or debit card
      </label>
        <div id="card-element" class="StripeElement StripeElement--empty">
          <div class="__PrivateStripeElement" style="margin: 0px !important; padding: 0px !important; border: none !important; display: block !important; background: transparent !important; position: relative !important; opacity: 1 !important;"><iframe frameborder="0" allowtransparency="true" scrolling="no" name="__privateStripeFrame4" allowpaymentrequest="true" src="https://js.stripe.com/v3/elements-inner-card-bfbabea0af3ed365b5fe9ce78692fd3c.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;origin=https%3A%2F%2Fstripe.com&amp;referrer=https%3A%2F%2Fstripe.com%2Fdocs%2Fstripe-js%2Felements%2Fquickstart&amp;controllerId=__privateStripeController1" title="Secure payment input frame" style="border: none !important; margin: 0px !important; padding: 0px !important; width: 1px !important; min-width: 100% !important; overflow: hidden !important; display: block !important; height: 19.2px;"></iframe><input class="__PrivateStripeElement-input" aria-hidden="true" aria-label=" " autocomplete="false" maxlength="1" style="border: 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 !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>Submit Payment</button>
    </form>
  </div>
  <div id="stripe-token-handler" class="is-hidden">Success! Got token: <span class="token"></span></div>

  {% load static %}
  <script src="{% static 'js/stripe.js' %}"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <script type="text/javascript">
    function toggleDisplay() {
      var x = document.getElementById("collapseStripe");
      if (x.style.display === "none") {
        x.style.display = "block";
      } else {
        x.style.display = "none";
      }
    };
  </script>


</body>

</html>

views.py

导入条纹

stripe.api_key = settings.STRIPE_SECRET_KEY

def charge (request):
    publishKey = settings.STRIPE_PUBLISHABLE_KEY
    if request.method == 'POST':
        try:
            token = request.POST['stripeToken']

            charge = stripe.Charge.create(
                amount=999,
                currency='usd',
                description='Example charge',
                source=token,
            )
            return redirect(request, 'registration/stripe_form.html')

        except stripe.CardError as e:
            message.info(request, "Your card has been declined.")

    return render(request, 'registration/stripe_form.html')

stripe.js

var stripe = Stripe('pk_test_');

// Create an instance of Elements.
var elements = stripe.elements();

// Custom styling can be passed to options when creating an Element.
// (Note that this demo uses a wider set of styles than the guide below.)
var style = {
  base: {
    color: '#32325d',
    fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
    fontSmoothing: 'antialiased',
    fontSize: '16px',
    '::placeholder': {
      color: '#aab7c4'
    }
  },
  invalid: {
    color: '#fa755a',
    iconColor: '#fa755a'
  }
};

// Create an instance of the card Element.
var card = elements.create('card', {style: style});

// Add an instance of the card Element into the `card-element` <div>.
card.mount('#card-element');

// Handle real-time validation errors from the card Element.
card.addEventListener('change', function(event) {
  var displayError = document.getElementById('card-errors');
  if (event.error) {
    displayError.textContent = event.error.message;
  } else {
    displayError.textContent = '';
  }
});

// Handle form submission.
var form = document.getElementById('payment-form');
form.addEventListener('submit', function(event) {
  event.preventDefault();

  stripe.createToken(card).then(function(result) {
    if (result.error) {
      // Inform the user if there was an error.
      var errorElement = document.getElementById('card-errors');
      errorElement.textContent = result.error.message;
    } else {
      // Send the token to your server.
      stripeTokenHandler(result.token);
    }
  });
});

// Submit the form with the token ID.
function stripeTokenHandler(token) {
  // Insert the token ID into the form so it gets submitted to the server
  var form = document.getElementById('payment-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';
});

// Not in demo.
function stripeTokenHandler(token) {
  successElement.className = '';
  successElement.querySelector('.token').textContent = token.id;
}

0 个答案:

没有答案