如何在Firebase上实现回调端点以接收第三方API支付通知
Firebase实现第三方支付回调端点方案
在Firebase生态中,你可以通过Cloud Functions for Firebase的HTTP触发器来实现公网可访问的回调端点,完整实现步骤如下:
前置准备
- 确认你的Firebase项目已升级到Blaze付费计划,Cloud Functions接收公网请求、访问第三方服务需使用付费计划
- 本地已安装Firebase CLI,且完成账号登录、项目关联操作
- 已在本地完成Cloud Functions项目初始化
步骤1:编写HTTP触发的回调云函数
你可以参考以下示例代码编写回调逻辑,包含请求校验、数据解析、实时数据库更新三个核心环节:
const functions = require("firebase-functions"); const admin = require("firebase-admin"); // 初始化Firebase Admin SDK admin.initializeApp(); // 初始化实时数据库实例 const realtimeDB = admin.database(); // 支付回调专用云函数 exports.paymentNotifyCallback = functions.https.onRequest(async (req, res) => { // 拦截非POST请求,直接返回405错误 if (req.method !== "POST") { return res.status(405).send("Method Not Allowed"); } try { // 1. 签名校验:替换为第三方支付API要求的验签逻辑,防止伪造请求 // 通常需要从请求头获取平台签名,和本地计算的签名做比对 const thirdPartySign = req.headers["x-pay-platform-sign"]; // 示例验签逻辑,需替换为实际规则 // const isValid = verifySign(thirdPartySign, req.body); // if (!isValid) return res.status(403).send("Invalid Sign"); // 2. 解析回调数据,字段名需和第三方返回的字段对应 const notifyData = req.body; const orderId = notifyData.out_trade_no; // 商户侧订单号字段 const payStatus = notifyData.trade_status; // 支付状态字段 // 3. 更新实时数据库对应订单数据 await realtimeDB.ref(`/user_orders/${orderId}`).update({ pay_status: payStatus, pay_success_time: admin.database.ServerValue.TIMESTAMP, raw_notify_data: notifyData // 可选:存储原始回调数据便于排查问题 }); // 按第三方要求返回成功响应,避免重复回调 return res.status(200).send("SUCCESS"); } catch (err) { functions.logger.error("支付回调处理失败", err); return res.status(500).send("PROCESS ERROR"); } });
步骤2:部署云函数获取回调地址
在本地Functions项目目录下执行部署命令:firebase deploy --only functions:paymentNotifyCallback
部署完成后,终端会输出云函数的公网访问地址,格式为https://<部署区域>-<你的Firebase项目ID>.cloudfunctions.net/paymentNotifyCallback,该地址即为你需要传给第三方API的callbackUrl参数值。
注意事项
- 必须严格完成请求签名校验,不要直接信任所有发送到回调地址的请求,避免伪造支付通知导致业务损失
- 必须按照第三方API的要求返回指定格式的成功响应,否则第三方会重复推送支付通知
- 回调处理逻辑需要做幂等性判断,避免同一订单的多次回调触发重复业务操作
- 如果回调处理逻辑耗时较长,建议先存储回调数据后立即返回响应,后续通过云数据库触发器异步处理后续业务,避免触发云函数超时限制
内容的提问来源于stack exchange,提问作者Philip Mintah
相关产品推荐
相关产品推荐

