首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >照片人身核验使用v3鉴权接口签名总是签名失败,很急已经要疯掉了?

照片人身核验使用v3鉴权接口签名总是签名失败,很急已经要疯掉了?

提问于 2019-11-07 14:07:24
回答 1关注 0查看 545
代码语言:javascript
复制
public static void main(String[] args) throws Exception {
  String service = "faceid";
  //String host = "faceid.tencentcloudapi.com";//人脸检测与分析功能请求域名
  String host = "faceid.ap-shanghai-fsi.tencentcloudapi.com"; //照片人脸核身
  String region = "ap-shanghai-fsi"; //公共参数 可不填写
  String action = "ImageRecognition";  //公共参数 接口名称
  String version = "2018-03-01"; //公共参数 当前日期
  String algorithm = "TC3-HMAC-SHA256"; //签名算法
  //String timestamp = "1551113065";  //
  String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
  SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
  // 注意时区,否则容易出错
  sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
  String date = sdf.format(new Date(Long.valueOf(timestamp + "000")));

  // ************* 步骤 1:拼接规范请求串 *************
  String httpRequestMethod = "POST";
  String canonicalUri = "/";
  String canonicalQueryString = "";
  String canonicalHeaders = "content-type:application/json;charset=utf-8\n" + "host:" + host + "\n";
  String signedHeaders = "content-type;host";

  String name = URLEncoder.encode("", "utf-8");
  String payload = "{\"Action\":\"ImageRecognition\",\"IdCard\":\"\",\"Name\":\"\",\"ImageBase64\":\"\"}";
  String hashedRequestPayload = sha256Hex(payload);
  String canonicalRequest = httpRequestMethod + "\n" + canonicalUri + "\n" + canonicalQueryString + "\n"
      + canonicalHeaders + "\n" + signedHeaders + "\n" + hashedRequestPayload;
  System.out.println(canonicalRequest);

  // ************* 步骤 2:拼接待签名字符串 *************
  String credentialScope = date + "/" + service + "/" + "tc3_request";
  String hashedCanonicalRequest = sha256Hex(canonicalRequest);
  String stringToSign = algorithm + "\n" + timestamp + "\n" + credentialScope + "\n" + hashedCanonicalRequest;
  System.out.println(stringToSign);

  // ************* 步骤 3:计算签名 *************
  byte[] secretDate = hmac256(("TC3" + SECRET_KEY).getBytes(UTF8), date);
  byte[] secretService = hmac256(secretDate, service);
  byte[] secretSigning = hmac256(secretService, "tc3_request");
  String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase();
  System.out.println("signature:"+signature);

  // ************* 步骤 4:拼接 Authorization *************
  String authorization = algorithm + " " + "Credential=" + SECRET_ID + "/" + credentialScope + "," + "SignedHeaders=" + signedHeaders + "," + "Signature=" + signature;
  System.out.println("authorization:"+authorization);

  TreeMap<String, String> headers = new TreeMap<String, String>();
  headers.put("Authorization", authorization);
  headers.put("Content-Type", CT_JSON);
  headers.put("Host", host);
  headers.put("X-TC-Action", action);
  headers.put("X-TC-Timestamp", timestamp);
  headers.put("X-TC-Version", version);
  headers.put("X-TC-Region", region);

  StringBuilder sb = new StringBuilder();
  sb.append("curl -X POST https://").append(host)
      .append(" -H \"Authorization: ").append(authorization).append("\"")
      .append(" -H \"Content-Type: application/json;charset=utf-8\"")
      .append(" -H \"Host: ").append(host).append("\"")
      .append(" -H \"X-TC-Action: ").append(action).append("\"")
      .append(" -H \"X-TC-Timestamp: ").append(timestamp).append("\"")
      .append(" -H \"X-TC-Version: ").append(version).append("\"")
      .append(" -H \"X-TC-Region: ").append(region).append("\"")
      .append(" -d '").append(payload).append("'");
  System.out.println(sb.toString());
}

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档