钉钉 - 机器人消息推送(签名版)

发布于:2025-06-06 ⋅ 阅读:(19) ⋅ 点赞:(0)

前言

在日常生活中,我们可能会遇到某些异常发生后需要紧急通知到群里,让相关人员看到紧急处理的事件触发机制。 消息群我采用的是钉钉推送,本文介绍了如何用php 推送钉钉机器人消息。

源码封装

<?php
/**
 * 钉钉通知 - 签名版
 */
class DingDingNoticeSign
{
    /**
     * 钉钉access_token 创建机器人时获得
     *
     * @var string
     */
    protected $accessToken;

    /**
     * 钉钉签名 类型为签名内容可获取
     *
     * @var string
     */
    protected $sign;

    public function __construct($accessToken,$sign)
    {
        $this->accessToken = $accessToken;
        $this->sign = $sign;
    }

    public function sendMsg($msg)
    {
        $this->sendDingMessage($this->structApiUrl(),$this->sign,$msg);
    }

    protected function generateSign($timestamp, $secret) {
        return urlencode(base64_encode(hash_hmac('sha256', $timestamp . "\n" . $secret, $secret, true)));
    }

    protected function sendDingMessage($webhookUrl, $secret, $message) {
        $timestamp = time() * 1000; // 当前时间戳
        $sign = $this->generateSign($timestamp, $secret); // 生成签名
        $headers = [
            'Content-Type: application/json;charset=utf-8;'
        ];
        $body = json_encode([
            'msgtype' => 'text', // 消息类型,例如 text, markdown 等
            'text' => [
                'content' => $message // 消息内容
            ]
        ]);
        $webhookUrl.="&timestamp={$timestamp}&sign={$sign}";
//        dd($webhookUrl);

        $options = [
            CURLOPT_URL => $webhookUrl,
            CURLOPT_POST => true,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_SSL_VERIFYPEER => false, // 注意:实际使用中应设置为 true 以增强安全性,此处为示例简化设置
            CURLOPT_POSTFIELDS => $body,
            CURLOPT_HTTPHEADER => $headers
        ];
        $ch = curl_init();
        curl_setopt_array($ch, $options);
        $response = curl_exec($ch);
//        if ($response === false) {
            echo 'Curl error: ' . curl_error($ch);
//        } else {
            echo 'Response: ' . $response;
//        }
        curl_close($ch);
    }

    protected function structApiUrl()
    {
        $url = "https://oapi.dingtalk.com/robot/send";
        $query = [
            'access_token'  =>  $this->accessToken
        ];
        $url = "{$url}?".http_build_query($query);

        return $url;
    }
}

如何使用?(见下文)

 //钉钉消息通知
 $accessToken = "xxxxxxxxxxxxxx";//access_token 创建机器人时获得的参数 get param中的access_token
 $sign = "xxxxxxxxxxxxx";//sign  选择为签名时获得的参数
 $dingdingService = new DingDingNoticeSign($accessToken,$sign);
 $dingdingService->sendMsg("我是消息通知");

很简单吧,内容封装好了,直接拿下来使用即可


网站公告

今日签到

点亮在社区的每一天
去签到