今天收到一个需求,需要定时去监控业务是否正常稳定,并将错误信息发送到飞书,之前接入过钉钉机器人都比较顺利,但是今天接入飞书居然卡了半天,特此分享给大家,避免踩坑

1,首先创建飞书机器人

在这里插入图片描述

在这里插入图片描述

2.创建完成之后,获取机器人对应的 webhook 地址 格式如下:

https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxx

3.下面提供了三种接入方式

在这里插入图片描述

4.一般都选签名校验,安全性高

在这里插入图片描述
重点来了,这一步之后获取到秘钥,等下签名需要用到,但是官方文档是这样写的

设置签名校验后,向 webhook 发送请求需要签名校验来保障来源可信。所校验的签名需要通过时间戳与秘钥进行算法
加密,即将timestamp + "\n" + 密钥当做签名字符串,使用 HmacSHA256 算法计算签名,再进行 Base64 编码。其中,
timestamp是指距当前时间不超过 1 小时(3600 秒)的时间戳,时间单位:s。例如,1599360473。

按照他的要求,写好代码之后调试,一直报错:{“code”:19021,“data”:{},“msg”:“sign match fail or
timestamp is not within one hour from current time”},官方文档提示错误原因,可能是
1》所使用的时间戳距离发送请求的时间已间隔 1 小时以上,签名已过期。
2》服务器时间与标准时间有较大偏差,导致签名过期。请注意检查、校准你的服务器时间。
3》签名不匹配导致的校验不通过,将返回以下信息。
1和2原因是我打印之后百分百排除了,那么问题一定是签名不一致,后来发现是因为这一句
在这里插入图片描述
因为下面示例代码只有java,go,python,大致一看,以为和钉钉机器人接入方式一样,可能有些同学会跟我一样遇到这个问题,直接将最终代码贴出来:

		这是钉钉机器人代码:
 		$times = time() * 1000;
        $sign_key = self::Sign_key;
        $sign = urlencode(base64_encode(hash_hmac('sha256', $times . "\n" . $sign_key, $sign_key, true)));
        $webhook_url = self::Web_hook . "&timestamp={$times}&sign={$sign}";
        $data = array('msgtype' => 'text', 'text' => array('content' => $msg));
        $data_string = json_encode($data);
        $result = self::posturl($webhook_url, $data_string);

		飞书机器人代码:
		$timestamp = time();
        $stringToSign = $timestamp . "\n" . self::api_key;
        $sign = base64_encode(hash_hmac('sha256', '', $stringToSign, true));
        $client = new Client();

        $data = array(
            'sign' => $sign,
            'timestamp' => $timestamp,
            'msg_type' => 'text',
            'content' => array('text' => "<at user_id=\"all\">所有人</at>{$msg}")
        );
        $response = $client->request('POST', self::api_url, [
            'headers' => [
                'Content-Type' => 'application/json'
            ],
            'json' => $data,
        ]);
        $result = json_decode($response->getBody()->getContents(), true);
看到区别了吗,就是hash_hmac的加密的时候,第二个参数为空
最后终结原因,没理解清楚官方文档的说法,第二对php hash_hmac 函数的用法模糊不清,这里特此记录一下,
希望同样能对你有所帮助。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐