PAYATHON 2026

未获 beta program 资格能否测试 tokenized payments?

支付小周

结论

不能。尚未获得 Messenger Payments beta program 资格的 chatbot,只能在测试环境中使用 Buy Button payment flow,不能通过 Webview 发起 tokenized payments。

文档中的这句话:

If you have not been accepted to beta program yet, the test payment feature currently only works for tokenized payments.

与该功能的准入规则和本节上下文不符,应当是文档表述有误。原意应该是:未加入 beta program 时,测试支付仅适用于非 tokenized 的 Buy Button 流程。

因此,Buy Button 支付可以完成并触发 payment webhook,而 Webview 中的 tokenized payment 显示 Request Not Completed,且没有 webhook callback。这可能只是缺少 beta 权限造成的结果,不一定是 webhook 配置有问题。

原因

两种支付流程要求的权限不同:

  • Buy Button integration:可以在受支持的测试模式下完成支付,并向 webhook 发送 payment 事件。
  • Tokenized payments via Webview:应用或 Page 必须获得相应的 beta program 权限。平台会在前端发起请求时检查资格。如果资格检查失败,支付流程不会真正创建,自然也不会产生 webhook callback。

这就是为什么同一套 webhook 可以收到 Buy Button 的回调,却收不到 tokenized payment 的回调。问题出在支付请求进入 webhook 处理链路之前。

处理步骤

先确认 Buy Button 流程是否仍能触发回调。如果可以,通常说明 webhook URL、事件订阅和基本签名验证都没有问题。

然后检查应用后台是否明确显示已经获得 Messenger Payments beta 或相应的 tokenized payment 能力。仅仅开启测试模式、将用户加入应用角色,或者成功收到 Buy Button 回调,都不代表已经取得 tokenized payments 权限。

在获得资格之前,可以:

  1. 继续使用 Buy Button 流程验证订单创建、支付回调和履约逻辑。
  2. 将支付处理抽象为统一入口,避免业务逻辑依赖某一种前端支付方式。
  3. 申请所需的 beta 或支付产品权限。
  4. 获得权限后,使用具备测试资格的 Page、应用和测试账号验证 Webview tokenized payment。

Webhook 处理示例

无论支付通过哪种获准的流程触发,服务端都应验证回调结构,并保证订单处理具有幂等性:

app.post('/webhook', express.json(), async (req, res) => {
  const entries = req.body.entry || [];

  for (const entry of entries) {
    for (const event of entry.messaging || []) {
      if (!event.payment) {
        continue;
      }

      const paymentId = event.payment.payment_id;

      // 应使用数据库唯一约束或幂等键防止重复处理
      const processed = await hasProcessedPayment(paymentId);
      if (processed) {
        continue;
      }

      await savePayment({
        paymentId,
        senderId: event.sender?.id,
        recipientId: event.recipient?.id,
        payload: event.payment
      });

      await fulfillOrder(paymentId);
    }
  }

  res.sendStatus(200);
});

这段代码只能处理平台已经成功投递的事件,无法绕过 tokenized payment 的资格限制。如果平台在客户端阶段拒绝了支付请求,webhook 端不会收到事件。

注意事项

不要只根据弹窗中的 “temporary problem” 判断这是临时网络故障。权限不足、产品尚未开放或测试主体不符合要求时,也可能出现这种通用错误。

Messenger Platform 的支付能力、准入方式和产品状态可能会随时间调整。以上结论适用于问题中所述的 beta program 和旧版 Messenger Payments 流程。维护现有系统时,应以应用后台当前显示的产品权限及对应时期的官方文档为准。如果相关产品已经停止开放,新应用可能无法再通过申请启用这项能力。

备注:内容仅供参考。