Javascript 如何将条带自定义签出令牌发布到flask后端
我正在尝试将Stripe定制结账与Flask和WTForms集成。我目前的问题是,付款单似乎没有过账,因此无法创建信用卡费用 该表单似乎已被识别,因为令牌正在以200响应发布到stripe的api:Javascript 如何将条带自定义签出令牌发布到flask后端,javascript,python,html,flask,stripe-payments,Javascript,Python,Html,Flask,Stripe Payments,我正在尝试将Stripe定制结账与Flask和WTForms集成。我目前的问题是,付款单似乎没有过账,因此无法创建信用卡费用 该表单似乎已被识别,因为令牌正在以200响应发布到stripe的api: XHRPOST https://api.stripe.com/v1/tokens [HTTP/2.0 200 OK 1444ms] Form data card[cvc] 123 card[exp_month] 10 card[exp_year] 20 card[name]
XHRPOST
https://api.stripe.com/v1/tokens
[HTTP/2.0 200 OK 1444ms]
Form data
card[cvc] 123
card[exp_month] 10
card[exp_year] 20
card[name] dev@local.host
card[number] 4242424242424242
email dev@local.host
guid 4a6cfd25-8c4b-4d98-9dd2-9e9c1770e290
key pk_test_DVVO0zxtWjXSZx4yHsZGJxtv
muid c6b9d635-20de-4fc6-8995-5d5b2d165881
payment_user_agent Stripe+Checkout+v3+checkout-manhattan+ (stripe.js/9dc17ab)
referrer http://localhost:8000/subscription/index
sid 494d70dd-e854-497b-945b-de0e96a0d646
time_on_page 26657
validation_type card
但是,令牌(和表单)没有被发布到我的服务器上,以创建stripe所需的费用
下面是加载条带自定义签出的javascript代码,位于/index.html中:
<script src="https://checkout.stripe.com/checkout.js"></script>
<form role="form" id = "payment_form" action="{{ url_for('billing.charge') }}" method="post">
{{ form.hidden_tag }}
<input type="hidden" id="stripeToken" name="stripeToken" />
<input type="hidden" id="stripeEmail" name="stripeEmail" />
<div class="form-group">
<div class="col-md-12 button-field" style = "text-align: center;">
<button type="confirm" id = 'confirm' onclick = "runStripe('https://checkout.stripe.com/checkout.js')" class="btn btn-default btn-responsive btn-lg">Confirm Order</button>
</div>
</div>
<script>
var handler = StripeCheckout.configure({
key: "{{ stripe_key }}",
locale: 'auto',
token: function(token) {
// token ID as a hidden field
var form = document.createElement("form");
form.setAttribute('method', "POST");
form.setAttribute('action', "{{ url_for('billing.charge') }}");
form.setAttribute('name', "payment-form");
var inputToken = document.createElement("input");
inputToken.setAttribute('type', "hidden");
inputToken.setAttribute('name', "stripeToken");
inputToken.setAttribute('value', token.id);
form.appendChild(inputToken);
// email as a hidden field
var inputEmail = document.createElement("input");
inputEmail.setAttribute('type', "hidden");
inputEmail.setAttribute('name', "stripeEmail");
inputEmail.setAttribute('value', token.email);
form.appendChild(inputEmail);
document.body.appendChild(form);
}
});
document.getElementById('confirm').addEventListener('click', function(e) {
// Open Checkout with further options:
handler.open({
name: 'Stripe.com',
description: '2 widgets',
amount: '{{ amount }}'
});
e.preventDefault();
});
// Close Checkout on page navigation:
window.addEventListener('popstate', function() {
handler.close();
});
</script>
<script>
document.getElementsByClassName("stripe-button-el")[0].style.display = 'none';
</script>
我决定将令牌更改为jquery,现在它似乎工作得很好,而且简单得多:
<script>
var handler = StripeCheckout.configure({
key: "{{ stripe_key }}",
locale: 'auto',
token: function(token) {
$(document).ready(function(){
$("#stripeToken").val(token.id);
$("#stripeEmail").val(token.email);
$("#payment_form").submit();
})
</script>
首先,您不需要在
令牌
回调函数中重新创建表单;只需更新现有的隐藏字段值即可;其次,您希望通过form.submit()发布
在token
函数中,我没有在javascript代码中看到任何POST
调用。@wsw感谢您的帮助!我决定使用jquery来代替令牌,这要简单得多。如果您感兴趣,我已经添加了下面的代码。
<script>
var handler = StripeCheckout.configure({
key: "{{ stripe_key }}",
locale: 'auto',
token: function(token) {
$(document).ready(function(){
$("#stripeToken").val(token.id);
$("#stripeEmail").val(token.email);
$("#payment_form").submit();
})
</script>
@billing.route('/index', methods=['GET', 'POST'])
@handle_stripe_exceptions
@login_required
def index():
stripe_key = current_app.config.get('STRIPE_PUBLISHABLE_KEY')
amount = 1010
form = CreditCardForm(stripe_key=stripe_key, name=current_user.name, amount=amount )
if request.method == 'POST':
customer = stripe.Customer.create(
email='customer@example.com',
source=request.form['stripeToken']
)
charge = stripe.Charge.create(
customer=customer.id,
amount=amount,
currency='usd',
description='Flask Charge'
)
return render_template('billing/index.html', stripe_key=stripe_key, form=form)