API根地址: https://api.wangdiangongju.com


请求方式: 均采用 POST

  1. appKey: 应用Key,参见用户中心,长度通常为10位
  2. appSecret: 密钥,参见用户中心,长度固定32位,自行保管好,严禁泄露,否则后果自负
  3. timestamp: 毫秒时间戳,鉴权会验证,前后10分钟内有效
  4. sign: 签名串,详见下方签名算法

参数 appKeytimestampsign 需放在请求头中传递

数据体采用请求体body形式传递,统一为JSON格式,示例如下:

{
   "itemLink": "商品链接",
   "keyword": "关键词",
   "wangwang": "tb1234567890"
}

签名算法:

  1. 数据体转成字符串,key根据字典序顺序排序,然后按照 key1+value1+key2+value2... 转化为字符串,针对null数据,同样保留
    上述示例数据将会拼接为 itemLink商品链接keyword关键词wangwangtb1234567890

  2. 拼接appKey、接口地址、appSecret、timestamp、data, 其中接口地址为完整的地址去掉前面的服务地址
    如照妖镜验号的完整接口地址为 https://api.wangdiangongju.com/api/wangwang/check ,则此处用于签名的接口地址为 /api/wangwang/check

  3. 将拼接好的数据串进行MD5加密,得到签名sign

Java签名以及接口调用示例(基于java11)

import com.alibaba.fastjson.JSON;
import org.apache.commons.codec.digest.DigestUtils;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.Map;
import java.util.TreeMap;

public class Api {
   public void api() throws IOException, InterruptedException {
      String host = "https://api.wangdiangongju.com";
      String apiUrl = "/api/wangwang/check";
      String appKey = "1000012345";
      String appSecret = "AbcdEfgH01234567AbcdEfgH01234567";
      long timestamp = System.currentTimeMillis();

      Map<String, Object> bodyData = new TreeMap<>();
      bodyData.put("wangwang", "12412341235");

      StringBuilder dataStr = new StringBuilder();
      for (Map.Entry<String, Object> entry : bodyData.entrySet()) {
         dataStr.append(entry.getKey()).append(entry.getValue());
      }
      String sign = DigestUtils.md5Hex((appKey + apiUrl + appSecret + timestamp + dataStr)
              .getBytes(StandardCharsets.UTF_8));

      HttpRequest request = HttpRequest.newBuilder()
              .uri(URI.create(host + apiUrl))
              .timeout(Duration.ofSeconds(300))
              .setHeader("Content-Type", "application/json")
              .setHeader("appKey", appKey)
              .setHeader("timestamp", String.valueOf(timestamp))
              .setHeader("sign", sign)
              .POST(HttpRequest.BodyPublishers.ofString(JSON.toJSONString(bodyData)))
              .build();

      HttpClient client = HttpClient.newBuilder()
              .version(HttpClient.Version.HTTP_1_1)
              .followRedirects(HttpClient.Redirect.ALWAYS)
              .connectTimeout(Duration.ofSeconds(5))
              .build();

      HttpResponse<byte[]> response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
      String responseStr = new String(response.body(), StandardCharsets.UTF_8);

      JSONObject responseJSON = JSON.parseObject(responseStr);
      boolean success = responseJSON.getBooleanValue("success");
      int code = responseJSON.getIntValue("code");
      String message = responseJSON.getString("message");
      Object data = responseJSON.get("data");
   }
}

返回数据结构示例:

{
   //success表示本次请求是否成功,bool类型
   "success": true,
   //code为请求状态值,0表示成功,其他表示失败,具体参见下方错误码表格,int类型
   "code": 0,
   //message表示失败消息,会返回对应错误原因,string类型
   "message": null,
   //timestamp为当前时间戳,long型
   "timestamp": 1682600000000,
   //具体的数据体,可以是map,可以是list
   "data": {}
}

错误码说明:

code描述
100000系统异常,请联系客服处理
100001appKey异常
100002appKey非法
100003签名参数异常
100004时间非法
100005API权限已停用
100006IP受限
100007API参数有误
100008签名验证未通过
100101该API不存在或已停用
100102该API当前处于维护中,暂不可用
100103您当前已关闭该API
100104API的消耗积分配置有误,请联系客服
100105积分不足
100201非法调用
100202请求参数非法
200001排名查询失败
300001旺旺不存在