跳到主要内容

快速开始

最小化的支付集成:通过 API 创建收款单并处理付款通知。最后一节介绍发货流程。示例自成一体,不依赖任何 SDK。

提示

正在使用 AI 智能体?把本页的 markdown 版本交给它。其中的信息足以为站点或店铺构建完整的集成。

准备工作

内容获取位置
API 密钥集成 (Integrations)
项目 ID项目 (Projects)
Webhook 密钥项目设置

在同一项目设置中填写 Webhook URL——服务器上通知处理程序的地址。仅支持 HTTPS,不跟随重定向。

示例中使用的是测试值——请替换为自己的实际值。

创建收款单

POST https://api.bitsby.app/invoices/create,API 密钥通过 Authorization 头传递。

参数是否必填说明
projectId项目 ID,UUID 格式
amountFiat收款单金额
currencyFiat币种:USD、EUR、RUB
timeToPay支付期限,单位为小时:0.5、1、3、6、12
description描述,在支付页面向买家展示
serviceData服务数据,不向买家展示。建议传入订单号:它会在付款通知中原样返回
curl -X POST https://api.bitsby.app/invoices/create \
-H "Authorization: Token MSvL2ltaDZdWVjmZURURMVWhqSJLT2NURjhL2Fla1Z1T1IxQTltKs1T3Ay" \
-F "projectId=9deea1e2-0c08-41a3-bdc2-a34eada3892d" \
-F "amountFiat=49.90" \
-F "currencyFiat=USD" \
-F "timeToPay=1" \
-F "description=Order 4172" \
-F "serviceData=order-4172"

响应:

{
"result": "success",
"data": {
"id": "ade9550d-3dc7-4fd3-b94e-3b4c12aaaa0c",
"uid": "MXNj4m8HhcM4",
"createDatetime": "2026-09-14 10:12:03",
"timeToPayDatetime": "2026-09-14 11:12:03",
"commissionFiatUSD": 0.5,
"amountFiatUSD": 49.9,
"url": "https://dash.bitsby.app/invoices/pay/MXNj4m8HhcM4"
}
}

data.id 与订单一起保存,并把买家引导至 data.url——支付页面。链接的发送方式不限:跳转、邮件或机器人消息均可。收款单在 timeToPayDatetime (UTC) 之前有效。

处理通知

收款单转为已支付 (Paid) 状态时,服务会向项目的 Webhook URL 发送 POST 请求。请求体为 JSON,签名位于请求头中:

请求头
X-Timestamp发送时间,以秒为单位的 unix 时间
X-Signaturesha256= + 字符串 <timestamp>.<request body> 的 HMAC-SHA256 十六进制值

签名密钥为 Webhook 密钥。签名基于原始请求体计算,因此要先验证签名,再解析 JSON。

<?php
$secret = 'k7QwR2mZ9tXbN4vL8sJpH3dF6yA1cE0u';

$body = file_get_contents('php://input');
$timestamp = $_SERVER['HTTP_X_TIMESTAMP'] ?? '';
$signature = $_SERVER['HTTP_X_SIGNATURE'] ?? '';

// Reject replayed requests: allow up to 5 minutes of clock drift
if (abs(time() - (int)$timestamp) > 300) {
http_response_code(400);
exit;
}

$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$body, $secret);

if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}

$invoice = json_decode($body, true)['invoice'];

if ($invoice['status'] === 'paid') {
// $invoice['serviceData'] — the order id passed at creation: 'order-4172'
// $invoice['amountFiat'] — the original invoice amount: 49.9
// Issue the order here, see the next section
}

http_response_code(200);

在 10 秒内返回 2xx 状态码。其他状态码、重定向或超时都视为投递失败:服务会以从 5 分钟到 24 小时逐步递增的间隔重试,之后停止。耗时的处理放入队列:先返回 200,再处理订单。

完整的通知格式和字段说明见 Webhook URL 章节。

发货

通过签名验证、状态为 paid 的通知即确认付款成功。发货步骤:

  1. 查找订单:依据 invoice.serviceData——创建收款单时传入的值 (order-4172)。
  2. invoice.id 检查该收款单是否已发货。同一 invoice.id 的通知可能多次送达——订单只发货一次,并保存已处理标记。
  3. 核对金额和币种:以 invoice.amountFiatinvoice.currencyFiat 为准——它们是收款单创建时的原始值,永不改变。amountFiatUSD 会被实际收到的金额覆盖。金额要按数字而不是字符串比较:末尾的零会被去掉,49.90 送达时是 49.9。如果这些值与订单不符,将收款单转入人工核查,而不是发货——此类情况见付款关联与金额不一致
  4. 发货并将订单标记为已处理。

发货时不要检查支付期限:付款可能在 timeToPayDatetime 之后才在链上确认,商户也可以手动将付款关联到收款单。通知本身即是付款的确认。

接下来