REST API · v1

统一代理 API 对接文档

原有 ListResource、InfoResource、BResource、GetBalance 继续兼容;新的 Bearer API Key 可统一对接账号商品、刷粉服务、代理 IP 与账号查活,并提供 ACGV3 Shared API 和 Dujiao-Next 上游协议兼容入口。

API 基础地址
https://msk888acc.com/api/v1
下载合并版 Postman Collection
兼容接口返回币种(请在对接前确认)
  • ACGV3 Shared API:余额、商品/规格价格、库存价格和订单金额统一返回 人民币 CNY
  • Dujiao-Next API:余额、商品/SKU 价格和订单金额统一返回 美元 USD
两套兼容接口都只换算 API 返回值;实际余额扣减、订单入库和库存扣减仍按商城内部金额由服务端重新计算。

快速开始

  1. 登录用户中心的“API 接入管理”提交申请;管理员审核通过后,由用户在该页领取只显示一次的专属 API Key。
  2. 使用服务端程序通过 HTTPS 请求;不要在浏览器前端或公开代码中保存 Key。
  3. 先读取对应目录,只对 orderable=true 的商品或服务下单。
  4. 每笔新订单生成新的 Idempotency-Key;同一订单超时重试必须复用原 Key,并保存返回的订单号查询状态。

连通与余额测试

以下内容全部是占位符,不包含真实 Key。将 API_KEY 替换为您在“API 接入管理”一次性领取并安全保存的密钥。

API_BASE='https://msk888acc.com/api/v1'
API_KEY='sk_live_请替换为您的API_KEY'

curl --request GET "$API_BASE/" \
  --header 'Accept: application/json' \
  --header "Authorization: Bearer $API_KEY"

curl --request GET "$API_BASE/balance" \
  --header 'Accept: application/json' \
  --header "Authorization: Bearer $API_KEY"

接口总览

方法路径用途所需 Scope
GET/API 版本和接口索引任一有效 Key
GET/balance查询本站余额balance:read
GET/catalog/accounts账号商品目录account:read
GET/catalog/social刷粉服务目录social:read
GET/catalog/proxy代理类型、周期和地区proxy:read
GET/catalog/proxy/ips查询支持自选的 IPproxy:read
POST/catalog/proxy/quote查询实时站内余额价proxy:read
POST/catalog/proxy/renew/quote代理续费报价proxy:read
POST/orders/proxy/renew幂等提交代理续费proxy:write
POST/orders三类业务统一下单对应业务的 account:writesocial:writeproxy:write
GET/orders订单列表orders:read + 业务读取权限
GET/orders/{order_id}订单详情与交付结果orders:read + 对应业务的读取权限
GET/checker/capabilities查活平台和实时限额checker:read
POST/checker/checks创建账号查活检测checker:write
GET/checker/checks/{check_id}查询自己的检测结果checker:read

认证、请求头与 Scope

所有 /api/v1 接口(包括 v1 根索引)都要求 Bearer 认证。Key 只能放在请求头,不能放入 URL、查询参数、日志或网页源码;旧版四个账号接口继续沿用原有用户名/密码参数。

Authorization: Bearer sk_live_请替换为您的API_KEY
Accept: application/json

创建订单还必须加入:

Content-Type: application/json
Idempotency-Key: reseller-order-20260723-000001

可用 Scope

balance:read orders:read account:read account:write social:read social:write proxy:read proxy:write checker:read checker:write

这里的权限必须填写上方列出的完整名称,不支持字面通配符。各业务的 :read 用于读取目录、交付或检测结果,:write 用于创建订单或检测;订单列表还需要 orders:read

平台可能为 Key 设置每分钟请求上限、来源 IP/CIDR 白名单、过期时间和模块权限。遇到 403 insufficient_scope403 ip_not_allowed 时,请联系平台方核对 Key 配置。

余额

GEThttps://msk888acc.com/api/v1/balance

{
  "success": true,
  "data": {
    "balance": 12800,
    "currency": "site_balance"
  },
  "meta": {
    "api_version": "v1",
    "request_id": "示例请求ID"
  }
}

商品与服务目录

目录是商品/服务 ID、库存、国家、周期和数量限制的实时依据,请勿长期写死,只提交 orderable=true 的条目。账号和刷粉价格取目录返回值;代理 IP 价格以 POST /catalog/proxy/quote 的实时报价为准。

账号商品

GET/catalog/accounts?limit=100&cursor=0

返回商品 ID、分类、名称、说明、价格、购买上下限、库存、规格和图标。本地库存商品以及已启用、已适配连接中的商品均可级联下单;库存未知、缺货或连接未适配时返回 orderable=false

刷粉服务

GET/catalog/social?limit=100&cursor=0

返回服务 ID、分类、类型、价格、最小/最大数量及补单、取消、渐进投放能力。下单前必须按目录中的 type 组织参数。

代理 IP

GET/catalog/proxy

返回 kindsperiods、数量范围和地区。支持自选 IP 的类型可请求 /catalog/proxy/ips?kind=dedicated_ipv4&country=us&city=123;购买前用 POST /catalog/proxy/quote 查询实时站内余额价。

账号条目的 fulfillmentlocalconnected;两者使用相同的本站商品 id 下单。无规格商品检查条目级 stock_knownstockorderable。多规格商品还必须在 variants 中选择 stock_known=truestock>0orderable=true 的精确 key;库存未知或为 0 的规格不可下单。
{
  "id": 1001,
  "fulfillment": "connected",
  "stock": 12,
  "stock_known": true,
  "variants": [
    {
      "key": "美国",
      "price": 120,
      "stock": 12,
      "stock_known": true,
      "orderable": true,
      "availability_reason": null
    }
  ],
  "orderable": true,
  "availability_reason": null
}

目录请求示例

API_BASE='https://msk888acc.com/api/v1'
API_KEY='sk_live_请替换为您的API_KEY'

curl "$API_BASE/catalog/accounts?limit=20&cursor=0" \
  --header 'Accept: application/json' \
  --header "Authorization: Bearer $API_KEY"

curl "$API_BASE/catalog/social?limit=20&cursor=0" \
  --header 'Accept: application/json' \
  --header "Authorization: Bearer $API_KEY"

curl "$API_BASE/catalog/proxy" \
  --header 'Accept: application/json' \
  --header "Authorization: Bearer $API_KEY"

目录分页

账号和刷粉目录支持 limit(1–200)及 cursor。读取响应中的 meta.pagination.next_cursor;为 null 时表示已到末页。

"meta": {
  "api_version": "v1",
  "request_id": "示例请求ID",
  "pagination": {
    "limit": 100,
    "next_cursor": 2100
  }
}

统一下单

POSThttps://msk888acc.com/api/v1/orders

通过 JSON 字段 type 区分业务:accountsocialproxy。下单需要对应的写权限。

Idempotency-Key 幂等规则

  • 长度必须为 16–64 位,首字符为字母或数字,其余可使用字母、数字、点、下划线、冒号和短横线。
  • 同一用户使用相同幂等键和完全相同的 JSON 重试,只返回原订单,不会重复购买。
  • 相同幂等键配合不同 JSON 会返回 409 idempotency_conflict
  • 网络超时后先用原幂等键重试或按订单号查询;若状态为 upstream_pending,不要换新键重复下单。
  • 账号商品存在完全相同且未结束的请求时,即使误换了新键,系统也会返回原待处理订单并标记 meta.duplicate_pending_guard=true,不会再次提交购买。

1. 账号商品

{
  "type": "account",
  "product_id": 1001,
  "quantity": 2
}

product_id、数量范围和可选 variant_key 来自账号目录。无规格商品不要发送 variant_key。账号订单完整交付后,delivery 包含 product_idquantityvariant_key 和仅属于当前代理的 accounts;无规格商品的 variant_key 为空字符串。本文档不展示任何卡密示例。

连接商品与本地商品使用完全相同的下单 JSON。平台会在站内完成级联购买和对账,连接凭据及原始服务响应不会返回给下游。多规格商品的 variant_key 必须逐字使用目录 variants[].key,并且购买数量不能超过该规格的 stock

2. 刷粉服务

{
  "type": "social",
  "service_id": 2104,
  "url": "https://example.com/post/1",
  "quantity": 100
}
  • Default:使用 urlquantity
  • Package:仍传 quantity,计费数量固定为 1。
  • Custom Comments:仍需传一个正整数 quantity,并额外传 comments(每行一条);实际计费和范围校验以非空评论行数为准。
  • Mentions / Comment Likes:额外传 usernames

3. 代理 IP

下单前可使用 POST/catalog/proxy/quote 获取实时站内余额价。该接口只读,需要 proxy:read,不需要 Idempotency-Key,不扣款也不创建订单。

curl --request POST 'https://msk888acc.com/api/v1/catalog/proxy/quote' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer sk_live_请替换为您的API_KEY' \
  --data '{"kind":"dedicated_ipv4","country":"us","period":30,"quantity":2}'
{
  "success": true,
  "data": {
    "kind": "dedicated_ipv4",
    "country": "us",
    "period": 30,
    "quantity": 2,
    "amount": 1200,
    "currency": "site_balance",
    "price_locked": false,
    "notice": "报价仅供购买前参考;创建订单时会重新计算并按当时金额扣款"
  }
}

报价请求与代理下单使用相同参数规则:quantityip_list 必须且只能提交一种。如使用 ip_list,类型必须支持自选 IP,列表必须是 1–1000 个不重复的正整数 ID。price_locked=false 表示下单时会再次询价,实际扣款以下单当时为准。

{
  "type": "proxy",
  "kind": "dedicated_ipv4",
  "country": "us",
  "period": 30,
  "quantity": 2
}

kind、国家、周期和数量必须使用目录实时返回值。对 supports_ip_selection=true 的类型,可先查询 IP;该查询单次最多返回 2000 项且当前不分页。下单时使用返回的正整数 ID 组成 ip_list 来替换 quantity,ID 不能重复且最多 1000 个。其他类型不要传 ip_list,仍需传 quantity

{
  "type": "proxy",
  "kind": "dedicated_ipv4",
  "country": "us",
  "period": 30,
  "ip_list": [90101, 90102]
}

代理续费

代理订单完成后,每个 delivery.items[] 会包含仅属于当前 API 用户的 renewal_token。先调用 /catalog/proxy/renew/quote 获取报价,再向 /orders/proxy/renew 提交相同凭证和周期;实际续费请求必须使用新的 Idempotency-Key,超时重试必须复用原值。一次最多续费同一订单中的 100 个代理。

curl --request POST 'https://msk888acc.com/api/v1/orders/proxy/renew' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer sk_live_请替换为您的API_KEY' \
  --header 'Idempotency-Key: proxy-renew-20260804-000001' \
  --data '{"renewal_tokens":["pr1.请替换为交付中的续费凭证"],"period":30}'

完整 curl 示例

curl --request POST 'https://msk888acc.com/api/v1/orders' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer sk_live_请替换为您的API_KEY' \
  --header 'Idempotency-Key: social-20260723-000001' \
  --data '{"type":"social","service_id":2104,"url":"https://example.com/post/1","quantity":100}'
目录中的价格、库存或可用状态不代表永久锁定。服务端以创建订单时的实时数据为准;余额不足、服务停用或上游不可用时会拒绝或进入待确认状态。

订单查询与交付

订单列表

GET/orders?limit=50&before_id=9999&type=account

limit 为 1–100,默认 50;下一页使用 meta.pagination.next_before_id 作为新的 before_idtype 可选 accountsocialproxy。省略时只返回当前 Key 具有对应读取 Scope 的订单。

订单详情

GET/orders/DO2607230123456789ABCDEF

订单详情只允许当前 API Key 所属用户读取。完成后,不同业务会在 delivery 中返回账号交付、刷粉进度或代理连接信息。请将交付内容视为敏感数据并加密保存。

统一订单字段

{
  "success": true,
  "data": {
    "id": "DO2607230123456789ABCDEF",
    "type": "social",
    "status": "processing",
    "amount": 1200,
    "currency": "site_balance",
    "error": null,
    "created_at": "2026-07-23 12:00:00",
    "updated_at": "2026-07-23 12:00:01"
  },
  "meta": {
    "api_version": "v1",
    "request_id": "示例请求ID"
  }
}

订单状态

状态含义建议
processing本站正在处理稍后使用同一订单号查询
completed订单已完成读取并安全保存 delivery
seller_pending商品已交付,销售分成待补处理交付可用;平台后台继续处理
upstream_pending外部连接处理结果暂不确定禁止换幂等键重复下单,继续查询
reconciliation_pending订单结果与本站记录正在核对继续查询;长时间未变请提供 request_id
failed未扣款或安全失败检查 error 后决定是否用新键重下
refunded失败且已退款核对余额后可按需重新下单
refund_pending退款待处理不要重复下单,联系平台方核对

processingupstream_pendingreconciliation_pendingrefund_pendingseller_pending 返回 HTTP 202;其他已结束状态返回 HTTP 200。ACGV3 待处理订单由计划任务自动查询;没有可靠查询接口的其他连接在结果不确定时会等待管理员核对,期间禁止换 Key 重复下单。

账号查活 API

查活接口与商品下单相互独立,需要单独的 checker:read / checker:write 权限。旧 Key 不会自动增加查活权限。 当前开放 Facebook UID 检测。只有取得可靠存活证据时才返回 live,其余返回 unknown;不会把网络异常猜成存活或失效。

1. 读取平台与限额

GET/checker/capabilities

返回当前支持的平台、单批上限、每分钟检测数量、结果保留天数和结果枚举。 当前平台为 facebook,检测对象必须是纯数字 UID。

2. 创建检测

POST/checker/checks

必须发送 16–64 位 Idempotency-Key。同一个检测超时重试时复用原键, 不会重复执行;同一幂等键配合不同内容会返回 409 idempotency_conflictchecker:write 允许读取本次创建请求的同步结果; 后续按编号查询仍需 checker:read

curl --request POST 'https://msk888acc.com/api/v1/checker/checks' \
  --header 'Accept: application/json' \
  --header 'Content-Type: application/json' \
  --header 'Authorization: Bearer sk_live_请替换为您的API_KEY' \
  --header 'Idempotency-Key: checker-20260727-000001' \
  --data '{"platform":"facebook","identifiers":["100000000000001","100000000000002"]}'

3. 查询检测结果

GET/checker/checks/{check_id}

{
  "success": true,
  "data": {
    "check_id": "CK2607270123456789ABCDEF",
    "platform": "facebook",
    "status": "partial",
    "submitted_count": 2,
    "unique_count": 2,
    "summary": {"live": 1, "dead": 0, "unknown": 1},
    "results": [
      {"position": 0, "identifier": "100000000000001", "status": "live"},
      {"position": 1, "identifier": "100000000000002", "status": "unknown"}
    ]
  }
}
  • live:本次取得了可信的存活证据。
  • dead:为后续可靠失效检测预留;当前 Facebook 检测不会返回此值。
  • unknown:远端限制、网络异常或页面结构无法可靠判断;应稍后重试,不能归入 live/dead。
  • 重复检测对象会按规范化值去重;submitted_count 是原数量,unique_count 是实际检测数量。
  • 普通 unknown 建议采用指数退避重试;只有 HTTP 429 才按响应头 Retry-After 等待。
  • 任务异常中断并超过处理时限后会变为 failed;确认失败后如需重试,请生成新的幂等键。
  • 检测任务和明细默认保留 14 天,实际天数以 capabilities 返回值为准。

统一响应、错误与限流

成功响应

{
  "success": true,
  "data": {},
  "meta": {
    "api_version": "v1",
    "request_id": "示例请求ID"
  }
}

请求层失败响应

认证、权限、JSON、路由或幂等键格式等问题会返回 HTTP 4xx/5xx,并使用 success=false

{
  "success": false,
  "error": {
    "code": "invalid_json",
    "message": "JSON 请求内容无效"
  },
  "meta": {
    "api_version": "v1",
    "request_id": "示例请求ID"
  }
}

订单业务失败仍是订单响应

只要请求已通过基础校验并创建了订单记录,库存不足、余额不足、业务参数错误或上游明确拒绝等结果会返回 success=true;此时必须继续检查 data.statusdata.error,不能只看 HTTP 200/202 或顶层 success

{
  "success": true,
  "data": {
    "id": "DO2607230123456789ABCDEF",
    "type": "account",
    "status": "failed",
    "amount": 0,
    "currency": "site_balance",
    "error": {
      "code": "insufficient_stock",
      "message": "商品库存不足"
    }
  },
  "meta": {
    "api_version": "v1",
    "request_id": "示例请求ID"
  }
}

请同时记录 HTTP 状态码、订单 data.status、相应错误码和 meta.request_id。联系平台方排查时只提供订单号和 request_id,不要发送完整 API Key。

常见 HTTP 状态

HTTP常见错误码处理方式
400invalid_jsoninvalid_idempotency_key修正 JSON 或幂等键格式
401invalid_api_keyapi_key_expired检查 Bearer 请求头或申请新 Key
403insufficient_scopeip_not_alloweddemo_mode核对权限、来源 IP 或站点模式
404endpoint_not_foundorder_not_found核对路径和订单归属
409idempotency_conflictorder_busychecker_busy保持原请求内容并稍后重试;检测忙时不要并发重放同一幂等键
413 / 415payload_too_largeunsupported_media_type缩小内容并使用 application/json
422invalid_order_typeinvalid_proxy_filterinvalid_proxy_quantity_choiceinvalid_ip_listunsupported_platforminvalid_identifiersbatch_too_large按实时目录或 capabilities 校验请求类型、筛选参数及检测对象;报价/代理下单只能传 quantityip_list 之一
429rate_limit_exceededchecker_concurrency_exceededchecker_quota_exceededRetry-After 延迟,并降低并发
500 / 503internal_errorproxy_downstream_disabledprovider_not_configuredquote_unavailablechecker_schema_not_readychecker_runtime_unavailablechecker_disabledchecker_failed保留 request_id,指数退避后查询/重试;配置类错误请联系平台方

限流响应头包括 X-RateLimit-LimitX-RateLimit-RemainingX-RateLimit-Reset;超限时另有 Retry-After

旧版账号 API(继续兼容)

已经对接的 ListResourceInfoResourceBResourceGetBalance 保持原路径和参数不变,只要后台“购买账户 API”总开关开启即可继续使用,不会因为新增 v1 API 而失效。

Bearer v1 的账号目录同时覆盖本地库存商品和已适配连接商品;这只是新增能力,不会改变旧接口的 URL、参数以及原有 success/error 状态枚举。

旧接口使用商城用户名和密码鉴权,必须通过 HTTPS 从服务端调用:

GET https://msk888acc.com/api/GetBalance.php?username=账号&password=密码
GET https://msk888acc.com/api/ListResource.php?username=账号&password=密码
GET https://msk888acc.com/api/InfoResource.php?username=账号&password=密码&id=商品ID
GET https://msk888acc.com/api/BResource.php?username=账号&password=密码&id=商品ID&amount=数量

规格商品购买时继续附加 category=规格键。每次购买都应附加稳定且唯一的 request_no(16–64 位字母、数字、下划线或短横线);同一次请求因超时或断线重试时必须复用原值。兼容字段还包括 requestNoorder_noout_trade_no 或请求头 Idempotency-Key,同时提供多个字段时值必须一致。若外部商品结果暂时无法确认,旧接口仍返回 status=error,但提示会明确“订单正在处理中”并附带 data.trans_id;此时不得自动重复购买,应保存交易号并查询购买记录。下载本页合并版 Postman 后,在 Collection Variables 中填写 legacy_usernamelegacy_passwordlegacy_product_id 和可选的 legacy_category 即可测试。

OnlineStore FX 防重复要求:该上游购买接口本身不接收幂等订单号,因此下游必须给每笔业务订单生成唯一请求编号,并在网络重试时保持编号不变。收到“订单正在处理中,请到购买记录查看”后只能查询原订单,不得换新编号再次购买。未传请求编号的旧客户端仅提供短时兼容去重,不能替代稳定幂等键;确实需要连续购买两笔时,应给两笔订单使用不同请求编号。

旧接口与 Bearer v1 对照

现有接口新项目可选 v1 接口说明
ListResourceGET /catalog/accounts使用 limitcursor 分页,并检查 orderable
InfoResourceGET /catalog/accounts当前没有单商品接口;按 cursor 遍历目录并以返回条目的 id 匹配。
BResourcePOST /orders发送 type=accountproduct_idquantity 和新的幂等键。
GetBalanceGET /balance使用 Bearer 请求头,不再传用户名和密码。
旧接口会在 URL 查询参数中携带用户名和密码,因此 Web 服务器、CDN 和监控日志必须隐藏查询字符串。原客户可以继续使用;新客户建议使用 Bearer v1。高风险的供应商写入接口 importAccount.php 不属于上述四个客户接口,仍默认关闭。

ACGV3 Shared API 兼容

ACGV3 用户可直接使用 Shared API 协议对接本站账号目录和账号订单。先在“API 接入管理”领取包含 account:readaccount:writeorders:readbalance:read 的标准 Key,再生成只显示一次的 app_id / app_key
返回币种:人民币 CNY balancepriceuser_pricefactory_price、多规格价格和订单 amount 均为人民币金额; 响应中的 currency 字段返回 CNY。 为兼容 ACGV3 3.1.0,商品和库存响应的 config 始终是 ACGV3 配置字符串(以 [category] 等配置段表示; 无规格时为空字符串),不会返回数组、对象或 JSON 配置文本。

基础地址是本站域名,例如 https://msk888acc.com。所有接口使用 application/x-www-form-urlencodedPOST 请求。

sign 外,每个请求都必须提交领取到的数字 app_id。统一响应为:

{
  "code": 200,
  "msg": "success",
  "data": {}
}

签名算法

  1. 从请求参数移除 sign
  2. 按参数名升序排序,仅移除值严格等于空字符串 '' 的参数。
  3. 用 PHP http_build_query 生成查询串,再执行 urldecode
  4. 末尾追加 &key={app_key},计算小写 MD5。
function makeSign(array $data, string $appKey): string
{
    unset($data['sign']);
    ksort($data);
    foreach ($data as $key => $value) {
        if ($value === '') {
            unset($data[$key]);
        }
    }
    return md5(urldecode(http_build_query($data) . '&key=' . $appKey));
}

接口列表

路径用途
/shared/authentication/connect连接测试、店铺名和人民币余额(CNY)
/shared/commodity/categories已开放账号商品的分类
/shared/commodity/categoryItems指定分类商品
/shared/commodity/items全部分类与商品
/shared/commodity/itemcode 返回平铺商品;兼容 sharedCode 分类响应
/shared/commodity/inventoryState检查数量和规格是否可购买
/shared/commodity/inventory库存、人民币价格(CNY)及多规格库存
/shared/commodity/stockcode 返回库存数量
/shared/commodity/trade余额创建订单
/shared/commodity/draftCard本地可自选商品的公开预览列表
/shared/commodity/querytradeNo 查询
/shared/commodity/query2requestNo 查询

业务参数

接口除 app_id / sign 外的参数说明
categoryItemscategory_id目录返回的分类 ID
itemcodesharedCode目录返回的本地商品代码;code 返回平铺商品,sharedCode 保留旧版分类数组
inventorysharedCode,可选 race多规格未传 race 时返回总库存和完整 ACGV3 config 配置字符串;传入后返回该规格库存/价格
inventoryStateshared_codenum,可选 racecard_id下单前实时校验;非零 card_id 仅用于本地可自选商品且 num 必须为 1
stockcode,可选 race返回字符串类型的当前库存数量
tradeshared_codecontactnum、可选 request_noracecard_id强制余额支付;成功返回 tradeNo、人民币 amount(CNY)、currency、secret、status、url(固定为 null)
draftCardsharedCodepagelimit,可选 race仅返回可公开的 id、draft;若存在安全主页链接还会返回 profile_url
querytradeNo查询当前 app_id 所属订单
query2requestNo使用 trade 的 request_no 查询
强烈建议每笔新订单提交唯一 request_no;网络超时重试必须复用原值,这样才能安全取得同一笔订单。 为兼容原版 Shared API,未提供 request_no 时仍可下单,但每次请求会被视为一笔新订单; 此时客户端超时后不得自动重试,应先用返回的 tradeNo 查询或联系管理员核对。

订单公开状态固定为 pendingcompletedfailed;当状态为 pending 时应使用原订单号继续查询,不能更换请求号重复下单。

本地库存商品在后台启用“可自选”后会返回 draft_status=1,并可使用 /shared/commodity/draftCard 与非零 card_id;预览只包含后台允许公开的内容, 完整卡密仍仅在支付成功后交付。连接商品/上游商品暂不支持把远端自选库存透传给下游, 因此会返回 draft_status=0。非零 card_id 仅支持购买 1 个且不能同时传 race

Dujiao-Next 上游协议兼容

Dujiao-Next 用户可以把本站直接配置为“上游站点”,无需另外开发插件。 先在“API 接入管理”领取包含 account:readaccount:writeorders:readbalance:read 的标准 Key,再生成只显示一次的 API Key / API Secret
返回币种:美元 USD balance、Product/SKU 的 price_amount、订单 amountunit_pricetotal_price 均为美元金额; 响应中的 currency 字段返回 USD

Dujiao-Next 会在“站点地址”后自动拼接兼容接口路径,因此连接管理中只填写本站根地址:

https://msk888acc.com

实际签名和请求使用的接口基地址为:

https://msk888acc.com/api/v1/upstream

成功响应统一包含 "ok": true;失败响应包含 "ok": falseerror_codeerror_message

请求签名

每个请求必须携带以下三个 Header。时间戳为 Unix 秒,允许偏差 ±60 秒。

Header内容
Dujiao-Next-Api-Key用户中心生成的 API Key
Dujiao-Next-TimestampUnix 秒级时间戳
Dujiao-Next-Signature下面签名串的 HMAC-SHA256 小写十六进制结果
BODY_MD5 = md5(raw_request_body)
SIGN_STRING = METHOD + "\n" + PATH + "\n" + TIMESTAMP + "\n" + BODY_MD5
SIGNATURE = hex_lower(hmac_sha256(SIGN_STRING, API_SECRET))
METHOD 必须大写;PATH 包含 /api/v1/upstream,但不含域名和查询参数;MD5 必须基于实际发送的原始请求体。 GET 或无请求体时,使用空字符串的 MD5 d41d8cd98f00b204e9800998ecf8427e

接口列表

方法路径用途Scope
POST/ping连通性、美元余额和币种(USD)balance:read
GET/categories账号商品分类account:read
GET/products?page=1&page_size=20商品和 SKU 列表,价格为 USD;每页 1–100 条account:read
GET/products/:id商品详情account:read
POST/orders余额创建订单account:write
GET/orders/:id查询状态和交付内容orders:read
POST/orders/:id/cancel尝试取消;不满足安全取消条件时返回 409orders:read + account:write

创建与查询订单

必须使用商品列表中 is_active=true 且库存可用的 skus[].id。创建订单必须提交全局唯一的 downstream_order_no;同一 API Key 下重复提交相同值会返回原订单, 网络超时重试时不能换值重复下单。

{
  "sku_id": 1,
  "quantity": 1,
  "downstream_order_no": "your-order-202607290001",
  "trace_id": "your-order-202607290001",
  "callback_url": "https://your-dujiao.example/api/v1/upstream/callback"
}
{
  "ok": true,
  "order_id": 101,
  "order_no": "API202607290001",
  "status": "paid",
  "amount": "9.90",
  "currency": "USD"
}

保存返回的 order_id,并继续通过 GET /orders/:id 轮询作为回调失败时的兜底。完成后响应中的 fulfillment.payloadfulfillment.delivery_data.items 才是交付内容。

所有创建订单请求都必须提交 downstream_order_no; 提交 callback_url 时同样不能省略。回调地址只能是可公开访问的 HTTPS 地址, 不能使用 localhost、内网或保留地址。本站会使用同一 API Key / Secret 按上述规则 签名 POST 回调;接收端应按 order_iddownstream_order_no 幂等处理,并返回 {"ok":true,"message":"received"}。网络失败会退避重试, 但 Dujiao-Next 仍应轮询到 completedcanceledmanual_form_data 仅接受空对象。
已支付或已进入供应链的账号订单无法证明可以安全原路取消,因此取消接口可能返回 409 cancel_not_allowed。这能防止已发货后重复退款或重复交付。

安全与生产接入要求

  • 仅通过 HTTPS 从服务端请求;此 API 不支持浏览器跨域预检,不要在 JavaScript、App 安装包或公开仓库中嵌入 Key。
  • 为测试和生产使用不同 Key,并申请最小 Scope;能够固定出口 IP 时启用 IP/CIDR 白名单。
  • Key 泄露时立即联系平台方撤销并换新。日志只记录 Key 前缀,绝不记录完整 Authorization 请求头。
  • 每个业务订单使用唯一幂等键;网络异常时不要盲目换键重下,先查询原订单。
  • 账号卡密及代理账号密码均属于敏感交付数据,应加密保存、限制访问并设置合理保留期限。
  • 请遵守适用法律、第三方平台规则和本站条款,不得将 API 用于欺诈、骚扰、侵权或其他违法用途。