JavaScript如何实现支付功能_Stripe API如何集成?

JavaScript 不能直接处理支付,需前端用 stripe-js 安全采集信息并生成 payment_method ID,后端用 secret key 调用 Payment Intents API 完成支付,严格分离密钥与敏感操作。

JavaScript 本身不能直接处理支付,因为涉及敏感操作(如卡号、密钥)必须在服务端完成。前端 JavaScript 的作用是:安全采集用户支付信息、生成一次性令牌(Payment Method 或 PaymentIntent Client Secret)、与后端协作完成支付流程。Stripe 提供了官方前端库 stripe-js 来实现这一目标。

前端:用 stripe-js 收集支付信息

不直接传卡号到你的服务器,而是通过 Stripe Elements 在页面上渲染安全的输入框,并由 Stripe 生成加密的 payment method ID。

  • 引入 Stripe.js:
  • 初始化 Stripe 对象(使用 publishable key,不是 secret key):const stripe = Stripe('pk_test_...');
  • 创建 Elements 实例并挂载信用卡表单:const elements = stripe.elements(); const cardElement = elements.create('card'); cardElement.mount('#card-element');
  • 提交时调用 stripe.createPaymentMethod() 获取 payment_method.id,然后发给你的后端

后端:用 Stripe SDK 创建支付

接收前端传来的 payment_method ID,结合订单金额、货币等,在服务端调用 Stripe API 创建支付。推荐使用 Payment Intents API(支持 SCA 强验证)。

  • 用 secret key 初始化 Stripe SDK(Node.js 示例):const stripe = require('stripe')('sk_test_...');
  • 创建 PaymentIntent:await stripe.paymentIntents.create({ amount: 2000, currency: 'usd', payment_method: req.body.payment_method_id, confirm: true });
  • 返回结果给前端,用于展示成功/失败状态

处理 3D Secure 等异步验证

部分卡需要跳转或弹窗验证(SCA),前端需监听并处理 requires_action 状态。

  • 后端创建 PaymentIntent 时若返回 status: 'requires_action',把 client_secret 返回给前端
  • 前端调用 stripe.confirmCardPayment(clientSecret) 触发验证流程
  • 验证完成后,PaymentIntent 自动进入 succeededrequires_payment_method 状态

安全与合规要点

绕过这些会引发安全风险或被 Stripe 拒绝。

  • 永远不在前端暴露 secret key —— 只用 publishable key 初始化 stripe-js
  • 所有关键操作(创建 intent、确认支付、退款)必须在后端完成
  • 前端提交前校验金额、商品一致性(防篡改),但最终以服务端为准
  • Webhook 必须配置,用于可靠接收支付结果(如 payment_intent.succeeded),不要只依赖前端回调