市面上的USDT支付接口比较多,各有所长,今天以BlockATM为例介绍如何快速接入这种支付接口。BlockATM的特点是基于智能合约,消费者的支付会直接进入智能合约钱包,平台无法触碰到资金,这种被称为Web3支付的模式是最近比较流行的。
步骤 1:注册并获取 API 密钥
注册账户:
- 访问 BlockATM 并注册一个账户。
- 完成邮箱验证和其他必要的身份验证步骤。
获取 API 密钥:
- 登录后,进入开发者或 API 设置页面。
- 生成一个新的 API 密钥,并妥善保存。
步骤 2:了解 API 类型和请求限制
BlockATM 提供了两种主要的 API 类型:
- Public API:用于非敏感操作,适合前端调用。
- Server-to-Server API:用于敏感操作(如创建订单),需要从后端服务器调用。
请求限制:
每个 API 密钥每分钟最多允许 100 次请求,超过限制会返回 429 错误。如果继续超限访问,会返回 418 错误并阻止后续请求。
步骤 3:设置请求头
在调用 BlockATM 的 API 时,需要在请求头中包含以下信息:
- BlockATM-API-Key:你的 API 密钥。
- BlockATM-Request-Time:请求的时间戳,精确到毫秒。
- BlockATM-Signature-V1:对请求数据进行签名(仅适用于创建订单 API)。
- BlockATM-Rec_Window:时间窗口,默认为 30000 毫秒。
步骤 4:生成支付二维码
我们将使用 Create QRCode Payment API 来生成 USDT 支付二维码。
API 请求示例
以下是一个 Python 示例代码,展示如何调用该 API:
import requests
import time
import json
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric.utils import encode_dss_signature
from cryptography.hazmat.backends import default_backend
# 你的 API 密钥
API_KEY = "your_api_key_here"
# 生成密钥对
def generate_key_pair():
private_key = ec.generate_private_key(ec.SECP256R1(), default_backend())
public_key = private_key.public_key()
return private_key, public_key
# 对请求数据进行签名
def sign_request(private_key, data):
signature = private_key.sign(data.encode(), ec.ECDSA(hashes.SHA256()))
return signature.hex()
# 创建支付二维码
def create_qr_code_payment():
url = "https://backend.blockatm.net/api/v1/payment/createQrOrder"
headers = {
"accept": "application/json",
"content-type": "application/json",
"BlockATM-API-Key": API_KEY,
"BlockATM-Request-Time": str(int(time.time() * 1000)), # 当前时间戳
}
# 请求参数
payload = {
"chainId": "1", # 链 ID(例如:1 表示以太坊主网)
"symbol": "USDT", # 代币符号
"amount": "100", # 支付金额
}
# 对请求数据进行签名
private_key, _ = generate_key_pair()
signature = sign_request(private_key, json.dumps(payload, sort_keys=True))
headers["BlockATM-Signature-V1"] = signature
# 发送请求
response = requests.post(url, headers=headers, json=payload)
return response.json()
# 调用函数并打印结果
result = create_qr_code_payment()
print(result)
参数说明
- chainId:区块链网络的 ID(例如:1 表示以太坊主网)。
- symbol:代币符号(例如:USDT)。
- amount:支付金额(例如:100 表示 100 USDT)。
响应示例
如果请求成功,API 会返回以下格式的 JSON 数据:
{
"cashierUrl": "https://blockatm.net/cashier/order123",
"toAddress": "0x1234567890abcdef1234567890abcdef12345678"
}
- cashierUrl:收银台 URL,用户可以通过扫描二维码访问。
- toAddress:USDT 收款地址。
步骤 5:查询智能合约的收款记录
BlockATM 提供了 Query Smart Contract Payment API,用于查询通过智能合约模式支付的订单信息。
API 请求示例
以下是一个 Python 示例代码,展示如何调用该 API:
import requests
# 查询智能合约支付记录
def query_contract_payment():
url = "https://backend.blockatm.net/api/v1/payment/contractPayment"
headers = {
"accept": "application/json",
"BlockATM-API-Key": API_KEY, # 你的 API 密钥
}
# 发送请求
response = requests.get(url, headers=headers)
return response.json()
# 调用函数并打印结果
payment_info = query_contract_payment()
print(payment_info)
响应示例
如果请求成功,API 会返回以下格式的 JSON 数据:
{
"orderId": "123456",
"status": "completed",
"amount": "100",
"symbol": "USDT",
"chainId": "1",
"toAddress": "0x1234567890abcdef1234567890abcdef12345678",
"timestamp": "1633024800000"
}
orderId:订单 ID。
status:订单状态(例如:completed 表示已完成)。
amount:支付金额。
symbol:代币符号。
chainId:链 ID。
toAddress:收款地址。
timestamp:支付时间戳。
步骤 6:处理支付结果
- 用户支付:用户扫描二维码并完成支付。
- 监听支付状态:使用 BlockATM 提供的 Query API 查询订单状态,确认支付是否成功。
步骤 7:错误处理
- 429 错误:请求频率过高,需降低请求频率。
- 418 错误:请求被阻止,需检查 API 密钥和请求参数。
- 其他错误:根据 API 返回的错误信息进行排查。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。