Flutter电商应用集成Razorpay/Stripe支付网关后端实现咨询
Flutter电商集成Razorpay/Stripe支付网关后端实现指南
一、核心逻辑说明
不管是Razorpay还是Stripe,前端(Flutter)都不能直接生成支付令牌/订单ID,必须通过后端调用官方API生成——这是为了避免密钥泄露、保障支付安全。后端核心流程:
- 接收Flutter端传来的订单金额、商品信息、用户ID等数据
- 调用支付服务商的API创建订单/生成令牌
- 将生成的订单ID/令牌返回给Flutter端,前端用该值发起支付
- 支付完成后,接收服务商的异步回调,更新订单状态并处理后续业务(比如库存扣减)
二、Razorpay后端实现示例(Node.js)
1. 依赖安装
npm install razorpay express cors
2. 核心代码
const express = require('express'); const Razorpay = require('razorpay'); const cors = require('cors'); const app = express(); app.use(cors()); app.use(express.json()); // 初始化Razorpay实例(替换为你的密钥) const razorpay = new Razorpay({ key_id: 'YOUR_RAZORPAY_KEY_ID', key_secret: 'YOUR_RAZORPAY_KEY_SECRET' }); // 创建订单接口 app.post('/create-razorpay-order', async (req, res) => { try { const { amount, currency = 'INR', receipt, notes } = req.body; // Razorpay要求金额以最小单位(如派萨)传入,所以乘以100 const order = await razorpay.orders.create({ amount: amount * 100, currency, receipt, notes }); res.json({ success: true, orderId: order.id }); } catch (error) { res.status(500).json({ success: false, message: error.message }); } }); // 支付回调验证接口 app.post('/verify-razorpay-payment', async (req, res) => { const { razorpay_order_id, razorpay_payment_id, razorpay_signature } = req.body; const crypto = require('crypto'); const hmac = crypto.createHmac('sha256', 'YOUR_RAZORPAY_KEY_SECRET'); hmac.update(`${razorpay_order_id}|${razorpay_payment_id}`); const generatedSignature = hmac.digest('hex'); if (generatedSignature === razorpay_signature) { // 验证成功,更新订单状态为已支付 res.json({ success: true, message: '支付验证成功' }); } else { res.status(400).json({ success: false, message: '支付验证失败' }); } }); app.listen(3000, () => console.log('后端服务运行在3000端口'));
三、Stripe后端实现示例(Node.js)
1. 依赖安装
npm install stripe express cors
2. 核心代码
const express = require('express'); const Stripe = require('stripe'); const cors = require('cors'); const app = express(); app.use(cors()); app.use(express.json()); // 初始化Stripe实例(替换为你的密钥) const stripe = new Stripe('YOUR_STRIPE_SECRET_KEY'); // 创建支付意图(生成令牌)接口 app.post('/create-stripe-payment-intent', async (req, res) => { try { const { amount, currency = 'usd', metadata } = req.body; // Stripe要求金额以最小单位(如美分)传入,所以乘以100 const paymentIntent = await stripe.paymentIntents.create({ amount: amount * 100, currency, metadata // 可传入订单ID、用户信息等自定义数据 }); res.json({ success: true, clientSecret: paymentIntent.client_secret }); } catch (error) { res.status(500).json({ success: false, message: error.message }); } }); // Stripe webhook回调处理(验证支付状态) app.post('/stripe-webhook', express.raw({type: 'application/json'}), async (req, res) => { const sig = req.headers['stripe-signature']; const webhookSecret = 'YOUR_STRIPE_WEBHOOK_SECRET'; let event; try { event = stripe.webhooks.constructEvent(req.body, sig, webhookSecret); } catch (err) { return res.status(400).send(`Webhook Error: ${err.message}`); } // 根据事件类型处理业务 if (event.type === 'payment_intent.succeeded') { const paymentIntent = event.data.object; // 更新订单状态为已支付,处理库存、发货通知等 console.log('支付成功:', paymentIntent.id); } res.json({ received: true }); }); app.listen(3000, () => console.log('后端服务运行在3000端口'));
四、后端部署方式
- 云平台快速部署:用Heroku、Vercel、AWS Elastic Beanstalk等平台,关联GitHub仓库即可自动部署,无需手动配置环境
- 服务器自建部署:购买阿里云、腾讯云等云服务器,安装Node.js环境后上传代码,用PM2工具守护进程运行
- 容器化部署:将代码打包成Docker镜像,部署到Docker容器或Kubernetes集群,适合规模化应用
五、购物车订单处理补充逻辑
- 前端提交支付请求前,先调用自己的后端接口创建本地订单(存储购物车商品、金额、用户信息),生成本地订单ID
- 后端调用支付服务商API时,将本地订单ID作为
receipt(Razorpay)或metadata(Stripe)传入,便于后续关联 - 支付回调验证成功后,根据本地订单ID更新订单状态为已支付,同时执行库存扣减、用户积分发放等业务
你已查阅文档的中文翻译
1. pub.dev上的razorpay_flutter包文档
该文档主要介绍Flutter端的SDK集成步骤:包括依赖安装、初始化Razorpay实例、添加支付按钮、处理支付回调等,未涉及后端逻辑。
2. Razorpay官方Flutter标准集成文档的「1.6 在服务器创建订单」部分
在服务器端创建订单是强制要求的,直接在客户端生成订单会导致密钥泄露风险。你需要调用Razorpay的订单创建API,传入订单金额、货币类型、订单收据号等参数。API响应会返回订单ID,将这个ID传给Flutter客户端,客户端用它来发起支付请求。
内容的提问来源于stack exchange,提问作者X1000
相关产品推荐
相关产品推荐

