# API 接口调用
### 创建URL推流地址API创建推流地址
* * *
> 方法名称
* createPushFlowAddress
> 作用
* 根据用户的需求创建推流和播流地址,是否鉴权、录像(自动、手动)等一系列功能
> 请求URL
* 测试地址: `http://sewise.tinywan.com/openapi/createPushFlowAddress`
* 正式地址 :`http://ssconsole.tinywan.com/openapi/createPushFlowAddress`
> 支持格式
* **JSON**
> HTTP请求方式
* **GET**
> 请求参数
| 编号 | 参数名 | 必选 | 类型 | 说明 |
| --- | --- | --- | --- | --- |
| 1 | Sign | 是 | string | 签名字符串 |
| 2 | AppId | 是 | string | 表示你应用的唯一标识 |
| 3 | DomainName | 是 | string | 您的直播流域名 |
| 4 | AppName | 是 | string | 直播流所属应用名称 |
| 5 | ExpireTime | 否 | string | 推流地址过期时间 |
| 6 | AuthKeyStatus | 是 | string | 是否要鉴权(可选) 1:鉴权,0:不鉴权(默认) |
| 7 | AutoStartRecord | 是 | string | 开启录像(可选) 1:开启,0:不开启(默认) |
| 9 | NotifyUrl | 是 | string | 回调通知URL地址 |
> 响应成功JSON示例:
~~~
{
"status_code": 200,
"msg": "success",
"data": {
"push_flow_address": "rtmp://stream.tinywan.com/live/4001483088068?vhost=tinywan.tinywan.com",
"play_rtmp_address": "rtmp://tinywan.tinywan.com/live/4001483088068",
"play_m3u8_address": "http://tinywan.tinywan.com/live/4001483088068.m3u8",
"streamId": "639"
}
}
~~~
> 响应异常JSON示例:
~~~
{
"status_code": 500102,
"msg": "Did not find what you wanted",
"data": null
}
~~~
> 返回字段说明
| 参数名 | 必选 | 类型 | 说明 |
| --- | --- | --- | --- |
| status\_code | 是 | string | 响应状态码 |
| push\_flow\_address | 否 | string | RTMP推流地址 |
| play\_rtmp\_address | 是 | string | RTMP播放地址 |
| play\_flv\_address | 是 | string | FLV播放地址 |
| play\_m3u8\_address | 是 | string | M3u8播放地址 |
| streamId | 是 | int | 全局唯一标识符 |
* 描述:创建一个可以推流的地址
#### PHP请求示例
* * *
> 注意:请求参数名首字母必须为大写,采用驼峰命名\*\*
~~~
//请求参数
$appId = 13669361192;
$domainName = 'tinywan.tinywan.com';
$appName = 'live';
//签名密钥
$appSecret = 'eb9a365a9d37a1354e13ddd7973d5e02409ef451';
//拼接字符串,注意这里的字符为首字符大小写,采用驼峰命名
$str = "AppId" . $appId . "AppName" . $appName . "DomainName" . $domainName . $appSecret;
//签名串,由签名算法sha1生成
$sign = strtoupper(sha1($str));
//请求资源访问路径以及请求参数,参数名必须为大写
$url = "http://ssconsole.tinywan.com/openapi/createPushFlowAddress?AppId=" . $appId . "&AppName=" . $appName . "&DomainName=" . $domainName . "&Sign=" . $sign;
//CURL方式请求
$ch = curl_init() or die (curl_error());
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 360);
$response = curl_exec($ch);
curl_close($ch);
//返回数据为JSON格式,进行转换为数组打印输出
var_dump(json_decode($response, true));
~~~
#### 签名规则:
* * *
##### 将请求参数按照参数名字典顺序排列,连接参数名与参数值,并在首尾加上appSecret,生成32位大写sha1值,作为sign。以下是示例过程:
> 1、请求参数为:
~~~
$appId = 13669361192;
$domainName = 'tinywan.tinywan.com';
$appName = 'live';
~~~
> 2、将请求参数按照参数名字典顺序排列
~~~
$appId = 13669361192;
$appName = 'live';
$domainName = 'tinywan.tinywan.com';
~~~
> 3、连接字符串连接参数名与参数值,并在首尾加上appSecret,值为:
~~~
eb9a365a9d37a1354e13ddd7973d5e02409ef451
~~~
> 4、拼接后的字符串如下:
~~~
AppId13669361192AppNameliveDomainNametinywan.amai8.comeb9a365a9d37a1354e13ddd7973d5e02409ef451
~~~
> 5、生成签名sign
~~~
248CE36F694A59F4F120D8CACBEA0EC80F41D9F8
~~~
> (仅供测试使用)服务端验证签名封装好的一个签名案例:
~~~
/**
* 服务器签名验证方法
* @param string $appId
* @param array $allParam
* @return bool|string
* @static
*/
protected static function checkApiSign($appId, $allParam)
{
//根据appId查询否存在该用户
$userInfo = User::findFirst(array('nickName = :nickName:', 'bind' => array('nickName' => $appId)));
if (false == $userInfo) return false;
$appSecret = ‘eb9a365a9d37a1354e13ddd7973d5e02409ef451; //sha1()加密
//去除最后的签名
unset($allParam['Sign']);
// 1. 对加密数组进行字典排序
foreach ($allParam as $key => $value) {
$sortParam[$key] = $key;
}
// 2. 字典排序的作用就是防止因为参数顺序不一致而导致下面拼接加密不同
sort($sortParam);
// 3. 将Key和Value拼接
$str = "";
foreach ($sortParam as $k => $v) {
$str = $str . $sortParam[$k] . $allParam[$v];
}
//3.将appSecret作为拼接字符串的后缀,形成最后的字符串
$finalStr = $str . $appSecret;
//4. 通过sha1加密,转化为大写大写获得签名
$sign = strtoupper(sha1($finalStr));
return $sign;
}
~~~