不用买按钮也能用
买按钮是一个便利层。在底层,Coin Moebius 是一个租来的 webhook 加上几个 JSON 端点。如果你宁愿构建自己的界面、运行自己的结账流程,或把 Coin Moebius 接进按钮处理不了的东西(Square 或 Authorize.Net 订阅、一个自定义付款表单、一个服务端脚本、一个移动应用),按钮所用的每一个端点也都能从任何东西调用。我们这边无需改动任何代码。
为后端调用做认证
你从自己服务器发出的调用可以把你项目的 API 密钥作为 bearer token 携带。在后台里你项目的 API 密钥下创建一个密钥(它以 cmk_ 开头),并在 Authorization 头里发送它:
Authorization: Bearer cmk_live_xxxxxxxxxxxxxxxxxxxxxxxx该密钥绑定到一个项目,且经过认证的调用比匿名调用获得更高的速率限制。买按钮本身是公开的,无需密钥。把你的密钥留在你的服务器上。绝不要把它放进浏览器或其他客户端代码里。
这些端点全都活在你的项目 URL 下。生产环境里这个基址是 https://api.coinmoebius.com。每一个的完整 URL 都展示在下面(把 {…} 部分替换成你自己的值)。
| 端点 | 它做什么 |
|---|---|
POST https://api.coinmoebius.com/api/checkout/{provider}/{projectId} | 开始一次结账。POST { productId, metadata };拿回渠道所需的任何东西(Stripe 的重定向 URL、PayPal 的批准 URL、Authorize.Net Accept Hosted 的 token)。随你怎么渲染它。 |
POST https://api.coinmoebius.com/webhook/{provider}/{projectId} | 渠道往这里 POST。我们校验签名、规格化事件、存储它、计入配额。无论原始结账来自我们的按钮还是你自己的集成,都把渠道的 webhook 指向这个 URL。 |
GET https://api.coinmoebius.com/status/{projectId}/{txId} | 轮询一笔付款或订阅的当前状态。返回与买按钮拿到的相同的规格化结构。 |
POST https://api.coinmoebius.com/api/subscriptions/{projectId}/{subscriptionId}/portal-url | 生成一个渠道托管的门户 URL,供买家管理他们的订阅。适用于任何有门户的渠道。 |
通过在结账调用上传 metadata.customerRef 来在你自己的系统里识别买家。它会穿过渠道、在每个 webhook 事件上回传,于是你可以把 Coin Moebius 的记录与你自己的用户数据库连接起来,而我们不存储任何关于买家的东西。
有人为什么走这条路:一个静态站点搭建者想写自己的按钮以匹配站点设计,只需要 webhook 被处理好。一个开发者想完全跳过按钮、从自己的服务器调用 API。一个商家想运行 Square 或 Authorize.Net 订阅,并且不介意自己接好银行卡收集。按钮是一个起点。API 才是真正的产品。
监听买家事件
该元素会触发三个浏览器事件。用 addEventListener 在元素上监听(或在 document 上,事件会冒泡)。所有事件都可取消,调用 event.preventDefault() 会停止默认流程。
| 事件 | 何时触发 | 详情载荷 |
|---|---|---|
cm-load-providers | 选择器弹窗即将向 API 请求本项目所配置的渠道列表。 | 空。 |
cm-checkout-started | 买家选定了一个渠道,Coin Moebius 即将创建一个结账会话(Stripe / NOWPayments)或生成一个参考码(manual)。 | { provider: 'stripe' | 'nowpayments' | 'manual', ... } |
cm-error | 出了点问题:网络错误、签名失败、未配置渠道。 | { error: Error } |
document.addEventListener('cm-error', (event) => {
console.error('Coin Moebius:', event.detail.error);
// Show your own error UI, send to your analytics, etc.
});买家浏览器里没有 cm-success 事件。到付款真正完成时,买家已经被重定向到了支付渠道的托管结账页(Stripe Checkout、NOWPayments 发票页)。他们通过你配置的 success_url 返回你的站点(见下一节),而你的服务器通过后台、或通过轮询 /status 端点来获知这笔付款。
从你的后端轮询
为了有一个服务端的事实来源,从你的后端轮询 GET /status/:projectId/:txId。响应结构:
{
"status": "succeeded",
"amount": 29.99,
"currency": "USD",
"isTest": false,
"createdAt": "2026-05-14T01:04:21.000Z",
"updatedAt": "2026-05-14T01:04:21.000Z"
}状态值遵循与后台相同的枚举(见交易状态)。该端点无需认证,但按每 IP 每分钟 60 次请求限速。你传入的交易 id 是 SDK 在 cm-checkout-started 事件里返回的那个,或后台“参考”列里显示的那个。
一个典型的模式:当你的 success_url 页面加载时,启动一个后端任务,每 15 秒轮询一次 /status/:projectId/:txId,直到它看到 succeeded(或 failed / 超时),然后履约。