Stripe +DjangoでECサイトを作成しようとしていたのですがクレジットカード決済フォームを反映できずJavascriptコンソールでエラーが出力されます。
Javascriptコンソールのえらーは下記です。
(インデックス):1 Uncaught IntegrationError: The selector you specified (#card-element) applies to no DOM elements that are currently on the page. Make sure the element exists on the page before calling mount(). at n.<anonymous> ((インデックス):1:175380) at n.mount ((インデックス):1:73382) at stripe.js:17:6
コードは下記です。
html
1{% extends 'app/base.html' %}{% load static %} 2{% block content %} 3<div class="my-5"> 4 <h3>注文内容を確認する</h3> 5</div> 6<form method="POST" id="payment-form"> 7 <div class="row order"> 8 <div class="col-md-9"> 9 <div class="card px-4"> 10 <div class="card-body px-2 py3"> 11 <div class="row"> 12 <div class="col-md-6"> 13 <p class="font-weight-bold">お届け先住所</p> 14 <p>名前:{{ user_data.first_name }}{{ user_data.last_name }}</p> 15 <p>住所:{{ user_data.adderss }}</p> 16 <p>電話番号:{{ user_data.tel }}</p> 17 </div> 18 <div class="col-md-6"> 19 <p class="font-weight-bold">お支払い方法</p> 20 {% csrf_token %} 21 <div class="form-row"> 22 <label for="card-element"> 23 クレジット・デビットカード番号 24 </label> 25 <div class="card-element"><!-- Stripe Element がここに入ります。 --></div> 26 <div class="card-errors" role="alert"><!-- Element のエラーを入れます。 --></div> 27 </div> 28 </div> 29 </div> 30 </div> 31 </div> 32 </div> 33 <div class="col-md-3"> 34 <div class="card"> 35 <div class="card-body text-center px-2 py-3"> 36 <div class="mb-3"> 37 <button class="btn btn-warning" type="submit">注文を確定する</button> 38 </div> 39 <p class="font-weight-bold">注文内容</p> 40 <p>商品の小計:{{ order.get_total }}</p> 41 <p>配送料:後で記載する円</p> 42 <hr> 43 <p class="font-weight-bold text-danger">ご請求金額:{{ order.get_total }}円</p> 44 </div> 45 </div> 46 </div> 47 </div> 48</form> 49{% endblock %} 50{% block extra_js %} 51<script type="text/javascript" src="https://js.stripe.com/v3/"></script> 52<script type="text/javascript" src="{% static 'js/stripe.js' %}"></script> 53{% endblock %}
Javascript
1var stripe = Stripe('pk_test_51KM6HaFNqBsvkEpxtbb0vaRAIfpvLS3qfBKdLCL5uhk53lbB6W7mD4NLHCvlikaPfaHxpSyEJLm94T99OfHQzD5800r0beCYQB'); 2var elements = stripe.elements(); 3 4// Custom styling can be passed to options when creating an Element. 5var style = { 6 base: { 7 // Add your base input styles here. For example: 8 fontSize: '16px', 9 color: '#32325d', 10 }, 11}; 12 13// Create an instance of the card Element. 14var card = elements.create('card', {style: style}); 15 16// Add an instance of the card Element into the `card-element` <div>. 17card.mount('#card-element'); 18 19 20//トークン作成もしくはエラー表示 21var form = document.getElementById('payment-form'); 22form.addEventListener('submit', function(event) { 23 event.preventDefault(); 24 25 stripe.createToken(card).then(function(result) { 26 if (result.error) { 27 // エラー表示. 28 var errorElement = document.getElementById('card-errors'); 29 errorElement.textContent = result.error.message; 30 } else { 31 // トークンをサーバに送信 32 stripeTokenHandler(result.token); 33 } 34 }); 35}); 36 37function stripeTokenHandler(token) { 38 // tokenをフォームへ包含し送信 39 var form = document.getElementById('payment-form'); 40 var hiddenInput = document.createElement('input'); 41 hiddenInput.setAttribute('type', 'hidden'); 42 hiddenInput.setAttribute('name', 'stripeToken'); 43 hiddenInput.setAttribute('value', token.id); 44 form.appendChild(hiddenInput); 45 46 // Submit します 47 form.submit(); 48}
Stripe の手順
https://stripe.com/docs/payments/accept-a-payment-charges
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/06 15:57