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
相关产品推荐
相关产品推荐

