获取Stripe Token时出错求助:Stripe新手实现订阅功能遇问题
搞定Stripe订阅:前端获取Token并对接后端(基于V3版本)
嘿,作为Stripe新手确实容易被旧文档绕晕,别担心!现在Stripe.js V3已经是官方主推的版本了,V2早就被弃用,我给你一步步梳理怎么实现你要的订阅流程:
第一步:引入最新的Stripe.js V3脚本
先把旧的V2脚本换掉,用官方最新的:
<script src="https://js.stripe.com/v3/"></script>
第二步:初始化Stripe实例
用你从仪表盘拿到的发布密钥(以pk_开头的那个)初始化:
const stripe = Stripe('你的发布密钥');
敲黑板:绝对不能把后端用的密钥密钥(
sk_开头)放到前端,会泄露!
第三步:创建卡片输入元素
Stripe会帮你渲染安全合规的卡片输入框,不用自己写原生表单:
- 先在页面里放两个容器:
<!-- 卡片输入框的容器 --> <div id="card-element"></div> <!-- 错误提示的容器 --> <div id="card-errors" role="alert"></div>
- 然后初始化并挂载卡片元素:
const elements = stripe.elements(); // 创建卡片元素 const cardElement = elements.create('card'); // 把元素挂载到页面容器里 cardElement.mount('#card-element'); // 监听卡片输入的错误,实时提示用户 cardElement.on('change', function(event) { const displayError = document.getElementById('card-errors'); if (event.error) { displayError.textContent = event.error.message; } else { displayError.textContent = ''; } });
第四步:表单提交时获取Token并传给后端
假设你有个订阅表单,给表单绑定提交事件,获取Token后发请求到后端:
const subscriptionForm = document.getElementById('subscription-form'); subscriptionForm.addEventListener('submit', async (e) => { e.preventDefault(); // 阻止默认表单提交 // 调用Stripe的createToken方法生成卡片Token const {error, token} = await stripe.createToken(cardElement); if (error) { // 有错误就显示给用户 const errorElement = document.getElementById('card-errors'); errorElement.textContent = error.message; } else { // 没有错误就把Token和订阅方案ID传给后端 fetch('/api/create-subscription', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ stripeToken: token.id, // 拿到的卡片Token planId: '你的订阅方案ID' // 就是你在仪表盘配置的每月5美元方案的ID }) }) .then(response => response.json()) .then(data => { // 处理后端返回的结果 if (data.success) { alert('订阅成功!'); // 可以跳转到成功页面 window.location.href = '/subscription-success'; } else { alert('订阅失败:' + data.error); } }); } });
后端关键提示(必看)
前端拿到Token只是第一步,真正创建订阅要靠后端调用Stripe的服务器端API:
- 后端要用Stripe对应的服务器SDK(比如Node.js、Python、PHP等),用密钥密钥初始化
- 接收前端传的
stripeToken和planId,先创建Stripe客户,再创建订阅
举个Node.js的简单示例:
const stripe = require('stripe')('你的密钥密钥'); // 后端接口 app.post('/api/create-subscription', async (req, res) => { const {stripeToken, planId} = req.body; try { // 先创建Stripe客户 const customer = await stripe.customers.create({ source: stripeToken, email: req.user.email // 这里可以用你系统里用户的邮箱,或者从前端传 }); // 创建订阅 const subscription = await stripe.subscriptions.create({ customer: customer.id, items: [{plan: planId}], payment_behavior: 'default_incomplete', // 处理支付失败的场景,可选但推荐 expand: ['latest_invoice.payment_intent'] }); res.json({success: true, subscriptionId: subscription.id}); } catch (error) { res.json({success: false, error: error.message}); } });
额外注意事项
- 测试的时候用Stripe的测试卡号:
4242 4242 4242 4242,过期日期填未来的月份(比如12/30),CVV随便填3位数字 - 如果要支持更多支付方式(比如Apple Pay、Google Pay),推荐用
Payment Element代替Card Element,官方文档里有详细说明 - 一定要确保前后端用的Stripe版本兼容,避免出现API调用错误
内容的提问来源于stack exchange,提问作者user9647280
相关产品推荐
相关产品推荐

