如何为实体商品配置 Facebook Payment API?
结论
不支持。Facebook Payment API 主要用于 Facebook 平台内的数字内容、虚拟货币和虚拟商品,不能直接用作实体商品商店的收款接口。
如果销售服装、食品、电子产品等实体商品,需要接入第三方支付服务,或自行搭建支付后端。Facebook 可以用于展示商品、投放广告、账号登录和跳转结账,但付款、订单处理和退款通常由商户系统与支付服务商完成。
推荐的集成方式
实体商品商店通常可以按以下流程接入支付:
- 用户从 Facebook 页面、广告或应用进入商品页面。
- 商户服务器创建订单,并保存商品、数量、金额和收货信息。
- 后端调用支付服务商的 API,创建支付会话。
- 前端跳转到托管收银台,或加载支付服务商提供的支付组件。
- 支付服务商通过 Webhook 通知支付结果。
- 服务器验证签名并更新订单状态。
- 支付成功后,再处理库存扣减、发货和售后。
如需使用 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 负责获客、商品展示或登录,商户系统负责订单,合规的第三方支付服务负责收款。
备注:内容仅供参考。