|
@@ -0,0 +1,168 @@
|
|
|
+package com.qunzhixinxi.hnqz.admin.util;
|
|
|
+
|
|
|
+import cn.hutool.core.text.CharSequenceUtil;
|
|
|
+import cn.hutool.crypto.digest.DigestUtil;
|
|
|
+import cn.hutool.http.HttpUtil;
|
|
|
+import cn.hutool.json.JSONObject;
|
|
|
+import cn.hutool.json.JSONUtil;
|
|
|
+import com.qunzhixinxi.hnqz.common.core.exception.BizException;
|
|
|
+import lombok.experimental.UtilityClass;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.ZoneOffset;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 企查查工具类
|
|
|
+ *
|
|
|
+ * @author jimmy
|
|
|
+ * @date 07/07/2024 16:09
|
|
|
+ */
|
|
|
+@UtilityClass
|
|
|
+public class QccUtils {
|
|
|
+
|
|
|
+ private static final String API_KEY = "8476fff7305911eea3f10c42a106ce72";
|
|
|
+ private static final String SECRET_KEY = "CZMXHE8RQ59LWHFEHVM93HWPKF7GD7PM";
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取企业工商信息详情
|
|
|
+ *
|
|
|
+ * @param searchKey 关键字
|
|
|
+ * @return 信息详情
|
|
|
+ */
|
|
|
+ public static JSONObject getECIInfo(String searchKey) {
|
|
|
+
|
|
|
+ String basePath = "https://pro.qcc.com/api/yj/ECIInfoVerify/GetInfo";
|
|
|
+
|
|
|
+ // 校验参数
|
|
|
+ checkSearchKey(searchKey);
|
|
|
+
|
|
|
+ // 执行
|
|
|
+ String result = execute(basePath, searchKey);
|
|
|
+
|
|
|
+ // 解析结果
|
|
|
+ return parseResult(result);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 执行
|
|
|
+ *
|
|
|
+ * @param url 地址
|
|
|
+ * @param searchKey 关键字
|
|
|
+ * @return 执行结果
|
|
|
+ */
|
|
|
+ private static String execute(String url, String searchKey) {
|
|
|
+ // 封装头
|
|
|
+ Map<String, String> headers = buildHeader();
|
|
|
+
|
|
|
+ // 封装参数
|
|
|
+ Map<String, Object> params = buildParams(searchKey);
|
|
|
+
|
|
|
+ // 发起请求
|
|
|
+ return exec(url, headers, params);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建头信息
|
|
|
+ *
|
|
|
+ * @return 头信息
|
|
|
+ */
|
|
|
+ private static Map<String, String> buildHeader() {
|
|
|
+
|
|
|
+ // 时间戳
|
|
|
+ String timespan = String.valueOf(LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")));
|
|
|
+
|
|
|
+ // 获取token
|
|
|
+ String token = getToken(timespan);
|
|
|
+
|
|
|
+ // 头信息
|
|
|
+ Map<String, String> headers = new HashMap<>(1);
|
|
|
+ headers.put("Token", token);
|
|
|
+ headers.put("Timespan", timespan);
|
|
|
+ return headers;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 请求
|
|
|
+ *
|
|
|
+ * @param basePath 路径
|
|
|
+ * @param header 头信息
|
|
|
+ * @param params 参数
|
|
|
+ * @return 请求结果
|
|
|
+ */
|
|
|
+ private static String exec(String basePath, Map<String, String> header, Map<String, Object> params) {
|
|
|
+ return HttpUtil.createGet(basePath).addHeaders(header).form(params).execute().body();
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 构建参数
|
|
|
+ *
|
|
|
+ * @param searchKey 关键字
|
|
|
+ * @return 参数列表
|
|
|
+ */
|
|
|
+ private static Map<String, Object> buildParams(String searchKey) {
|
|
|
+ Map<String, Object> params = new HashMap<>(2);
|
|
|
+ params.put("searchKey", searchKey);
|
|
|
+ params.put("key", API_KEY);
|
|
|
+ return params;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 校验关键字
|
|
|
+ *
|
|
|
+ * @param searchKey 关键字
|
|
|
+ */
|
|
|
+ private void checkSearchKey(String searchKey) {
|
|
|
+ if (CharSequenceUtil.isBlank(searchKey)) {
|
|
|
+ throw new BizException("搜索关键字必填");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获取token
|
|
|
+ *
|
|
|
+ * @param timespan 时间戳
|
|
|
+ * @return token
|
|
|
+ */
|
|
|
+ private String getToken(String timespan) {
|
|
|
+ String plainText = String.format("%s%s%s", API_KEY, timespan, SECRET_KEY);
|
|
|
+
|
|
|
+ String md5Hex1 = DigestUtil.md5Hex(plainText);
|
|
|
+
|
|
|
+ return md5Hex1.toUpperCase();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private static JSONObject parseResult(String result) {
|
|
|
+ boolean json = JSONUtil.isJson(result);
|
|
|
+
|
|
|
+ if (!json) {
|
|
|
+ throw new BizException("结果格式不是JSON不能解析");
|
|
|
+ }
|
|
|
+
|
|
|
+ return JSONUtil.parseObj(result);
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private static boolean ok(JSONObject parsed) {
|
|
|
+ return "200".equals(getCode(parsed));
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String getCode(JSONObject parsed) {
|
|
|
+ return parsed.getStr("Status");
|
|
|
+ }
|
|
|
+
|
|
|
+ private static JSONObject getResult(JSONObject parsed) {
|
|
|
+ return parsed.getJSONObject("Result");
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String getMessage(JSONObject parsed) {
|
|
|
+ return String.format("%s,【Status】:%s", getCode(parsed), parsed.getStr("Message"));
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|