之前发送钉钉群消息通知,设置的安全策略都是“自定义关键字”,而且貌似钉钉接口也并不 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"); }