文章目录
接口URL
https://hls.videocc.net/service/v1/token
接口说明
(接口调用有频率限制,详细请查看)
- 用于创建 Playsafe Token,这个 token 即是加密视频的播放凭证
- 如果一个token尚未过期,此时使用相同的 videoId、viewerId、viewerIp、iswxa 参数值请求该接口,则会复用原来的token,并延长原token的有效期。
返回结果支持格式
JSON
请求方式
POST
请求数限制
TRUE
请求参数
参数名 | 必选 | 类型 | 说明 |
---|---|---|---|
userId | 是 | string | 用户ID |
videoId | 是 | string | 视频ID,例如 e6b23c6f519c5906e54a13b8200d7bb0_e |
ts | 是 | long | 当前13位毫秒级时间戳,10分钟内有效 |
viewerId | 是 | string | 观看者ID,要求不同的观看者使用不同的ID |
viewerIp | 否 | string | 观看者IP,如果为空,会自动获取调用该接口时的IP |
viewerName | 否 | string | 观看者名称 |
expires | 否 | long | token 有效时长,单位为秒。为空时默认为10分钟。 |
disposable | 否 | boolean | true 表示 token 仅一次有效(验证一次后,token 就失效了)。 false 则表示在有效期内可以多次验证。默认为 false。 |
iswxa | 否 | int | 是否微信小程序播放,1为是,0为否。默认为0。 |
extraParams | 否 | string | 自定义的其它参数 |
sign | 是 | string | 签名,为32位大写的MD5值,详细的签名规则见下文 |
响应成功JSON示例:
{
"code": 200,
"status": "success",
"message": "",
"data": {
"token": "973d7731803940a1b14fdc93941f493c",
"userId": "e6b23c6f51",
"videoId": "e6b23c6f51c4b1cb9f0302a92ed42440_e",
"viewerIp": "127.0.0.1",
"viewerId": "abcd1234",
"viewerName": null,
"extraParams": null,
"ttl": 600000,
"createdTime": 1552446282044,
"expiredTime": 1552446882044,
"iswxa": 0,
"disposable": false
}
}
响应失败JSON示例:
userId 错误
{
"code": 400,
"status": "error",
"message": "user_not_found",
"data": "user secretKey not found."
}
ts 过期
{
"code": 403,
"status": "error",
"message": "ts_expired",
"data": "ts parameter is expired."
}
签名错误
{
"code": 403,
"status": "error",
"message": "sign_invalid",
"data": "sign parameter invalid."
}
响应字段说明
参数名 | 说明 |
---|---|
code | 响应代码,200为成功,403为ts过期或签名错误,400为参数错误(例如缺少 userId 或 videoId) |
status | 成功为success,失败为error |
message | 成功时为空错误时为错误提示消息 |
data | 成功时为token相关数据,失败时为具体的错误提示 |
userId | 用户ID |
videoId | 视频ID,例如 e6b23c6f519c5906e54a13b8200d7bb0_e |
viewerIp | 观看者IP,如果为空,或自动获取调用该接口时的IP |
viewerId | 观看者ID,要求不同的观看者使用不同的ID |
viewerName | 观看者名称 |
extraParams | 自定义的其它参数 |
ttl | token 有效时长,单位为毫秒 |
createdTime | token 创建时间 |
expiredTime | token 过期时间 |
iswxa | 是否微信小程序播放,1为是,0为否。 |
disposable | true 表示 token 仅一次有效(验证一次后,token 就失效了)。false 则表示在有效期内可以多次验证。 |
签名规则
- 将除了 sign 之外的全部 非空 请求参数(也就是说,参数值为空的参数,将排除掉,不参与签名的计算),按字典序升序排列,按“参数名1参数值1参数名2参数值2……”的格式拼接起来,例如:ts1552447784505userIde6b23c6f51videoIde6b23c6f51c4b1cb9f0302a92ed42440_eviewerIdabcd1234viewerIp127.0.0.1
- 在上述字符串的头、尾分别加上 secretKey。以上述字符串、secretKey为abc为例,得到:abcts1552447784505userIde6b23c6f51videoIde6b23c6f51c4b1cb9f0302a92ed42440_eviewerIdabcd1234viewerIp127.0.0.1abc
- 计算上述字符串的MD5值,并转为大写,得到:166D45560D37DDBF0F05081D975231B5
php请求示例
// php
function get_client_ip() {
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
$ipaddress = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
$ipaddress = $_SERVER['REMOTE_ADDR'];
}
return $ipaddress;
}
$userId = 'your userId'; // polyv 提供的服务器间的通讯验证
$secretkey = 'your secretkey'; // polyv 提供的接口调用签名访问的key
$videoId = '65956867df8c717eb79136e05394122c_6'; // 视频对应vid
$ts = time() * 1000; // 时间戳
$viewerIp = get_client_ip(); // 用户 ip
$viewerId = get_viewer_id(); // 自定义用户 id
$viewerName = get_viewer_name(); // 用户昵称, 若值为中文需要urlencode('张三'),可为空
$extraParams = get_extra_params(); // 自定义参数,可为空
/* 将参数 $userId、$secretkey、$videoId、$ts、$viewerIp、$viewerIp、$viewerId、$viewerName、$extraParams
按照ASCKII升序 key + value + key + value ... +value 拼接
*/
$concated = 'extraParams'.$extraParams.'ts'.$ts.'userId'.$userId.'videoId'.$videoId.'viewerId'.$viewerId.'viewerIp'.$viewerIp.'viewerName'.$viewerName;
// 再首尾加上 secretkey
$plain = $secretkey.$concated.$secretkey;
// 取大写MD5
$sign = strtoupper(md5($plain));
// 然后将下列参数用post请求 https://hls.videocc.net/service/v1/token 获取 token
$url = 'https://hls.videocc.net/service/v1/token';
$data = array('userId' => $userId, 'videoId' => $videoId, 'ts' => $ts, 'viewerIp' => $viewerIp, 'viewerName' => $viewerName, 'extraParams' => $extraParams, 'viewerId' => $viewerId, 'sign' => $sign);
$result=post($url, http_build_query($data));
// 获取返回结果的 token, 再传入 playsafe 中播放加密视频
// $token = json_decode($result)->data->token;
$token = json_decode($result)->data->token;
function post($url, $post_data = '', $timeout = 5){
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_POST, 1);
if($post_data != ''){
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
$file_contents = curl_exec($ch);
curl_close($ch);
return $file_contents;
}
java请求示例
public void getPlaysafeToken() throws Exception {
String vid = "a2dc4f25172ed95d020f2816a8a9e9a1_a";
String userId = "your userId"; // 保利威点播账号的userId
String secretkey = "your secretkey"; // 保利威点播账号的secretkey
long ts = System.currentTimeMillis(); // 时间戳
String viewerIp = "127.0.0.1"; // 观众ip
String viewerId = "123456"; // 观众id
String viewerName = "testUser1"; // 观众昵称, 若值为中文需要urlencode('张三')
String extraParams = "HTML5"; // 自定义扩展参数
boolean disposable = false; // true 表示 token 仅一次有效。false 则表示在有效期内可以多次验证。默认为 false。
/* 将参数 userId、secretkey、videoId、ts、viewerIp、viewerIp、viewerId、viewerName、extraParams按照ASCKII升序 key + value + key + value ... +value 拼接
*/
String concated = "extraParams" + extraParams + "ts" + ts + "userId" + userId + "videoId" + vid + "viewerId" + viewerId + "viewerIp" + viewerIp + "viewerName" + viewerName;
// 首尾加上secretkey值
String plain = secretkey + concated + secretkey;
// 取大写MD5,MD5函数请自行选择实现方式
String sign = md5(plain).toUpperCase();
// 然后将下列参数用post请求 https://hls.videocc.net/service/v1/token 获取 token
String url = "http://hls.videocc.net/service/v1/token";
Map<String, String> params = new HashMap<>();
params.put("userId", userId);
params.put("videoId", vid);
params.put("ts", String.valueOf(ts));
params.put("viewerIp", viewerIp);
params.put("viewerName", viewerName);
params.put("extraParams", extraParams);
params.put("viewerId", viewerId);
params.put("sign", sign);
String response = HttpClientUtil.getInstance().sendHttpPost(url, params);
System.out.println(response);
}
通用工具类
https://dev.polyv.net/2020/liveproduct/l-api/rule/live-api-java-detail/