如何在Python中从表单POST提交获取Stripe令牌?
解决Stripe令牌在Flask后端无法提取ID的问题
看起来你是在前端成功拿到了Stripe令牌,但传到Flask后端后,只能看到[object Object]这样的输出,没法拿到里面的令牌ID和其他数据对吧?这大概率是前端传递令牌的方式出了问题,我来一步步帮你解决:
先搞定前端:传递令牌ID而非整个对象
Stripe的createToken方法返回的是一个包含token对象的结果,这个对象里有你需要的id(就是令牌ID)、card(卡片详情)等属性。如果你直接把整个token对象塞到隐藏输入框的value里,浏览器会自动把它转成[object Object]这个没用的字符串——这就是问题的根源。
正确的做法是提取token.id,再放到隐藏输入里:
// 假设你用Stripe.js创建令牌的代码 stripe.createToken(cardElement).then(function(result) { if (result.error) { // 这里处理错误提示,比如显示给用户 } else { // 取出真正需要的令牌ID const stripeTokenId = result.token.id; // 把ID赋值给隐藏输入框 document.getElementById('stripe-token').value = stripeTokenId; // 提交表单到你的Flask后端 document.getElementById('payment-form').submit(); } });
对应的HTML隐藏输入框要设置好name属性,方便后端获取:
<input type="hidden" id="stripe-token" name="stripe_token">
再处理后端:Flask轻松提取令牌ID
当前端正确传递了令牌ID后,在Flask里就可以直接从request.form中获取了:
from flask import Flask, request app = Flask(__name__) @app.route('/newForm', methods=['POST', 'GET']) def newForm(): if request.method == 'POST': # 直接拿到令牌ID stripe_token_id = request.form.get('stripe_token') # 拿到ID后,你就可以调用Stripe的API做后续操作了,比如创建收费 # 举个例子(记得先导入stripe库并设置密钥): # import stripe # stripe.api_key = "你的Stripe密钥" # charge = stripe.Charge.create( # amount=1000, # 单位是分,这里是10美元 # currency='usd', # source=stripe_token_id, # description='测试收费' # ) # 如果前端不小心传了整个Token对象(比如用JSON.stringify转成了字符串),那可以这样解析: # import json # stripe_token_data = json.loads(request.form.get('stripe_token')) # stripe_token_id = stripe_token_data['id'] # card_brand = stripe_token_data['card']['brand'] # 获取卡片品牌,比如Visa # last4 = stripe_token_data['card']['last4'] # 获取卡片最后四位 # 处理其他表单数据 other_form_data = request.form.to_dict() return f"成功获取令牌ID: {stripe_token_id}" else: # GET请求时渲染你的表单页面 return render_template('payment_form.html')
快速排查小技巧
- 打开浏览器的开发者工具(F12),切换到Network标签,提交表单后看请求的Form Data里,
stripe_token的值是不是类似tok_xxxxxx的字符串,而不是[object Object]。 - 前端控制台打印
result.token确认它确实有id属性,避免因为Stripe API版本更新导致属性名变化。
内容的提问来源于stack exchange,提问作者Johnny John Boy
相关产品推荐
相关产品推荐

