大数据 API 调用说明
恒昌大数据开放平台(HC-BDOP)为开发者提供标准化的 REST 数据接口。本文档描述接口的调用方式、鉴权签名、 错误处理与配额规则,全部示例可直接复制运行。
api.wchc888.cn、AppKey/AppSecret、返回数据均为示例构造,仅用于说明 API 接入规范,不代表真实可用的数据服务。接入真实服务请联系文昌恒昌网络获取正式文档。01平台概述
平台将多源异构数据清洗为标准化指标,通过统一网关对外提供 HTTP 接口。所有接口具备以下特征:
- 统一网关入口:
https://api.wchc888.cn/bigdata/v1,全部走 HTTPS,拒绝明文 HTTP。 - 统一返回结构:HTTP 状态码 + 业务码
code双层结构,详见 通用规范。 - 两级鉴权:临时令牌
access_token(2 小时有效)与 HMAC-SHA256 服务端直连签名。 - 请求即计费:按成功调用量计费,失败请求(业务码非 0)不计入配额。
- 异步任务支持:重计算类接口(如报告生成)采用任务模式 + Webhook 回调。
02快速开始
五步完成第一次调用:
- 注册开发者账号在开放平台控制台完成实名认证,一个主体可创建最多 5 个应用。
- 创建应用获取密钥系统颁发 AppKey(公开标识)与 AppSecret(服务端保密),Secret 仅在创建时完整显示一次。
- 获取访问令牌用 AppKey + AppSecret 调用 POST /oauth/token,换取 access_token。
- 携带令牌调用业务接口在请求头放置
Authorization: Bearer <access_token>。 - 处理返回结果校验业务码
code == 0后读取data字段;记录request_id以便排查。
# 1. 获取令牌
curl -X POST "https://api.wchc888.cn/bigdata/v1/oauth/token" \
-H "Content-Type: application/json" \
-d '{
"app_key": "hc_demo_9f3ac2",
"app_secret": "********"
}'
# 2. 调用业务接口
curl -G "https://api.wchc888.cn/bigdata/v1/enterprise/info" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..." \
-d "keyword=海南禾泰水产有限公司"
03认证与签名
平台提供两种鉴权方式,任选其一即可:
方式一:access_token 令牌(推荐,浏览器 / 移动端)
- 令牌有效期 7200 秒,到期前 10 分钟内重复获取返回缓存的同一令牌,不会重复计费。
- 令牌须保存在服务端,切勿写入前端代码、小程序包或公开仓库。
- 收到
40003时重新获取令牌并重放原请求。
方式二:HMAC-SHA256 签名(服务端直连,免令牌)
适合服务间高并发调用。在请求头携带 X-HC-Key、X-HC-Timestamp、X-HC-Signature 三个字段。签名规则:
- 拼接待签名串格式:
{HTTP_METHOD}\n{PATH}\n{TIMESTAMP}\n{排序后的 query 串或 body 的 MD5}。 - 参数排序query 参数按 key 的 ASCII 升序排列,形如
k1=v1&k2=v2;POST 请求使用请求体的 MD5 小写十六进制值。 - 计算签名以 AppSecret 为密钥对待签名串做 HMAC-SHA256,输出大写十六进制字符串。
- 时间容差服务器只接受与当前时间偏差 ±300 秒内的请求,防止重放。
import hashlib, hmac, time
APP_KEY = "hc_demo_9f3ac2"
APP_SECRET = "your_app_secret"
def sign(method: str, path: str, params: dict) -> dict:
ts = str(int(time.time()))
query = "&".join(f"{k}={params[k]}" for k in sorted(params))
raw = f"{method.upper()}\n{path}\n{ts}\n{query}"
sign = hmac.new(APP_SECRET.encode(), raw.encode(), hashlib.sha256).hexdigest().upper()
return {
"X-HC-Key": APP_KEY,
"X-HC-Timestamp": ts,
"X-HC-Signature": sign,
}
04通用规范
公共请求头
| Header | 必填 | 说明 |
|---|---|---|
Authorization | 二选一 | Bearer 令牌,与签名方式二选一 |
X-HC-Key / X-HC-Timestamp / X-HC-Signature | 二选一 | HMAC 签名三件套 |
Content-Type | POST 必填 | 固定 application/json |
Accept-Language | 否 | zh-CN(默认)/ en-US,影响描述性字段语言 |
X-Idempotency-Key | 否 | POST 类接口幂等键,建议使用 UUID,10 分钟内重放返回同一结果 |
统一返回结构
{
"code": 0, // 业务码,0 = 成功
"message": "success", // 人类可读描述
"request_id": "req_8f1e0a3b7c", // 链路追踪 ID,反馈问题时必附
"data": { } // 业务数据,失败时为 null
}
分页、时间与编码
- 分页参数:
page(从 1 起)、page_size(默认 20,最大 100);返回体包含pagination对象。 - 时间格式:ISO 8601,如
2026-09-17T21:30:00+08:00;日期区间参数用start_date / end_date(含端点)。 - 字符编码:请求与响应均为 UTF-8;金额单位为元(保留 2 位小数),比率单位为百分比数值(如 6.8 表示 6.8%)。
- 字段命名:一律 snake_case;扩展字段以
x_前缀标识,可随时忽略。
05接口列表
| 接口 | 方法 | 路径 | 计费/次 |
|---|---|---|---|
| 获取访问令牌 | POST | /oauth/token | 免费 |
| 企业工商信息查询 | GET | /enterprise/info | 0.02 元 |
| 企业风险评分 | GET | /enterprise/risk | 0.05 元 |
| 行业景气指数 | GET | /industry/trend | 0.01 元 |
| 区域经济指标 | GET | /region/economy | 0.01 元 |
| 舆情情感分析 | POST | /nlp/sentiment | 0.003 元 / 条 |
| 数据报告任务 | POST | /report/tasks | 2.00 元 / 份 |
| 报告任务状态 | GET | /report/tasks/{task_id} | 免费 |
| 配额使用量查询 | GET | /quota/usage | 免费 |
5.1 获取访问令牌
/oauth/token使用 AppKey + AppSecret 换取 access_token。此接口无需鉴权,但同一 AppKey 每分钟最多请求 5 次。
| 参数 | 位置 | 必填 | 类型 | 说明 |
|---|---|---|---|---|
app_key | body | 是 | string | 平台颁发的应用标识 |
app_secret | body | 是 | string | 应用密钥,务必仅在服务端使用 |
grant_type | body | 否 | string | 固定 client_credentials,缺省等价 |
{
"code": 0,
"message": "success",
"request_id": "req_token_01hx92",
"data": {
"access_token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJoY19kZW1vIn0.dQw4w9WgXcQ",
"token_type": "Bearer",
"expires_in": 7200,
"scope": "enterprise:r enterprise:risk industry:r region:r nlp:r report:w"
}
}
5.2 企业工商信息查询
/enterprise/info按企业名称或统一社会信用代码查询注册信息。两个定位参数至少传一个,同时传入时以 credit_code 优先。
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
keyword | 条件必填 | string | 企业名称关键字,支持模糊匹配,≤ 60 字符 |
credit_code | 条件必填 | string | 统一社会信用代码,18 位精确匹配 |
with_shareholders | 否 | boolean | 是否返回股东列表,默认 false |
page / page_size | 否 | int | 模糊匹配结果分页 |
curl -G "https://api.wchc888.cn/bigdata/v1/enterprise/info" \
-H "Authorization: Bearer $TOKEN" \
-d "credit_code=91469005MA5T1234XA" \
-d "with_shareholders=true"
{
"code": 0,
"message": "success",
"request_id": "req_ent_5521",
"data": {
"credit_code": "91469005MA5T1234XA",
"name": "海南禾泰水产有限公司",
"legal_person": "陈某某",
"reg_capital_wan": 500.00,
"establish_date": "2018-03-12",
"status": "在营",
"industry": "渔业 · 水产养殖",
"address": "海南省文昌市××镇××路 12 号",
"shareholders": [
{ "name": "陈某某", "ratio": 62.50 },
{ "name": "符某某", "ratio": 37.50 }
],
"data_updated_at": "2026-09-10T08:00:00+08:00"
}
}
5.3 企业风险评分
/enterprise/risk输出 0-100 的综合风险分(越低越安全)及风险标签。适用于商务合作前的自动尽调。
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
credit_code 或 keyword | 是 | string | 企业定位,同 5.2 |
dimensions | 否 | string | 逗号分隔:judicial,operation,finance,credit,默认全部 |
{
"code": 0,
"message": "success",
"request_id": "req_risk_0031",
"data": {
"credit_code": "91469005MA5T1234XA",
"risk_score": 18,
"risk_level": "低风险",
"items": {
"judicial": { "score": 10, "lawsuits": 0, "dishonest": false },
"operation": { "score": 22, "abnormal": false, "warnings": ["注册资本近一年未实缴到位"] },
"finance": { "score": 15, "tax_arrears": false },
"credit": { "score": 20, "blacklists": [] }
},
"evaluated_at": "2026-09-15T22:10:00+08:00"
}
}
5.4 行业景气指数
/industry/trend返回某行业按月(或按季)的景气指数序列,基准 100,>100 表示景气扩张。
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
industry_code | 是 | string | 国标行业 2 位门类或 4 位大类代码,如 A01 农业 |
start_month | 是 | string | 起始月,格式 YYYY-MM,最多回溯 60 个月 |
end_month | 是 | string | 结束月,不晚于上一自然月 |
granularity | 否 | string | month(默认)/ quarter |
{
"code": 0,
"message": "success",
"request_id": "req_trd_7788",
"data": {
"industry_code": "A01",
"industry_name": "农业",
"granularity": "month",
"series": [
{ "period": "2026-07", "index": 103.4, "yoy": 2.1, "mom": 0.6 },
{ "period": "2026-08", "index": 104.1, "yoy": 2.8, "mom": 0.7 }
]
}
}
5.5 区域经济指标
/region/economy查询行政区划级别的宏观经济指标。区域编码遵循 GB/T 2260,如文昌市为 469005。
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
region_code | 是 | string | 6 位行政区划代码,支持一次一个 |
year | 否 | int | 年份,缺省返回最近一个完整年度 |
indicators | 否 | string | 逗号分隔:gdp,fiscal,population,industry_structure,默认全部 |
curl -G "https://api.wchc888.cn/bigdata/v1/region/economy" \
-H "Authorization: Bearer $TOKEN" \
-d "region_code=469005" -d "year=2025"
{
"code": 0,
"message": "success",
"request_id": "req_reg_2049",
"data": {
"region_code": "469005",
"region_name": "文昌市",
"year": 2025,
"gdp_yi": 342.76,
"gdp_yoy": 6.8,
"fiscal_revenue_yi": 28.15,
"population_wan": 55.8,
"industry_structure": { "primary": 38.2, "secondary": 16.4, "tertiary": 45.4 },
"source": "演示数据 · 非官方统计"
}
}
5.6 舆情情感分析
/nlp/sentiment批量分析文本情感倾向。单次最多 50 条,单条 ≤ 500 字,按成功处理的条数计费。
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
texts | 是 | string[] | 待分析文本数组,1-50 条 |
with_keywords | 否 | boolean | 是否抽取关键词,默认 false |
domain | 否 | string | 领域模型:general(默认)/ ecommerce / news |
curl -X POST "https://api.wchc888.cn/bigdata/v1/nlp/sentiment" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"texts": ["羊绒衫质量很好,穿着很暖和", "物流太慢,包装破损"],
"with_keywords": true,
"domain": "ecommerce"
}'
{
"code": 0,
"message": "success",
"request_id": "req_nlp_9a2c",
"data": {
"results": [
{
"label": "positive", "score": 0.9641,
"probabilities": { "positive": 0.9641, "neutral": 0.0302, "negative": 0.0057 },
"keywords": ["质量", "暖和"]
},
{
"label": "negative", "score": 0.9123,
"probabilities": { "positive": 0.0110, "neutral": 0.0767, "negative": 0.9123 },
"keywords": ["物流", "包装破损"]
}
],
"billed_count": 2
}
}
5.7 数据报告任务(异步)
/report/tasks提交报告生成任务后立即返回 task_id。任务完成或失败时通过 Webhook 回调,也可用轮询接口查询。
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
template_code | 是 | string | 模板:enterprise_profile / region_report / industry_review |
params | 是 | object | 模板入参,如 {"region_code":"469005","year":2025} |
format | 否 | string | pdf(默认)/ xlsx |
callback_url | 否 | string | HTTPS 回调地址,未填则只可轮询 |
# 提交任务
curl -X POST "https://api.wchc888.cn/bigdata/v1/report/tasks" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"template_code": "region_report",
"params": { "region_code": "469005", "year": 2025 },
"format": "pdf",
"callback_url": "https://your-app.example.com/hc-callback"
}'
# 查询状态(GET /report/tasks/{task_id},免费)
curl "https://api.wchc888.cn/bigdata/v1/report/tasks/task_20260917_7f3e" \
-H "Authorization: Bearer $TOKEN"
{
"code": 0,
"message": "success",
"request_id": "req_task_7f3e",
"data": {
"task_id": "task_20260917_7f3e",
"status": "SUCCEEDED",
"progress": 100,
"file_url": "https://files.wchc888.cn/demo/region_469005_2025.pdf",
"file_size": 1048576,
"expire_at": "2026-09-24T00:00:00+08:00"
}
}
06错误码
HTTP 状态码表示传输层结果(200 成功、401 未认证、429 限流、500 服务异常);业务错误通过 code 字段区分:
| code | 含义 | 排查建议 |
|---|---|---|
| 0 | 成功 | — |
| 40001 | AppKey 无效或被禁用 | 检查 key 是否正确、应用是否被停用 |
| 40002 | 签名校验失败 | 核对排序规则、密钥与时间戳偏差 |
| 40003 | access_token 无效或过期 | 重新获取令牌并重放原请求 |
| 40004 | scope 权限不足 | 在控制台为应用开通对应接口权限 |
| 41001 | 缺少必填参数 | 对照接口参数表补齐,message 会指出字段名 |
| 42001 | 参数格式错误 | 检查类型、日期格式与枚举取值 |
| 42002 | 数据不存在 | 企业名/信用代码/区域编码无匹配记录 |
| 42901 | 触发 QPS 限流 | 按 Retry-After 头退避重试,或升级套餐 |
| 42902 | 当日 / 当期配额用尽 | 充值或升级,可先查 /quota/usage |
| 50001 | 平台内部错误 | 携带 request_id 联系技术支持 |
| 50002 | 上游数据源暂不可用 | 指数退避重试,通常数分钟内恢复 |
07限流与配额
| 套餐 | QPS 上限 | 配额 | 并发任务数 | SLA |
|---|---|---|---|---|
| 免费体验版 | 5 | 1,000 次 / 天 | 1 | — |
| 基础版 | 20 | 50 万次 / 月 | 3 | 99.9% |
| 专业版 | 100 | 500 万次 / 月 | 10 | 99.95% |
| 专属集群 | 定制 | 不限 | 定制 | 99.99% |
- 触发限流返回 HTTP 429 + 业务码 42901,响应头
X-RateLimit-Remaining、Retry-After指示剩余额度与建议等待秒数。 - 配额按自然日 / 自然月重置(GMT+8),报告任务按付认费,不占用调用次数。
{
"code": 0, "message": "success", "request_id": "req_qta_0007",
"data": {
"plan": "basic",
"qps_limit": 20,
"daily": { "used": 3120, "limit": 500000, "reset_at": "2026-09-18T00:00:00+08:00" },
"monthly":{ "used": 45201, "limit": 500000, "reset_at": "2026-10-01T00:00:00+08:00" },
"tasks_running": 1
}
}
08Webhook 回调通知
异步任务(报告生成)与账单告警通过 Webhook 推送。要求回调地址为 HTTPS 且 30 秒内响应 2xx。
验签方式
每个回调请求携带 X-HC-Signature 头,其值 = HMAC-SHA256(请求原始 body, AppSecret) 的大写十六进制。消费方须用同样的方式重算并比对,防止伪造回调。
POST /hc-callback HTTP/1.1
Host: your-app.example.com
X-HC-Event: report.completed
X-HC-Signature: 3F9A1C...(演示值)
{
"event": "report.completed",
"event_id": "evt_01hx93kq",
"created_at": "2026-09-17T21:40:12+08:00",
"data": {
"task_id": "task_20260917_7f3e",
"status": "SUCCEEDED",
"file_url": "https://files.wchc888.cn/demo/region_469005_2025.pdf",
"cost": 2.00
}
}
- 事件类型:
report.completed、report.failed、quota.warning(用量达 80%)、quota.exhausted。 - 重试策略:未收到 2xx 时按 1min / 5min / 30min / 2h / 6h 重试共 5 次,之后丢弃;可用 event_id 幂等去重。
- 安全建议:回调处理先验签、再验 event_id 唯一性,业务处理放异步队列。
09SDK 与多语言示例
以下为常用语言的完整调用示例(演示地址,替换为真实地址与密钥即可):
Python(requests)
import requests
BASE = "https://api.wchc888.cn/bigdata/v1"
APP_KEY, APP_SECRET = "hc_demo_9f3ac2", "your_app_secret"
def get_token():
r = requests.post(f"{BASE}/oauth/token",
json={"app_key": APP_KEY, "app_secret": APP_SECRET}, timeout=10)
r.raise_for_status()
return r.json()["data"]["access_token"]
def query_region(code: str, year: int):
headers = {"Authorization": f"Bearer {get_token()}"}
r = requests.get(f"{BASE}/region/economy",
headers=headers, params={"region_code": code, "year": year}, timeout=10)
body = r.json()
if body["code"] != 0:
raise RuntimeError(f'[{body["code"]}] {body["message"]} (request_id={body["request_id"]})')
return body["data"]
if __name__ == "__main__":
print(query_region("469005", 2025))
PHP(cURL,兼容 PHP 7.3+)
<?php
$base = "https://api.wchc888.cn/bigdata/v1";
$appKey = "hc_demo_9f3ac2";
$appSecret = "your_app_secret";
function hcPost($url, array $payload): array {
$ch = curl_init($url);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 15,
CURLOPT_HTTPHEADER => ["Content-Type: application/json"],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_UNESCAPED_UNICODE),
]);
$body = curl_exec($ch);
if ($body === false) { throw new RuntimeException(curl_error($ch)); }
curl_close($ch);
return json_decode($body, true);
}
$token = hcPost("$base/oauth/token",
["app_key" => $appKey, "app_secret" => $appSecret]
)["data"]["access_token"];
$ch = curl_init("$base/enterprise/info?keyword=" . urlencode("海南禾泰水产有限公司"));
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ["Authorization: Bearer {$token}"],
]);
var_dump(json_decode(curl_exec($ch), true));
Node.js(原生 fetch,Node 18+)
const BASE = "https://api.wchc888.cn/bigdata/v1";
const APP_KEY = "hc_demo_9f3ac2";
const APP_SECRET = "your_app_secret";
async function main() {
const tokenRes = await fetch(`${BASE}/oauth/token`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ app_key: APP_KEY, app_secret: APP_SECRET }),
}).then(r => r.json());
const token = tokenRes.data.access_token;
const res = await fetch(`${BASE}/industry/trend?industry_code=A01&start_month=2026-07&end_month=2026-08`, {
headers: { Authorization: `Bearer ${token}` },
}).then(r => r.json());
if (res.code !== 0) throw new Error(`[${res.code}] ${res.message} (${res.request_id})`);
console.table(res.data.series);
}
main().catch(console.error);
Java 11+(HttpClient)
import java.net.URI;
import java.net.http.*;
import java.time.Duration;
public class HcBigDataDemo {
static final String BASE = "https://api.wchc888.cn/bigdata/v1";
static final HttpClient CLIENT = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(10)).build();
public static void main(String[] args) throws Exception {
String tokenReq = "{\"app_key\":\"hc_demo_9f3ac2\",\"app_secret\":\"your_app_secret\"}";
HttpResponse<String> tokenRes = CLIENT.send(HttpRequest.newBuilder()
.uri(URI.create(BASE + "/oauth/token"))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(tokenReq)).build(),
HttpResponse.BodyHandlers.ofString());
String token = tokenRes.body().split("\"access_token\":\"")[1].split("\"")[0];
HttpResponse<String> res = CLIENT.send(HttpRequest.newBuilder()
.uri(URI.create(BASE + "/enterprise/risk?keyword=" +
java.net.URLEncoder.encode("海南禾泰水产有限公司", "UTF-8")))
.header("Authorization", "Bearer " + token)
.GET().build(), HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());
}
}
10最佳实践
- 令牌复用:access_token 缓存至服务端(如 Redis),设 TTL 7100 秒,禁止每请求都取令牌。
- 并发控制:客户端限速为套餐 QPS 的 80%,为突发流量保留余量。
- 超时与重试:连接超时 ≤ 3s、读超时 ≤ 10s;仅重试 42901 与 5xxxx,且带指数退避。
- 日志留痕:完整记录 request_id、接口、入参(脱敏)、耗时与业务码,排障效率提升一个量级。
- 数据缓存:工商 / 区域类数据变化频率低,建议缓存 24 小时,配额消耗可降 70% 以上。
- 密钥安全:AppSecret 只存配置中心或环境变量;泄露立即在控制台重置(旧密钥 10 分钟后失效)。
- 幂等提交:POST 类接口务必携带 X-Idempotency-Key,网络抖动重发不会重复计费。
- 灰度验证:新接入先在免费体验版联调,业务码全量校验通过后再切生产套餐。
11在线调试控制台
选择接口、填入参数即可体验请求与返回全过程。以下均为前端模拟,不发真实网络请求,返回数据为预置的演示 JSON。
API Playground
12常见问题
AppSecret 泄露了怎么办?
返回的数据多久更新一次?
data_updated_at 字段为该条数据的最准更新时间。可以内网部署或私有化吗?
429 限流后应该怎么退避?
接口调用失败会计费吗?
支持批量导出或数据订阅吗?
/dataset/export 批量导出(另计费),或通过 Webhook 订阅每日增量变更。联系商务开通后会在文档中追加对应章节。13更新日志
新增企业风险评分 dimensions 维度筛选;舆情分析新增 ecommerce 领域模型;Webhook 增加 quota.warning 事件。
报告任务支持 xlsx 输出与回调通知;统一响应新增 request_id;错误码拆分 42002(数据不存在)。
新增 HMAC-SHA256 服务端直连签名;分页上限由 50 提升至 100。
开放平台上线,发布企业工商、区域经济、行业景气、舆情分析首批接口。
