企业微信,实现群机器人监控线上服务报警

  • 背景

    近期在对项目优化过程中
    注意到:当前的报警信息都是通过邮件发送,一方面时效性比较低,另外实现方式比较复杂
    通过同事,了解到 企业微信群机器人 实现起来简洁方便
    在此,记录一下我的实现步骤
    欢迎指摘 …

【注】: 当前为 PHP 实现方式,可根据自己的语言灵活对接

详细描述,请参考开发文档: 【 >>>如何使用群机器人 】

  • 如何使用群机器人
在终端某个群组添加机器人之后,
创建者可以在机器人详情页看的该机器人特有的 webhookurl
开发者可以按以下说明向这个地址发起 HTTP POST 请求,即可实现给该群组发送消息

▷ 前期配置

  • ① 首先 在已创建的企业微信群页面,点击 "添加群机器人"
    操作截图如下:

  • ② 添加完成后,可复制地址,用于业务接口的调用

注意:

一定要保护好机器人的 webhook地址,避免泄漏!不要分享到 github、博客等可被公开查阅的地方,否则坏人就可以用你的机器人来发垃圾消息了。

▷ PHP 代码实现

  • ① 代码接入:微信群消息,封装类 WechatMessageService
class WechatMessageService
{
    /**
     * Note: 企业微信群 机器人消息通知
     * @param string $robot_url webhook地址
     * @param string $content 发送内容
     * @param string $msg_type 消息类型
     * @return mixed|string
     */
    public static function sendWechatRobotMsg($robot_url = '', $content = '' , $msg_type = 'text')
    {
        $post_data = [
            'msgtype' => $msg_type,
            'text' => [
                'content' => $content,
            ],
            'markdown' => [
                'content' => $content,
            ],
        ];

        $result = http_request($robot_url, json_encode($post_data,JSON_UNESCAPED_UNICODE));
        $result_arr = json_decode($result, true);

        $errcode = $result_arr['errcode'] ?? '0'; // 0:成功
        return $errcode;
    }
}
  • ② 调用示例:
    //测试推送消息
	$msg = '你好啊,时间:'.date('Y-m-d H:i:s',time());
	//机器人的 webhook地址
	$robot_url = '替换掉机器人的 webhook地址';
	WechatMessageService::sendWechatMsg($robot_url, $msg); //发送企业微信通知
  • ③ 接口调用,结果:

▷ 附录:

  1. 其他的监控实现,可参考文章:【用企业微信监控线上服务报警】

  2. markdown 类型的样式实现

    当前测试,只是做了最简单的 文字推送,
    可以根据自己的业务需求,阅读开发文档,设计更为合理的 消息类型,
    此处补充一下 markdown类型的消息

    内容拼接举例如下:

    //机器人-测试业务报警
    $content = "**".$title ."**
         > 时间: <font color='warning'>".$curr_dateTime."</font>
         > 内容: <font color='comment'>".$content."</font>";
    

    执行结果如下:

在这里插入图片描述

  1. 公共方法,补充一下方便参考使用:
function http_request($url, $data = null, $header = [])
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);

        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_CUSTOMREQUEST, "POST");
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
  1. 此处提供一下,鄙人自行封装的日志报警公共方法
    可根据自己的业务需求,进行扩展
/**
 * 公共方法 :错误日志报警
 * @param string $title 标题
 * @param string $content 报警内容
 * @param int $error_rank 错误等级 (企业微信群机器人)1:结算业务报警;2:计划任务报警;3:其他待定报警
 */
function errorLogToAlarmMonitoring($error_rank = 0,$title = '',$content = ''){
    $curr_dateTime = date('Y-m-d H:i:s',time());
    //TODO 记录报错日志
    $log_error_content = $title.' : '.$content;
    Log::error($log_error_content);


    switch ($error_rank){
        case 0:
            //常见业务报警
            break;
        case 1:
            //结算业务报警
            $content = $title.$content;
            WechatMessageService::sendWechatRobotMsg('可替换的企业群机器人 webhook 地址', $content);
            break;
        case 2:
            //机器人-测试业务报警
            $content = "**".$title ."**
                > 时间: <font color='warning'>".$curr_dateTime."</font>
                > 内容: <font color='comment'>".$content."</font>";
            WechatMessageService::sendWechatRobotMsg('可替换的企业群机器人 webhook 地址2', $content,'markdown');
            break;
        default:
        	// TODO 其他报警业务,可自行扩展
            break;
    }
}
<think>好的,用户现在问的是“服务端回调”是什么。首先,我需要回想一下之前的对话历史。用户之前问过Flutter如何上传崩溃日志到服务器,我详细解释了步骤,包括捕获异常、上传逻辑、本地缓存等。现在这个问题转向服务端回调,可能是在之前的上传过程中需要服务器返回确认或者进一步处理,所以需要理解回调的概念。 用户可能是开发人员,可能正在搭建一个系统,需要服务器之间的通信,或者在前端和后端交互时有某种异步通知的需求。比如上传崩溃日志后,服务器处理完可能需要通知客户端,或者第三方服务处理完后通知他们的服务器,这时候就需要回调机制。 接下来要确定用户的理解水平。他们可能对HTTP请求、API交互有基本了解,但回调可能是一个新概念。需要从基本定义入手,用简单易懂的例子说明。例如,支付完成后第三方支付平台通知商家的服务器,这就是回调的典型应用场景。 还要考虑用户可能的实际应用场景。比如在之前的崩溃日志上传中,是否需要在服务器处理完日志后通知客户端?或者用户可能在开发需要第三方服务集成的应用,比如微信支付、OAuth登录等,这些都会用到服务端回调。 需要解释清楚回调的工作原理,同步和异步的区别,以及如何实现。可能还需要提到实现回调的注意事项,比如安全性(验证请求来源)、重试机制、日志记录等,这些都是在实际开发中容易遇到的问题。 另外,用户可能想知道回调的实际应用案例,比如Webhook、支付通知、OAuth授权,这些都可以作为例子帮助理解。同时,对比同步回调(阻塞式)和异步回调(非阻塞式)的不同适用场景,帮助用户根据需求选择合适的类型。 最后,确保回答结构清晰,分点说明,让用户逐步理解。可能需要用比喻,比如“打电话留语音信箱后对方回电”来形象说明回调的概念。同时,强调回调在解耦和异步通信中的重要性,帮助用户认识到其价值。</think>以下是关于服务端回调的详细解释: --- ### 一、基本概念 **服务端回调(Server Callback)** 是一种跨系统通信机制,核心流程为: ``` 客户端/服务A 发起请求 → 服务B处理请求 → 服务B通过预设地址(回调URL)主动通知 → 客户端/服务A接收结果 ``` 类比场景:打电话时对方不在,你留下电话号码让对方回拨(回调的本质是**反向通知**) --- ### 二、核心特征 #### 1. 异步通信模式 ```dart // 伪代码示例(同步 vs 异步) void syncRequest() { // 同步等待响应 var result = await http.get('api/getData'); process(result); // 必须等待结果才能执行 } void asyncCallback() { // 异步回调模式 http.post('api/submitTask', body: { 'callback_url': 'https://yourserver.com/callback' }); // 立即继续执行其他操作... } // 单独的回调处理接口 void handleCallback(Map data) { // 收到服务B的通知后才处理结果 } ``` #### 2. 典型应用场景 - **支付系统**:微信/支付宝支付结果通知 - **文件处理**:视频转码完成后通知 - **IoT设备**:设备状态变更上报 - **第三方登录**:OAuth授权结果返回 --- ### 三、技术实现要点 #### 1. 基础架构 ```mermaid sequenceDiagram participant A as 客户端/服务A participant B as 服务B A->>B: 1.请求+回调URL B->>B: 2.处理业务逻辑 B->>A: 3.POST回调结果到URL A->>A: 4.验证并处理回调 ``` #### 2. 必选组件 | 组件 | 作用说明 | |------------------|---------------------------------| | 回调URL | 接收通知的API接口地址 | | 数字签名 | 验证请求来源合法性 | | 幂等处理 | 防止重复通知造成数据错误 | | 重试队列 | 确保网络波动时的可靠送达 | --- ### 四、实际案例解析(以支付回调为例) ```dart // 1. 客户端发起支付请求 void startPayment() async { final response = await http.post( 'https://payment-gateway.com/pay', body: { 'amount': '100.00', 'callback_url': 'https://your-server.com/payment-callback' } ); } // 2. 服务实现回调接口 @Post('/payment-callback') void handlePaymentCallback(Map<String,dynamic> params) { // 验证签名(伪代码) if (!_verifySign(params['sign'], API_SECRET)) { throw Exception('非法请求'); } // 更新订单状态 if (params['status'] == 'SUCCESS') { _updateOrderStatus(params['order_id'], PAID); } // 必须返回成功标识(否则支付平台会重试) return {'code': 200}; } ``` --- ### 五、关键注意事项 1. **安全验证** - 使用HMAC-SHA256签名验证 - 白名单IP过滤 - 非对称加密传输 2. **可靠性保障** ```python # 伪代码:带重试机制的回调 def send_callback(data): max_retries = 3 for attempt in range(max_retries): try: response = requests.post(callback_url, json=data) if response.ok: break except Exception as e: if attempt == max_retries-1: queue.save(data) # 进入死信队列人工处理 ``` 3. **性能优化** - 使用消息队列削峰填谷(如RabbitMQ/Kafka) - 采用二进制协议(如gRPC)提升传输效率 --- ### 六、扩展应用 **Webhook机制**: 本质上是一种标准化的回调实现,广泛应用于: - GitHub代码提交通知 - 钉钉/企业微信机器人 - CI/CD流水线触发 - 云服务监控报警 --- 通过服务端回调机制,可以实现不同系统间的松耦合通信,特别适合处理需要异步响应的长时业务操作。实际开发中要特别注意安全验证和异常处理,建议使用成熟的API网关或云函数(如AWS Lambda)来简化实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值