PAYATHON 2026

如何为 BigCommerce 添加新的支付方式?

支付老李

结论

BigCommerce 的公开 API 通常不能直接“注册”新的支付网关。Get Payment Methods 等接口只能读取当前店铺已配置且受平台支持的支付方式,无法通过 API 添加新的支付服务商。

如果只想让顾客选择“银行转账、货到付款”等线下付款方式,可以在 BigCommerce 后台配置 Offline Payment Methods。接入新的在线支付服务商通常有两种办法:

  1. 由支付服务商申请成为 BigCommerce 支付合作伙伴,并按平台要求完成正式集成。
  2. 开发自定义结账流程,在 BigCommerce 之外收款,再通过验证后的支付回调同步订单。

第二种办法不会把新网关加入 BigCommerce 的原生支付列表。支付安全、订单状态、退款和对账也都需要自行处理。

为什么 API 中没有新增接口

支付网关涉及卡片敏感数据、PCI DSS、风控、退款、撤销、争议处理和订单状态一致性,BigCommerce 因此不会允许普通店铺应用随意注册网关。

例如,下面的接口只能查询当前店铺可以使用的支付方式:

curl --request GET \
  "https://api.bigcommerce.com/stores/{store_hash}/v3/payments/methods" \
  --header "X-Auth-Token: {access_token}" \
  --header "Accept: application/json"

通过自定义代码在结账页上增加一个支付选项,也不会让 BigCommerce 自动具备处理这种支付方式的能力。授权、扣款、退款和状态同步仍需由完整的后端集成负责。

可行方案

方案一:配置线下支付方式

如果结账时不需要实时扣款,可以先检查后台提供的选项是否符合需求:

  1. 进入 BigCommerce 管理后台。
  2. 打开支付设置页面。
  3. 找到 Offline Payment Methods。
  4. 启用银行转账、货到付款或类似选项。
  5. 填写付款说明,测试下单和订单状态流程。

这是最简单的方式。不过,订单通常不会自动变为已付款,需要人工确认,或由独立系统完成后续同步。

方案二:申请正式支付集成

如果需要让某个在线支付服务商出现在 BigCommerce 原生结账页中,应通过 BigCommerce 的支付合作伙伴或技术合作渠道提出申请。

申请前可准备以下资料:

  • 支付服务商和业务主体资料;
  • 支持的国家、地区和币种;
  • 授权、扣款、撤销、退款等 API;
  • Webhook 签名及重试机制;
  • PCI DSS 合规范围;
  • 争议处理和对账方案;
  • 测试环境及测试账户。

普通 Partner 注册与支付网关准入不一定属于同一套流程。注册合作伙伴账号,并不表示已经取得支付集成权限。具体准入条件可能随着 BigCommerce 的合作政策变化,应以其当前官方渠道的回复为准。

方案三:开发自定义结账与外部支付流程

如果暂时无法取得正式集成资格,可以搭建独立的支付流程:

  1. 从 BigCommerce 获取购物车或结账信息。
  2. 在自己的后端创建支付订单。
  3. 把用户重定向到支付服务商的托管页面。
  4. 接收支付服务商发送的服务器端 Webhook。
  5. 验证签名、金额、币种和商户订单号。
  6. 确认支付成功后,同步 BigCommerce 订单状态。
  7. 保存支付流水号,供退款和对账使用。

下面是示意代码。接口名称和字段需要替换为实际支付服务商提供的定义:

app.post('/payment/webhook', async (req, res) => {
  const signature = req.headers['x-payment-signature'];

  if (!verifyWebhookSignature(req.rawBody, signature)) {
    return res.status(401).send('Invalid signature');
  }

  const event = req.body;

  if (event.type !== 'payment.succeeded') {
    return res.status(200).send('Ignored');
  }

  const payment = await findLocalPayment(event.data.payment_id);

  if (!payment) {
    return res.status(404).send('Payment not found');
  }

  if (
    payment.amount !== event.data.amount ||
    payment.currency !== event.data.currency
  ) {
    return res.status(400).send('Payment mismatch');
  }

  if (!payment.processed) {
    await updateBigCommerceOrder(payment.bigcommerce_order_id, {
      status_id: PAID_ORDER_STATUS_ID
    });

    await markLocalPaymentProcessed(payment.id);
  }

  return res.status(200).send('OK');
});

PAID_ORDER_STATUS_ID 只是占位符,不能直接使用。应先确认店铺实际采用的订单状态及其业务含义。不同支付方式也可能对应“待确认”“已授权”或“已付款”等不同状态。

重要注意事项

  • 浏览器跳转到“支付成功”页面,不能作为把订单标记为已付款的依据。必须以经过签名验证的服务器端通知或主动查询结果为准。
  • Webhook 必须支持幂等处理,因为支付服务商可能重复发送同一个事件。
  • 必须核对金额、币种、订单号和商户账号,不能只检查 payment.succeeded。
  • 不要把 BigCommerce Access Token 或支付密钥放进前端 JavaScript。
  • 创建订单和完成扣款之间可能发生中断,因此需要设计未支付订单的关闭和清理流程。
  • 使用外部支付后,原生退款、部分退款、欺诈检测、订单通知和财务报表可能无法自动运行。
  • 如果需要处理银行卡数据,应优先采用支付服务商的托管收银台或令牌化组件,避免服务器直接接触卡号。
  • 通过 Orders API 写入支付方式名称或更新订单状态,不表示 BigCommerce 已经处理或确认这笔资金。

如果只需要提供由人工确认的付款选项,可优先使用后台的线下支付配置。如果需要完整的在线支付体验,申请正式的支付合作集成更稳妥。自定义结账也可以作为替代方案,但本质上是一套独立的支付系统,其安全性和订单一致性都需要自行保证。

备注:内容仅供参考。