PAYATHON 2026

如何为实体商品配置 Facebook Payment API?

支付小周

结论

不支持。Facebook Payment API 主要用于 Facebook 平台内的数字内容、虚拟货币和虚拟商品,不能直接用作实体商品商店的收款接口。

如果销售服装、食品、电子产品等实体商品,需要接入第三方支付服务,或自行搭建支付后端。Facebook 可以用于展示商品、投放广告、账号登录和跳转结账,但付款、订单处理和退款通常由商户系统与支付服务商完成。

推荐的集成方式

实体商品商店通常可以按以下流程接入支付:

  1. 用户从 Facebook 页面、广告或应用进入商品页面。
  2. 商户服务器创建订单,并保存商品、数量、金额和收货信息。
  3. 后端调用支付服务商的 API,创建支付会话。
  4. 前端跳转到托管收银台,或加载支付服务商提供的支付组件。
  5. 支付服务商通过 Webhook 通知支付结果。
  6. 服务器验证签名并更新订单状态。
  7. 支付成功后,再处理库存扣减、发货和售后。

如需使用 Facebook 账号体系,可以单独接入 Facebook Login。登录和支付是两个独立模块,应分别处理。

示例:由后端创建支付会话

下面是一个通用的 Node.js 示例。实际使用时,接口路径、字段和签名方式应以所选支付服务商的官方文档为准。

import express from "express";

const app = express();
app.use(express.json());

app.post("/api/checkout", async (req, res) => {
  const { productId, quantity } = req.body;

  // 商品价格必须从数据库读取,不能信任前端传入的金额
  const product = await findProductById(productId);

  if (!product || quantity < 1) {
    return res.status(400).json({ error: "Invalid product" });
  }

  const order = await createOrder({
    productId,
    quantity,
    amount: product.price * quantity,
    currency: "USD",
    status: "pending"
  });

  const response = await fetch("https://payment-provider.example/v1/checkout-sessions", {
    method: "POST",
    headers: {
      "Authorization": `Bearer ${process.env.PAYMENT_API_KEY}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      amount: order.amount,
      currency: order.currency,
      reference: order.id,
      success_url: "https://shop.example/payment/success",
      cancel_url: "https://shop.example/cart"
    })
  });

  if (!response.ok) {
    return res.status(502).json({ error: "Unable to create payment session" });
  }

  const session = await response.json();
  res.json({ checkoutUrl: session.checkout_url });
});

前端只需请求结账地址,然后跳转:

async function checkout(productId, quantity) {
  const response = await fetch("/api/checkout", {
    method: "POST",
    headers: {
      "Content-Type": "application/json"
    },
    body: JSON.stringify({ productId, quantity })
  });

  const result = await response.json();

  if (!response.ok) {
    throw new Error(result.error || "Checkout failed");
  }

  window.location.href = result.checkoutUrl;
}

使用 Webhook 确认支付

用户返回”支付成功”页面,并不能证明订单已经付款。服务器应通过 Webhook 接收支付结果,并验证签名:

app.post(
  "/api/payment/webhook",
  express.raw({ type: "application/json" }),
  async (req, res) => {
    const signature = req.headers["payment-signature"];

    const event = verifyWebhookSignature(
      req.body,
      signature,
      process.env.PAYMENT_WEBHOOK_SECRET
    );

    if (!event) {
      return res.status(400).send("Invalid signature");
    }

    if (event.type === "payment.succeeded") {
      await markOrderAsPaid(event.data.reference);
    }

    res.sendStatus(200);
  }
);

这里的 verifyWebhookSignature、事件名称和请求字段仅用于展示代码结构。接入时必须替换为支付服务商实际提供的 SDK 和协议。

注意事项

  • 不要在浏览器代码或 Facebook 页面脚本中写入支付 API 密钥。
  • 商品价格、折扣、运费和税费必须由服务器重新计算。
  • Webhook 处理需要具备幂等性,避免重复通知导致重复扣减库存或重复发货。
  • 支付成功后不要立即发货,还需检查库存、风控和订单状态。
  • 商店需要提供隐私政策、退款规则、配送说明和客服联系方式。
  • 能否使用某种支付服务,取决于商户所在地、用户所在地、商品类型和服务商的准入政策。
  • Facebook 或 Meta 的产品名称、商务功能和开放范围可能发生调整。准备上线时,应重新核对 Meta 与支付服务商的最新官方文档。

实体商品不应套用 Facebook 的虚拟商品支付教程。更合适的架构是由 Facebook 负责获客、商品展示或登录,商户系统负责订单,合规的第三方支付服务负责收款。

备注:内容仅供参考。