Skip to content

API 参考

完整的 PayIn 多链稳定币支付基础设施 REST API 参考。

Base URL

生产环境:

https://app.payin.com/api/v1

测试网络:

https://testnet.payin.com/api/v1

本地开发:

http://localhost:3000/api/v1

优先使用测试网络

我们强烈建议在投入生产之前先在测试网络上测试您的集成。测试网络使用没有实际价值的测试代币。

身份验证

所有 API 请求都需要在请求头中使用 API 密钥进行身份验证:

http
X-API-Key: your-api-key-here

生成 API 密钥

  1. 登录 PayIn 管理后台
  2. 导航至 设置 → API 密钥
  3. 点击 创建 API 密钥
  4. 给它一个描述性的名称
  5. 复制密钥(仅显示一次!)

API 密钥权限

角色创建订单创建充值查看数据管理设置
Owner
Admin✅(除所有权外)
Member
Viewer

API 密钥安全

  • 切勿将 API 密钥提交到版本控制系统
  • 定期轮换密钥
  • 为测试网络和生产环境使用不同的密钥
  • 参阅 安全指南 了解最佳实践

请求格式

请求头

所有请求都应包含:

http
Content-Type: application/json
X-API-Key: your-api-key-here

请求体

POST 和 PUT 请求使用 JSON 格式:

json
{
  "orderReference": "ORDER-2025-001",
  "amount": "100.00",
  "currency": "USDT",
  "chainId": "ethereum-sepolia"
}

响应格式

成功响应

json
{
  "orderId": "ord_abc123def456",
  "orderReference": "ORDER-2025-001",
  "amount": "100.00",
  "currency": "USDT",
  "chainId": "ethereum-sepolia",
  "address": "0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb0",
  "status": "pending",
  "createdAt": "2025-01-20T10:30:00Z",
  "expiresAt": "2025-01-20T10:40:00Z"
}

错误响应

json
{
  "error": "Invalid amount",
  "message": "Amount must be a positive number",
  "code": "INVALID_AMOUNT",
  "statusCode": 400
}

HTTP 状态码

状态码描述含义
200OK请求成功
201Created资源创建成功
400Bad Request无效的请求参数
401Unauthorized缺少或无效的 API 密钥
403ForbiddenAPI 密钥缺少所需权限
404Not Found资源不存在
409Conflict资源已存在(重复)
429Too Many Requests超过速率限制
500Internal Server Error服务器错误(联系支持)

速率限制

API 请求受速率限制以防止滥用:

默认限制:

  • 每分钟每个 API 密钥 100 次请求
  • 每小时每个 API 密钥 1000 次请求
  • 每天每个 API 密钥 10000 次请求

响应头:

http
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1642680000

当受到速率限制时,您将收到:

json
{
  "error": "Rate limit exceeded",
  "message": "Too many requests. Please try again in 60 seconds.",
  "code": "RATE_LIMIT_EXCEEDED",
  "statusCode": 429,
  "retryAfter": 60
}

企业计划

需要更高的限制?联系我们获取具有自定义速率限制的企业计划。

分页

列表端点支持分页:

查询参数:

GET /api/v1/orders?page=1&limit=20

响应:

json
{
  "data": [...],
  "pagination": {
    "page": 1,
    "limit": 20,
    "total": 157,
    "totalPages": 8,
    "hasMore": true
  }
}

分页参数:

参数类型默认值最大值描述
pageinteger1-页码(从 1 开始)
limitinteger20100每页项数

过滤和排序

许多列表端点支持过滤和排序:

过滤:

GET /api/v1/orders?status=pending&currency=USDT

排序:

GET /api/v1/orders?sortBy=createdAt&sortOrder=desc

常用过滤器:

端点支持的过滤器
Ordersstatus, currency, chainId, orderReference
Depositsstatus, currency, depositReference
Transfersstatus, currency, chainId, txHash

排序选项:

  • sortBy: 排序字段(createdAtamount 等)
  • sortOrder: ascdesc(默认:desc

幂等性

创建资源的 POST 请求支持幂等性密钥以防止重复创建:

http
Idempotency-Key: unique-key-123

行为:

  • 24 小时内使用相同的幂等性密钥返回原始响应
  • 使用相同密钥但不同的请求体返回 409 Conflict
  • 密钥在 24 小时后过期

示例:

bash
curl -X POST https://testnet.payin.com/api/v1/orders \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-api-key" \
  -H "Idempotency-Key: order-2025-001-retry-1" \
  -d '{
    "orderReference": "ORDER-2025-001",
    "amount": "100.00",
    "currency": "USDT",
    "chainId": "ethereum-sepolia"
  }'

Webhooks

PayIn 通过 webhooks 发送实时事件通知。详见 Webhooks 指南

事件类型:

  • order.completed - 订单支付已接收并确认
  • order.expired - 订单已过期且未支付
  • deposit.pending - 检测到充值,等待确认
  • deposit.confirmed - 充值已确认

Webhook 配置:

bash
POST /api/v1/webhooks/endpoints
{
  "url": "https://your-api.com/webhooks/payin",
  "events": ["order.completed", "deposit.confirmed"],
  "secret": "webhook_secret_key"
}

API 端点

📦 订单 API

创建和管理支付订单。

方法端点描述
POST/orders创建订单
GET/orders/:id获取订单详情
GET/orders列出订单

💰 充值 API

管理用户充值地址和充值。

方法端点描述
POST/deposits/references绑定充值地址
GET/deposits/references/:ref获取充值地址
GET/deposits/references列出充值引用
GET/deposits列出充值
DELETE/deposits/references/:ref解绑地址

🔄 转账 API

查询区块链交易。

方法端点描述
GET/transfers列出转账
GET/transfers/:id获取转账详情

📬 Webhooks API

配置 webhook 端点。

方法端点描述
POST/webhooks/endpoints创建端点
GET/webhooks/endpoints列出端点
PUT/webhooks/endpoints/:id更新端点
DELETE/webhooks/endpoints/:id删除端点
GET/webhooks/events列出事件

💳 支付链接 API

创建无代码支付链接。

方法端点描述
POST/payment-links创建链接
GET/payment-links列出链接
GET/payment-links/:id获取链接详情
PUT/payment-links/:id更新链接
DELETE/payment-links/:id删除链接

🏦 地址池 API

管理地址池(仅管理员)。

方法端点描述
POST/address-pool/import导入地址
GET/address-pool/status获取地址池状态
GET/address-pool/addresses列出地址

⚙️ 配置 API

管理组织设置(仅管理员)。

方法端点描述
GET/config获取所有配置
GET/config/:key获取配置值
PUT/config/:key更新配置

🔐 组织和 API 密钥

管理组织和 API 密钥(仅管理员)。

方法端点描述
GET/organizations列出组织
POST/organizations/:id/api-keys创建 API 密钥
GET/organizations/:id/api-keys列出 API 密钥
DELETE/api-keys/:keyId删除 API 密钥

错误处理

常见错误码

错误码HTTP 状态码描述解决方案
INVALID_API_KEY401API 密钥缺失或无效检查 API 密钥是否正确
INSUFFICIENT_PERMISSIONS403API 密钥缺少所需权限使用具有适当角色的密钥
RESOURCE_NOT_FOUND404请求的资源不存在验证 ID 是否正确
DUPLICATE_ORDER_REFERENCE409订单引用已存在使用唯一的订单引用
NO_AVAILABLE_ADDRESSES503地址池已耗尽导入更多地址
INVALID_AMOUNT400金额无效或为负数提供有效的正数金额
INVALID_CHAIN400不支持的链 ID使用支持的链 ID
INVALID_CURRENCY400链上不支持的币种使用该链的有效币种
ORDER_EXPIRED400无法支付已过期的订单创建新订单
ORDER_ALREADY_PAID400订单已完成检查订单状态

错误响应结构

typescript
{
  error: string;          // 简短的错误消息
  message: string;        // 详细的错误描述
  code: string;          // 用于编程处理的错误码
  statusCode: number;    // HTTP 状态码
  details?: any;         // 附加错误上下文(可选)
}

错误处理示例

TypeScript:

typescript
try {
  const response = await fetch('https://testnet.payin.com/api/v1/orders', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-API-Key': process.env.PAYIN_API_KEY!
    },
    body: JSON.stringify({
      orderReference: 'ORDER-2025-001',
      amount: '100.00',
      currency: 'USDT',
      chainId: 'ethereum-sepolia'
    })
  });

  if (!response.ok) {
    const error = await response.json();

    switch (error.code) {
      case 'DUPLICATE_ORDER_REFERENCE':
        console.log('Order already exists, fetching existing order');
        // Fetch existing order
        break;
      case 'NO_AVAILABLE_ADDRESSES':
        console.error('Address pool exhausted, alerting admin');
        // Send alert to admin
        break;
      default:
        console.error('API Error:', error.message);
        throw new Error(error.message);
    }
  }

  const order = await response.json();
  console.log('Order created:', order);
} catch (error) {
  console.error('Request failed:', error);
}

Python:

python
import requests

try:
    response = requests.post(
        'https://testnet.payin.com/api/v1/orders',
        headers={
            'Content-Type': 'application/json',
            'X-API-Key': os.getenv('PAYIN_API_KEY')
        },
        json={
            'orderReference': 'ORDER-2025-001',
            'amount': '100.00',
            'currency': 'USDT',
            'chainId': 'ethereum-sepolia'
        }
    )

    response.raise_for_status()
    order = response.json()
    print(f"Order created: {order['orderId']}")

except requests.exceptions.HTTPError as e:
    error = e.response.json()

    if error['code'] == 'DUPLICATE_ORDER_REFERENCE':
        print('Order already exists')
    elif error['code'] == 'NO_AVAILABLE_ADDRESSES':
        print('Address pool exhausted')
    else:
        print(f"API Error: {error['message']}")

版本控制

PayIn API 使用 URL 版本控制:

https://testnet.payin.com/api/v1/...

当前版本: v1

弃用策略:

  • 新 API 版本提前 6 个月公布
  • 旧版本在弃用后支持 12 个月
  • 仅在新主要版本中进行破坏性更改
  • 非破坏性更改添加到当前版本

SDK 和库

官方 SDK:

  • TypeScript/Node.js
  • Python
  • PHP

社区 SDK:

测试

测试模式

使用测试网络进行测试:

  • Base URL: https://testnet.payin.com/api/v1
  • 免费测试代币
  • 与生产环境相同的 API
  • 可安全实验

测试链和地址

测试网络链:

  • Ethereum Sepolia
  • Polygon Amoy
  • Tron Nile
  • Solana Devnet

获取测试代币:

示例测试流程

bash
# 1. 在测试网络上创建订单
curl -X POST https://testnet.payin.com/api/v1/orders \
  -H "Content-Type: application/json" \
  -H "X-API-Key: your-testnet-key" \
  -d '{
    "orderReference": "TEST-001",
    "amount": "10.00",
    "currency": "USDT",
    "chainId": "ethereum-sepolia"
  }'

# 2. 将测试 USDT 发送到支付地址

# 3. 检查订单状态
curl https://testnet.payin.com/api/v1/orders/ord_xxx \
  -H "X-API-Key: your-testnet-key"

# 4. 验证是否收到 webhook(如果已配置)

支持和资源

文档

API 状态

获取帮助

  • 电子邮件: support@payin.com
  • 文档: 浏览本网站
  • API 问题: 包含错误响应中的请求 ID

提高速率限制

对于需要更高速率限制的企业使用:

下一步

Released under the MIT License.