有奖捉虫:办公协同&微信生态&物联网文档专题 HOT

概述

数据开发模块中,消息推送类型可选择自定义推送,将消息推送给第三方服务器。
下图展示了将消息推送给第三方服务器的整个过程:



填写自定义推送配置

1. 登录 物联网开发平台控制台,选择左侧菜单数据开发
2. 单击新建数据流,创建完成之后,单击数据流名称,进入数据流配置。
3. 配置好 “输入节点”、“处理节点” 后,“输出节点” 选择自定义推送
4. 单击自定义推送,在右侧输入“推送标题”、“推送内容”、“接收推送服务器地址”、“鉴权 Token”。
img



验证消息来自物联网开发平台

请求标识

自定义推送消息到第三方服务器时,物联网开发平台将在 HTTP 或 HTTPS 请求中头部增加如下字段:
参数
描述
x-tc-nonce
随机数。
x-tc-signature
x-tc-signature 结合了“添加规则”中填写的 Token 参数和请求中的 x-tc-timestamp 参数、x-tc-nonce 参数。
x-tc-timestamp
时间戳。
1. 将 Token、x-tc-timestamp、x-tc-nonce 三个参数进行字典序排序。
2. 将三个参数字符串拼接成一个字符串进行 sha1 加密。
3. 开发者获得加密后的字符串可与 x-tc-signature 对比,标识该请求来源于物联网开发平台。
检验 x-tc-signature 的 PHP 示例代码如下:
private function checkSignature()
{
$signature = $_GET["x-tc-signature"];
$timestamp = $_GET["x-tc-timestamp"];
$nonce = $_GET["x-tc-nonce"];

$token = TOKEN;
$tmpArr = array($token, $timestamp, $nonce);
sort($tmpArr, SORT_STRING);
$tmpStr = implode( $tmpArr );
$tmpStr = sha1( $tmpStr );

if( $tmpStr == $signature ){
return true;
}else{
return false;
}
}
例如某次请求,相关参数如下,用户设置 Token 为 aaa。
x-tc-nonce: IkOaKMDalrAzUTxC
x-tc-signature: c259ed29ec13ba7c649fe0893007401a36e70453
x-tc-timestamp: 1604458421
排序后的字符串是1604458421IkOaKMDalrAzUTxCaaa,最终计算 sha1 结果为c259ed29ec13ba7c649fe0893007401a36e70453

服务地址校验

1. 当触发一次数据流告警推送时,物联网开发平台将发送一次 GET 请求到填写的服务器地址 URL 上,GET 请求头部增加如下字段:
参数
描述
x-tc-nonce
随机数。
x-tc-signature
x-tc-signature 结合了“添加规则”中填写的 Token 参数和请求中的 x-tc-timestamp 参数、x-tc-nonce 参数。
x-tc-timestamp
时间戳。
echostr
随机字符串。
物联网开发平台向第三方服务发送报文示例:
GET / HTTP/1.1
host: **.**.**.**:4443
user-agent: Go-http-client/1.1
content-type: application/json
echostr: 6a7db17a-90e0-4387-b33e-4dd1578a151b
x-tc-nonce: 624665043113817867
x-tc-signature: abb6c316a8134596d825c5a1295bfa6f7657664d
x-tc-timestamp: 1623149590
accept-encoding: gzip
2. 第三方服务若确认此次 GET 请求来自物联网开发平台,请在 body 中原样返回 echostr 参数内容。 第三方服务回复物联网开发平台报文示例:
HTTP/1.1 200 OK
Date: Tue, 08 Jun 2021 10:53:10 GMT
Content-Length: 16
Content-Type: text/plain; charset=utf-8
6a7db17a-90e0-4387-b33e-4dd1578a151b
GET 请求的 PHP 示例代码如下:
if( $_SERVER['REQUEST_METHOD'] === 'GET'){
$header = get_AllHeaders();
$signature = $header['signature'];
$timestamp = $header['timestamp'];
$nonce = $header['nonce'];
$echostr = $header['echostr'];
#验签成功与否标志 $flag
$flag = checkSignature($signature,$timestamp,$nonce);
if ($flag === true) {
header('Content-Type: text/plain; charset=utf-8');
$len = 'Content-Length: ';
$len .= strlen($echostr);
header($len);
echo $header['echostr'] ;
}else {
echo '验签失败',"\\r\\n";
}
}
3. 物联网开发平台校验返回的 echostr 参数内容,确认服务器地址 URL 是否有效。

推送消息给第三方服务器

满足推送消息条件时,物联网平台会以 POST 方式将消息推送到第三方服务器(注:上述的 GET 请求只是为了校验签名,获取消息需在 POST 请求中获取)。发送的数据为: Header:
参数
描述
x-tc-nonce
随机数。
x-tc-signature
x-tc-signature 结合了“添加规则”中填写的 Token 参数和请求中的 x-tc-timestamp 参数、x-tc-nonce 参数。
x-tc-timestamp
时间戳。
Body:
参数
描述
DeviceName
设备名称。
ProductId
产品 ID。
MsgTitle
推送标题。
MsgContent
推送内容。
RequestId
唯一请求 ID。
Timestamp
时间戳。
POST 请求的 PHP 示例代码如下:
if( $_SERVER['REQUEST_METHOD'] === 'POST') {

$data = file_get_contents('php://input');

echo $data;

// 用户根据自己的业务处理 $data 消息

}