签名机制

参与签名的信息

签名前需要拼接一下签名的原文,包括以下信息:

名称 描述 示例值
HTTPMethod 请求类型,固定为POST,全部大写 POST
Accept 请求响应体类型,固定值 application/json
Content-MD5 与请求Header中相同
Content-Type 请求响应体类型,固定值 application/text; charset=UTF-8
ext 预留字段,暂时为空
Url 请求的路径(不包含域名部分),详情见下面说明

拼接方式:

  1. HTTPMethod + "\n" +
  2. Accept + "\n" +
  3. Content-MD5 + "\n"
  4. Content-Type + "\n" +
  5. ext + "\n" +
  6. Url

注意: 如果除Url以外,信息为空也时需要添加换行符”\n”

拼接结果举例:

  1. POST
  2. application/json
  3. WexLprqKNf8bWCLObiw9Iw==
  4. application/text; charset=UTF-8
  5. /v1/gateway/loan_app.app.stsQuery

签名算法

  1. Mac hmacSha256 = Mac.getInstance("HmacSHA256");
  2. byte[] keyBytes = secret.getBytes("UTF-8");
  3. hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
  4. String sign = new String(Base64.encodeBase64(Sha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));

secret 为 APP 的密钥,联系对接专员获取。

签名错误排查方法

当签名校验失败时,会将服务端的签名前原文放到 HTTP Response 的 Header 中返回到客户端,Key为:X-Ca-Error-Message,只需要将本地计算的签名前原文与服务端返回的签名前原文进行对比即可找到问题;
例如:

  1. X-Ca-Error-Message=Invalid Signature, Server StringToSign:POST#application/json#BF1TIG9npPtL5ynNshx2yQ==#application/text; charset=UTF-8##/v1/gateway/loan_app.app.stsQuery

如果服务端与客户端的签名前原文一致,请检查用于签名计算的密钥是否正确;

注意: 因为 HTTP Header 中无法表示换行,因此签名前原文中的换行符都被过滤掉了,对比时请忽略换行符

FAQ

关于此文档暂时还没有FAQ