今天收到一个需求,需要定时去监控业务是否正常稳定,并将错误信息发送到飞书,之前接入过钉钉机器人都比较顺利,但是今天接入飞书居然卡了半天,特此分享给大家,避免踩坑
1,首先创建飞书机器人
2.创建完成之后,获取机器人对应的 webhook 地址 格式如下:
https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxx
3.下面提供了三种接入方式
4.一般都选签名校验,安全性高
重点来了,这一步之后获取到秘钥,等下签名需要用到,但是官方文档是这样写的文章来源:https://www.toymoban.com/news/detail-844894.html
设置签名校验后,向 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,大致一看,以为和钉钉机器人接入方式一样,可能有些同学会跟我一样遇到这个问题,直接将最终代码贴出来:文章来源地址https://www.toymoban.com/news/detail-844894.html
这是钉钉机器人代码:
$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 . "×tamp={$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 函数的用法模糊不清,这里特此记录一下,
希望同样能对你有所帮助。
到了这里,关于php对接飞书自定义机器人发送消息功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!