Flutter中如何将Razorpay支付结账金额同步显示至Firebase?
Razorpay支付数据同步至Firebase实现方案
核心实现逻辑
通过Razorpay的Webhook回调机制,在支付成功后由官方主动推送支付结果到服务端,校验合法性后更新Firebase内对应用户的会员状态,避免前端篡改数据风险,整体流程参考:
具体实现步骤
- 配置Razorpay Webhook
登录Razorpay网页后台,进入「设置」-「Webhook」页面,新增回调地址,触发事件选择payment.captured(支付成功捕获事件),同时设置自定义签名密钥用于后续回调合法性校验。 - 部署Firebase Cloud Functions作为回调处理服务
无需额外采购服务器,直接使用Firebase云函数处理回调请求,示例代码如下:const functions = require('firebase-functions'); const admin = require('firebase-admin'); const Razorpay = require('razorpay'); // 初始化Firebase管理员权限 admin.initializeApp(); const razorpayInstance = new Razorpay({ key_id: '你的Razorpay平台Key ID', key_secret: '你的Razorpay平台Key Secret' }); // 接收Razorpay回调的云函数 exports.razorpayPaymentCallback = functions.https.onRequest(async (req, res) => { const WEBHOOK_SECRET = '你之前在Razorpay后台设置的Webhook签名密钥'; const requestSignature = req.headers['x-razorpay-signature']; try { // 校验回调请求是否为Razorpay官方发送 Razorpay.validateWebhookSignature(JSON.stringify(req.body), requestSignature, WEBHOOK_SECRET); const paymentInfo = req.body.payload.payment.entity; // 支付发起时传入的用户Firebase UID存在notes字段中 const userUid = paymentInfo.notes.firebase_uid; // 更新Firebase数据库内用户的付费状态 await admin.firestore().collection('users').doc(userUid).update({ isPremiumMember: true, paymentTime: admin.firestore.FieldValue.serverTimestamp(), transactionId: paymentInfo.id, payAmount: (paymentInfo.amount / 100).toFixed(2) }); return res.status(200).send('OK'); } catch (err) { console.error('回调处理失败:', err); return res.status(400).send('INVALID REQUEST'); } }); - 前端支付请求携带用户UID
前端调用Razorpay支付弹窗时,在notes参数中传入当前登录用户的Firebase UID,示例代码如下:import { getAuth } from "firebase/auth"; const auth = getAuth(); const currentUid = auth.currentUser.uid; const paymentOptions = { key: "你的Razorpay Key ID", amount: 9900, // 金额单位为分,对应99元 currency: "INR", name: "你的在线教育平台名称", description: "高级会员年度订阅", notes: { firebase_uid: currentUid // 传递当前用户UID给Razorpay,后续回调会带回该参数 }, handler: function (response) { // 前端仅做成功提示,不要在这里修改Firebase状态,所有状态以Webhook回调为准 alert("支付提交成功,会员权限将在1-2分钟内开通"); } }; const rzp = new Razorpay(paymentOptions); rzp.open(); - 前端识别用户付费状态
用户完成Firebase身份验证后,直接读取对应用户文档的isPremiumMember字段即可判断会员身份:import { getFirestore, doc, getDoc } from "firebase/firestore"; const db = getFirestore(); const userDocRef = doc(db, "users", auth.currentUser.uid); const userDoc = await getDoc(userDocRef); const isPaidMember = userDoc.exists() ? userDoc.data().isPremiumMember : false;
注意事项
- 所有会员状态的更新必须走服务端Webhook回调,禁止前端直接修改用户付费状态,避免被恶意篡改
- 必须开启Razorpay Webhook签名校验,防止恶意伪造支付成功请求
- 若遇到Webhook回调延迟,可在前端支付成功后每隔3秒轮询一次用户状态,更新UI展示
内容的提问来源于stack exchange,提问作者Sruthi Maria Thomson
相关产品推荐
相关产品推荐

