You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter应用中如何获取Cloud Functions回调URL实现支付状态通知

用Cloud Functions给Flutter应用搭支付回调URL的入门指南

先搞定准备工作

  • 要有Google Cloud账号,开启Cloud Functions服务
  • 本地装Firebase CLI(Flutter和Firebase搭配用最顺手),命令行执行npm install -g firebase-tools
  • 初始化Firebase项目:先firebase login登录账号,再firebase init functions,选择关联的项目,语言选Node.js即可(Cloud Functions本身用JS/TS写,和Flutter的交互靠数据库或推送,不冲突)

编写回调核心逻辑

打开functions/index.js,修改以下代码适配你的支付平台:

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp();

exports.paymentCallback = functions.https.onRequest((req, res) => {
  // 必须先验证请求合法性,防止伪造请求
  const isValid = checkPaymentSignature(req.headers, req.body);
  if (!isValid) {
    return res.status(403).send("无效签名");
  }

  // 从支付API的请求体中提取关键数据
  const transactionStatus = req.body.status;
  const transactionId = req.body.transactionId;
  const userId = req.body.userId; // 让支付API传递该字段,用于关联用户

  // 将交易状态存入Firestore,方便Flutter端实时获取
  return admin.firestore()
    .collection("transactions")
    .doc(transactionId)
    .set({
      status: transactionStatus,
      userId: userId,
      updatedAt: admin.firestore.FieldValue.serverTimestamp()
    })
    .then(() => {
      // 给支付API返回成功响应,避免对方重复发送回调
      res.status(200).send("回调已接收");
    })
    .catch((err) => {
      functions.logger.error("处理回调出错:", err);
      res.status(500).send("服务器内部错误");
    });
});

// 替换为你所用支付平台的签名验证逻辑
function checkPaymentSignature(headers, body) {
  const receivedSign = headers["x-payment-signature"];
  // 用支付平台提供的密钥生成预期签名,与收到的签名对比
  const crypto = require("crypto");
  const expectedSign = crypto.createHmac("sha256", "你的支付API密钥")
    .update(JSON.stringify(body))
    .digest("hex");
  return receivedSign === expectedSign;
}

说明:这个函数是HTTP触发器,支付API完成交易后会向该URL发送POST请求。我们先验证请求合法性,再将交易状态存入Firebase,这样Flutter无需暴露公网就能获取数据。

部署Cloud Function

命令行执行firebase deploy --only functions,部署完成后会得到一个类似https://us-central1-你的项目ID.cloudfunctions.net/paymentCallback的URL,将此URL提供给支付API作为回调地址。

Flutter端接收交易状态通知

移动端无法直接被外部API调用,可通过以下两种方式获取通知:

方式1:监听Firestore实时更新(最稳妥)

直接使用以下代码监听指定交易的状态变化:

import 'package:cloud_firestore/cloud_firestore.dart';

void watchTransaction(String transactionId) {
  FirebaseFirestore.instance
      .collection('transactions')
      .doc(transactionId)
      .snapshots()
      .listen((snapshot) {
    if (snapshot.exists) {
      final status = snapshot.data()?['status'];
      if (status == 'success') {
        // 跳转支付成功页面或更新订单状态
      } else if (status == 'failed') {
        // 提示用户支付失败,引导重试
      }
    }
  });
}

方式2:用FCM主动推送(可选)

若需主动通知用户,可在Cloud Function中添加推送逻辑:
在paymentCallback函数内加入以下代码:

// 给用户发送FCM推送,需提前存储用户的FCM令牌
admin.messaging().sendToDevice(
  "用户的FCM令牌", // Flutter端可通过Firebase Messaging获取
  {
    notification: {
      title: "交易状态更新",
      body: transactionStatus === "success" ? "支付成功啦!" : "支付失败,请重试"
    },
    data: {
      transactionId: transactionId,
      status: transactionStatus
    }
  }
);

Flutter端处理推送:

import 'package:firebase_messaging/firebase_messaging.dart';

void setupFCMNotifications() {
  FirebaseMessaging.onMessage.listen((RemoteMessage message) {
    // 前台收到消息时弹出本地通知
    // 处理数据中的交易状态
    final status = message.data['status'];
    final transactionId = message.data['transactionId'];
    // 更新UI或跳转页面
  });
}

测试回调

用Postman模拟支付API发送POST请求,地址填部署好的回调URL,请求体携带status、transactionId等字段,检查Firestore是否新增数据,Flutter监听是否能获取到更新。

内容的提问来源于stack exchange,提问作者andrew mukelabai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 07:20:31