Java调用企查查API查询企业信息:从入门到实践指南
2025.09.25 23:57浏览量:0简介:本文详细介绍如何使用Java调用企查查API实现企业信息查询,涵盖API接入准备、核心代码实现、异常处理及优化建议,帮助开发者快速构建高效稳定的企业信息查询服务。
一、企查查API概述与接入准备
企查查作为国内领先的企业信息查询平台,其API接口为开发者提供了结构化的企业数据服务,涵盖工商信息、股东信息、法律诉讼等200+数据维度。开发者通过API调用可实现自动化数据获取,相比网页爬虫具有更高的稳定性和合规性。
1.1 API接入流程
- 账号注册与认证:访问企查查开放平台完成企业级账号注册,提交营业执照等资质文件完成实名认证
- 应用创建:在控制台创建API应用,获取唯一的AppKey和AppSecret
- 权限配置:根据业务需求选择所需接口(如基础信息查询、司法风险查询等),配置IP白名单
- 服务购买:选择适合的套餐包(按调用次数计费或包年包月),完成线上支付
1.2 技术要求
- JDK 1.8+ 环境
- HTTP客户端库(推荐OkHttp或Apache HttpClient)
- JSON解析库(Jackson或Gson)
- 稳定的网络环境(建议使用企业专线)
二、Java实现核心代码解析
2.1 基础请求框架搭建
public class QccApiClient {
private static final String BASE_URL = "https://api.qcc.com";
private String appKey;
private String appSecret;
private OkHttpClient httpClient;
public QccApiClient(String appKey, String appSecret) {
this.appKey = appKey;
this.appSecret = appSecret;
this.httpClient = new OkHttpClient.Builder()
.connectTimeout(30, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build();
}
// 后续方法将在此类中实现
}
2.2 签名生成算法
企查查API采用HMAC-SHA256签名机制,核心实现如下:
private String generateSign(Map<String, String> params) throws Exception {
// 1. 参数排序
List<String> keys = new ArrayList<>(params.keySet());
keys.sort(String::compareTo);
// 2. 拼接字符串
StringBuilder sb = new StringBuilder();
for (String key : keys) {
if (!"sign".equals(key) && params.get(key) != null) {
sb.append(key).append("=").append(params.get(key)).append("&");
}
}
sb.append("key=").append(appSecret);
// 3. HMAC-SHA256加密
Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
SecretKeySpec secret_key = new SecretKeySpec(appSecret.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
sha256_HMAC.init(secret_key);
byte[] bytes = sha256_HMAC.doFinal(sb.toString().getBytes(StandardCharsets.UTF_8));
return Base64.getEncoder().encodeToString(bytes);
}
2.3 企业基础信息查询实现
public QccEnterpriseInfo getEnterpriseInfo(String keyword) throws IOException {
// 1. 构建请求参数
Map<String, String> params = new HashMap<>();
params.put("keyWord", keyword);
params.put("appKey", appKey);
params.put("timestamp", String.valueOf(System.currentTimeMillis()));
params.put("sign", generateSign(params));
// 2. 构建请求URL
HttpUrl.Builder urlBuilder = HttpUrl.parse(BASE_URL + "/open/api/v2/enterprise/getInfo").newBuilder();
params.forEach((k, v) -> urlBuilder.addQueryParameter(k, v));
String url = urlBuilder.build().toString();
// 3. 发送请求
Request request = new Request.Builder()
.url(url)
.get()
.build();
try (Response response = httpClient.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 4. 解析响应
String responseBody = response.body().string();
QccResponse<QccEnterpriseInfo> qccResponse =
new ObjectMapper().readValue(responseBody,
new TypeReference<QccResponse<QccEnterpriseInfo>>() {});
if (qccResponse.getStatus() != 200) {
throw new RuntimeException("API Error: " + qccResponse.getMessage());
}
return qccResponse.getResult();
}
}
三、高级功能实现与优化
3.1 批量查询优化
采用异步HTTP客户端实现并发查询:
public List<QccEnterpriseInfo> batchQuery(List<String> keywords) throws InterruptedException {
ExecutorService executor = Executors.newFixedThreadPool(10);
List<CompletableFuture<QccEnterpriseInfo>> futures = new ArrayList<>();
for (String keyword : keywords) {
CompletableFuture<QccEnterpriseInfo> future = CompletableFuture.supplyAsync(() -> {
try {
return getEnterpriseInfo(keyword);
} catch (IOException e) {
throw new RuntimeException(e);
}
}, executor);
futures.add(future);
}
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
return futures.stream()
.map(CompletableFuture::join)
.collect(Collectors.toList());
}
3.2 缓存策略设计
建议采用两级缓存架构:
- 本地缓存:使用Caffeine实现分钟级缓存
LoadingCache<String, QccEnterpriseInfo> cache = Caffeine.newBuilder()
.maximumSize(1000)
.expireAfterWrite(10, TimeUnit.MINUTES)
.build(this::getEnterpriseInfoFromApi);
- 分布式缓存:Redis存储小时级数据,设置TTL为1小时
3.3 异常处理机制
public QccEnterpriseInfo safeQuery(String keyword) {
try {
return getEnterpriseInfo(keyword);
} catch (SocketTimeoutException e) {
// 网络超时重试
return retryQuery(keyword, 2);
} catch (QccApiException e) {
// API限流处理
if (e.getCode() == 429) {
waitAndRetry(e.getRetryAfter());
return safeQuery(keyword);
}
throw e;
} catch (Exception e) {
log.error("Query failed for keyword: {}", keyword, e);
throw new RuntimeException("System error");
}
}
四、最佳实践与注意事项
4.1 调用频率控制
- 基础接口:建议QPS≤10
- 高级接口:需申请提高配额
- 实现指数退避算法处理限流
4.2 数据安全
- 敏感字段(如联系方式)需脱敏处理
- 遵守《个人信息保护法》相关条款
- 建立数据访问日志审计机制
4.3 性能优化
- 启用HTTP/2协议
- 使用连接池管理HTTP连接
- 对静态参数(如appKey)进行缓存
五、完整示例项目结构
qcc-api-demo/
├── src/main/java/
│ ├── config/ # 配置类
│ ├── dto/ # 数据传输对象
│ ├── exception/ # 自定义异常
│ ├── service/ # 业务逻辑
│ └── util/ # 工具类
├── src/main/resources/
│ └── application.yml # 配置文件
└── pom.xml # Maven依赖
六、常见问题解决方案
签名验证失败:
- 检查系统时间是否同步
- 确认参数排序规则
- 验证密钥是否泄露
返回数据为空:
- 检查企业名称是否准确
- 确认是否购买对应数据包
- 尝试使用统一社会信用代码查询
连接被拒绝:
- 检查防火墙设置
- 确认IP白名单配置
- 测试网络连通性
通过以上系统化的实现方案,开发者可以快速构建稳定的企业信息查询服务。实际开发中建议先在测试环境验证API调用,再逐步迁移到生产环境。同时关注企查查API的版本更新,及时调整实现逻辑以兼容新特性。
发表评论
登录后可评论,请前往 登录 或 注册