You need to enable JavaScript to run this app. Flutter中如何将Razorpay支付结账金额同步显示至Firebase?
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何将Razorpay支付结账金额同步显示至Firebase?

Razorpay支付数据同步至Firebase实现方案

核心实现逻辑

通过Razorpay的Webhook回调机制,在支付成功后由官方主动推送支付结果到服务端,校验合法性后更新Firebase内对应用户的会员状态,避免前端篡改数据风险,整体流程参考:
Razorpay支付同步流程

具体实现步骤

  • 配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 12:54:03