查询商户余额
查询当前 App ID 对应的商户余额。余额统一按 USD 计算,balanceCents 以 0.01 USD 为单位。
https://mailaohao.com/v1/merchant/balance无需参数
响应示例
{
"appId": "app_0123456789abcdef0123456789abcdef",
"merchantName": "示例商户",
"balanceCents": 12850,
"currency": "USD"
}通过以下 7 个商户接口查询余额与商品、创建订单并查询或下载卡密交付结果。
https://mailaohao.com/v1/merchantX-App-Id: app_0123456789abcdef0123456789abcdef
X-Api-Key: key_your_api_key使用 API Key 对规范字符串执行 HMAC-SHA256。正文先按对象键递归排序并压缩为 JSON, 再计算 SHA-256;签名格式为 sha256=<64 位小写十六进制>。
FAORBIT-HMAC-V1
<Unix 秒级时间戳>
<nonce>
POST
/v1/merchant/orders
<规范 JSON 正文的 SHA-256>X-App-Id: app_0123456789abcdef0123456789abcdef
X-Api-Timestamp: 1786172400
X-Api-Nonce: 0123456789abcdef0123456789abcdef
X-Api-Signature: sha256=<HMAC-SHA256 结果>
Content-Type: application/jsonimport { createHash, createHmac, randomBytes } from "node:crypto";
const appId = process.env.FAORBIT_APP_ID;
const apiKey = process.env.FAORBIT_API_KEY;
const baseUrl = "https://mailaohao.com";
const path = "/v1/merchant/orders";
const body = {
externalOrderNo: "merchant-order-1001",
productId: "22222222-2222-4222-8222-222222222222",
variantId: "33333333-3333-4333-8333-333333333333",
quantity: 1
};
function stableJson(value) {
if (value === null || typeof value !== "object") return JSON.stringify(value);
if (Array.isArray(value)) return "[" + value.map(stableJson).join(",") + "]";
return "{" + Object.keys(value).sort().map(
(key) => JSON.stringify(key) + ":" + stableJson(value[key])
).join(",") + "}";
}
const timestamp = Math.floor(Date.now() / 1000).toString();
const nonce = randomBytes(16).toString("base64url");
const bodyHash = createHash("sha256").update(stableJson(body)).digest("hex");
const canonical = [
"FAORBIT-HMAC-V1", timestamp, nonce, "POST", path, bodyHash
].join("\n");
const signature = "sha256=" + createHmac("sha256", apiKey)
.update(canonical)
.digest("hex");
const response = await fetch(baseUrl + path, {
method: "POST",
headers: {
"Content-Type": "application/json",
"X-App-Id": appId,
"X-Api-Timestamp": timestamp,
"X-Api-Nonce": nonce,
"X-Api-Signature": signature
},
body: JSON.stringify(body)
});MERCHANT_API_SIGNATURE_REQUIRED:写请求缺少签名头。MERCHANT_API_SIGNATURE_EXPIRED:时间戳与服务器相差超过 300 秒。MERCHANT_API_SIGNATURE_INVALID:请求头格式错误、正文被修改或使用了错误的 Key。MERCHANT_API_REPLAY_DETECTED:nonce 已使用,必须生成新 nonce。{
"error": {
"code": "MERCHANT_BALANCE_BELOW_ACCESS_MINIMUM",
"message": "商户 USD 余额低于 10.00,暂时无法访问商户 API"
}
}查询当前 App ID 对应的商户余额。余额统一按 USD 计算,balanceCents 以 0.01 USD 为单位。
https://mailaohao.com/v1/merchant/balance无需参数
{
"appId": "app_0123456789abcdef0123456789abcdef",
"merchantName": "示例商户",
"balanceCents": 12850,
"currency": "USD"
}仅获取该 App ID 所属店铺已开放的父分类和子分类;父分类未开放时,其子分类也不会返回。可使用 parentId 还原分类层级。
https://mailaohao.com/v1/merchant/categories无需参数
{
"categories": [
{
"id": "11111111-1111-4111-8111-111111111111",
"parentId": null,
"name": "Facebook",
"slug": "facebook",
"status": "active"
}
]
}商品列表仅支持按子分类查询,且该子分类必须已对当前店铺开放。category 为必填的子分类 slug,不支持省略或传入父分类,也不接受其他店铺的分类;只返回该店铺已上架且所属分类已开放的商品,金额统一以 USD 返回。
https://mailaohao.com/v1/merchant/products| 字段 | 是否必填 | 说明 |
|---|---|---|
category | 是 | 查询参数:子分类 slug;不支持父分类,例如 facebook-accounts |
{
"products": [
{
"id": "22222222-2222-4222-8222-222222222222",
"categoryId": "11111111-1111-4111-8111-111111111111",
"title": "商品名称",
"slug": "product-slug",
"priceCents": 150,
"currency": "USD",
"availableInventory": 25,
"variants": []
}
]
}按商品 slug 获取实时详情。仅允许访问该店铺已上架且所属分类已开放的商品,否则返回 404。下单前应重新获取,确认商品状态、USD 价格、库存和规格。
https://mailaohao.com/v1/merchant/products/{slug}| 字段 | 是否必填 | 说明 |
|---|---|---|
slug | 是 | 路径参数:商品唯一 slug |
{
"product": {
"id": "22222222-2222-4222-8222-222222222222",
"title": "商品名称",
"slug": "product-slug",
"priceCents": 150,
"currency": "USD",
"availableInventory": 25,
"variants": [
{
"id": "33333333-3333-4333-8333-333333333333",
"name": "10 个",
"priceCents": 1400,
"availableInventory": 8,
"quantityStep": 1
}
]
}
}使用 HMAC-SHA256 签名后创建订单,并立即使用商户 USD 余额付款。只能购买该店铺已上架且所属分类已开放的商品;USD 商品直接扣款,其他币种只换算一次到 USD;相同 externalOrderNo 重试不会重复扣款。
https://mailaohao.com/v1/merchant/orders| 字段 | 是否必填 | 说明 |
|---|---|---|
externalOrderNo | 是 | 商户侧唯一订单号,最长 120 个字符,仅支持 ASCII 字母、数字及 . _ : -;同编号重试必须保持商品、规格和数量一致 |
productId | 是 | 商品 UUID |
variantId | 否 | 规格 UUID;多规格商品必填 |
quantity | 是 | 购买数量,1–1000 |
{
"externalOrderNo": "merchant-order-1001",
"productId": "22222222-2222-4222-8222-222222222222",
"variantId": "33333333-3333-4333-8333-333333333333",
"quantity": 1
}{
"externalOrderNo": "merchant-order-1001",
"chargedAmountCents": 1400,
"currency": "USD",
"idempotent": false,
"order": {
"orderNo": "FO202608080001",
"status": "paid",
"totalAmountCents": 10080,
"currency": "CNY"
},
"items": [
{
"productId": "22222222-2222-4222-8222-222222222222",
"variantId": "33333333-3333-4333-8333-333333333333",
"productTitle": "商品名称 · 10 个",
"quantity": 1
}
],
"delivery": {
"count": 0,
"mode": "inline",
"items": []
}
}查询本 App ID 创建的订单状态和卡密。orderNo 可传商户订单号、平台订单号或平台订单 UUID;交付不超过 50 条时在 items 内返回,超过 50 条时通过 downloadUrl 下载。
https://mailaohao.com/v1/merchant/orders/{orderNo}| 字段 | 是否必填 | 说明 |
|---|---|---|
orderNo | 是 | 路径参数:商户订单号、平台订单号或订单 UUID |
{
"externalOrderNo": "merchant-order-1001",
"chargedAmountCents": 1400,
"currency": "USD",
"order": {
"orderNo": "FO202608080001",
"status": "completed"
},
"items": [
{
"productTitle": "商品名称 · 10 个",
"quantity": 1
}
],
"delivery": {
"count": 100,
"mode": "download",
"items": [],
"downloadUrl": "/v1/merchant/orders/FO202608080001/delivery.txt"
}
}下载本 App ID 创建且已完成发货的订单卡密。使用与其他 GET 接口相同的认证请求头,响应为 UTF-8 纯文本,每行一条卡密;未完成发货时返回 HTTP 409。
https://mailaohao.com/v1/merchant/orders/{orderNo}/delivery.txt| 字段 | 是否必填 | 说明 |
|---|---|---|
orderNo | 是 | 路径参数:商户订单号、平台订单号或订单 UUID |
card-1
card-2