发送加签名的钉钉消息通知

2020-04-11  墨池 

之前发送钉钉群消息通知,设置的安全策略都是“自定义关键字”,而且貌似钉钉接口也并不 care 发送的内容中是否包含关键字的,一直都运行的好好的,过了一个周末,竟然失效了,消息发不出去了。于是又重新阅读了一遍钉钉接口文档,写了个带签名的方法如下,为了方面拿去即用就放在一个 function 中了。

/**
 * 发送带签名的钉钉消息通知
 * 钉钉接口文档地址 https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
 * @param $access_token , 机器人的 Webhook 地址后面的 access_token
 * @param $secret , 密钥,机器人安全设置页面,加签一栏下面显示的 SEC 开头的字符串
 * @param $content ,需要发送的 string
 */
public static function curlHttpPOSTToDingTalk($access_token, $secret, $content)
{
    $url = 'https://oapi.dingtalk.com/robot/send?';

    $body = array(
        "msgtype" => "text",
        "text" => array("content" => $content),
        "at" => array(
            "isAtAll" => true
        )
    );

    $timeStamp = floor(microtime(true) * 1000);//毫秒时间戳

    $stringToSign = $timeStamp . "\n" . $secret;//需要签名的字符串

    // 进行加密操作 并输出二进制数据
    $signature = hash_hmac('sha256', $stringToSign, $secret, true);
    $query = array(
        'access_token' => $access_token,
        'timestamp' => $timeStamp,
        'sign' => base64_encode($signature)
    );
    $absURL = $url . http_build_query($query);
    $handles = curl_init();//初始化CURL句柄
    curl_setopt($handles, CURLOPT_RETURNTRANSFER, 1);//设为TRUE把curl_exec()结果转化为字串,而不是直接输出
    curl_setopt($handles, CURLOPT_URL, $absURL);//设置请求的URL
    curl_setopt($handles, CURLOPT_POST, 1);
    curl_setopt($handles, CURLOPT_HTTPHEADER, array('Content-type: application/json;charset=UTF-8')); //设置头信息
    curl_setopt($handles, CURLOPT_POSTFIELDS, json_encode($body));
    $response = curl_exec($handles);//运行curl
    $info = null;
    if (!curl_errno($handles)) {
        $info = curl_getinfo($handles);
        print_r("Took " . $info['total_time'] . " seconds to send a request to " . $info['url'] . " and http code is " . $info['http_code'] . "\n");
    } else {
        print_r("Curl error: " . curl_error($handles) . "\n");
    }
    curl_close($handles);
    print_r($response . "\n");
}

 
364°/3646 人阅读/0 条评论 发表评论

登录 后发表评论