钉钉开发文档

个人免登场景的签名计算方法

更新时间: 2019-4-23

签名算法为HmacSHA256,签名数据是当前时间戳timestamp,密钥是appId对应的appSecret计算出来的签名值。
发送HTTP请求时需要把signature进行urlencode,如果您使用的是HTTP封装方法,请确保不要重复urlencode。
建议使用官方SDK,SDK中已集成签名算法。

签名参数说明

参数 说明
accessKey 扫码登录应用的appId
timestamp 当前时间戳,单位是毫秒
signature 通过appSecret计算出来的签名值, 该参数值在HTTP请求参数中需要urlEncode(因为签名中可能包含特殊字符+)

签名计算代码示例(Java)

// 根据timestamp, appSecret计算签名值
String stringToSign = timestamp
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(appSecret.getBytes("UTF-8"), "HmacSHA256"));
byte[] signatureBytes = mac.doFinal(stringToSign.getBytes("UTF-8"));
String signature = new String(Base64.encodeBase64(signatureBytes));
String urlEncodeSignature = urlEncode(signature);

签名计算代码示例(PHP)

<?php
    // 根据timestamp, appSecret计算签名值
    $s = hash_hmac('sha256', 'timestamp', 'appSecret', true);
    $signature = base64_encode($s);
    var_dump($signature);
    $urlencode_signature = urlencode($signature);
    var_dump($urlencode_signature);
?>

urlEncode代码示例(Java)

// encoding参数使用utf-8
public static String urlEncode(String value, String encoding) {
    if (value == null) {
        return "";
    }
    try {
        String encoded = URLEncoder.encode(value, encoding);
        return encoded.replace("+", "%20").replace("*", "%2A")
            .replace("~", "%7E").replace("/", "%2F");
    } catch (UnsupportedEncodingException e) {
        throw new IllegalArgumentException("FailedToEncodeUri", e);
    }
}

签名例子参考:

  • timestamp=1546084445901
  • appSecret=testappSecret
  • signature=HCbG3xNE3vzhO+u7qCUL1jS5hsu2n5r2cFhnTrtyDAE=
  • urlEncode后的signature=HCbG3xNE3vzhO%2Bu7qCUL1jS5hsu2n5r2cFhnTrtyDAE%3D

CURL示例

curl 'https://oapi.dingtalk.com/sns/getuserinfo_bycode?signature=xxxxxx&timestamp=1527130370219&accessKey=dingxxxxyyy' -H "Content-Type:application/json" -X POST --data '{"tmp_auth_code":"tmp_auth_code"}'
以上内容是否对您有帮助:
在文档使用中是否遇到以下问题(多选):
  • 内容错误
  • 更新不及时
  • 链接错误
  • 缺少代码/图片示例
  • 太简单/步骤待完善
手机号
更多建议
提交成功,感谢您的反馈!