私は初心者で、私のdjangoアプリケーションで支払いを処理するためのストライプを実装しています。ajax/jqueryを使用してdjangoにstripe.jsトークンを渡す
私はdj-stripeを使用しており、顧客を作成してこの設定でプランを追加できます。
stripe.jsを使用してトークンを作成したいので、ストライプ自体(https://stripe.com/docs/elements/examples)からきれいにフォーマットされたカード送信フォームを使用できます。私はdjangoフォームを使用してカードの詳細を収集することは望ましくありません。これらはレイアウト上で変更するのが難しく、私はセキュリティ上の観点から自分のdjangoアプリケーションでクレジットカードの詳細を処理したくありません。
私はストライプのjavascriptフォームを正常に動作させることができ、出力は「トークン」形式で出力されます。私はjavascriptの出力を私のdjangoアプリケーションに渡し、これを私の顧客にアタッチする必要があります。
これはjQuery/Ajaxの設定で発生するはずですが、私は初心者なので、どうやって始めたらよいか分かりません。私はthisを見つけましたが、それを私のニーズにどのように適応させるかはわかりません。
私の現在の設定では、payment.html Success! Your Stripe token is <span class="token"></span>
がコード化されている出力トークンが出力されます。 、以前payment.htmlするために追加さが、下記payment.htmlには示されていない
私のjQueryの/ AJAXスクリプトの試み:私はこのようなjQueryのスクリプト内token
を参照しようとしたが、token
は私のブラウザ内でエラーcould not be read
を得た
<script type="text/javascript">
$(document).ready(function() {
$.ajax({
method: 'POST',
url: '/payments/settings/',
data: {'yourJavaScriptArrayKey': yourJavaScriptArray},
success: function (data) {
//this gets called when server returns an OK response
alert("it worked!");
},
error: function (data) {
alert("it didnt work");
}
});
});
</script>
payment.html:
<style> some styles regarding layout of the js-form</style>
<script src="https://js.stripe.com/v3/"></script>
<form>
<div class="group">
<label>
<span>Name</span>
<input name="cardholder-name" class="field" placeholder="Jane Doe" />
</label>
<label>
<span>Phone</span>
<input class="field" placeholder="(123) 456-7890" type="tel" />
</label>
</div>
<div class="group">
<label>
<span>Card</span>
<div id="card-element" class="field"></div>
</label>
</div>
<button type="submit">Add Card</button>
<div class="outcome">
<div class="error" role="alert"></div>
<div class="success">
Success! Your Stripe token is <span class="token"></span>
</div>
</div>
</form>
<script type="text/javascript">
var stripe = Stripe('pk_test_xxxxxxxxxxxxxxxxxxxxxxxx');
var elements = stripe.elements();
var card = elements.create('card', {
style: {
base: {
iconColor: '#666EE8',
color: '#31325F',
lineHeight: '40px',
fontWeight: 300,
fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
fontSize: '15px',
'::placeholder': {
color: '#CFD7E0',
},
},
}
});
card.mount('#card-element');
function setOutcome(result) {
var successElement = document.querySelector('.success');
var errorElement = document.querySelector('.error');
successElement.classList.remove('visible');
errorElement.classList.remove('visible');
if (result.token) {
// Use the token to create a charge or a customer
// https://stripe.com/docs/charges
successElement.querySelector('.token').textContent = result.token.id;
successElement.classList.add('visible');
} else if (result.error) {
errorElement.textContent = result.error.message;
errorElement.classList.add('visible');
}
}
card.on('change', function(event) {
setOutcome(event);
});
document.querySelector('form').addEventListener('submit', function(e) {
e.preventDefault();
var form = document.querySelector('form');
var extraDetails = {
name: form.querySelector('input[name=cardholder-name]').value,
};
stripe.createToken(card, extraDetails).then(setOutcome);
});
</script>
<script>
// I am missing an AJAX/jQUERY script to pass the outcome of the javascript generated token
</script>
views.py
def payment(request):
template = get_template('payment.html')
context = {
}
# HERE THERE SHOULD BE SOME AJAX CALL
return HttpResponse(template.render(context,request))
私のAJAX/jQueryスクリプトは、payment.html
の中にあるので、出力されたトークンにアクセスするにはどうすればいいですか?views.py
の中でこのトークンをどのように呼び出すことができますか?
フォームがロードされており、ネットワーク環境でトークンが作成されているのが分かります。 Djangoで受け入れられていないCSRFトークンは、forms.pyで作成されたものからJS/HTMLコードで作成されたものを使用しているために苦労しています。 'csrf_exempt'を調べていましたが、これが良いアプローチであるかどうかわかりません。 – radzia2
[link](https://stackoverflow.com/questions/16653962/passing-csrf-token-to-stripe)は、 csrfトークンは正しい方法です。セットアップは今あなたのフィードバックで動作します。幸せな男。 – radzia2
ここから始めて、CSRFがこのような状況で懸念されるものであるかどうかを判断します:https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF) –