我根据MTS签名机制的帮助文档编写了下面代码,但是进行请求的时候返回
"The request signature does not conform to Aliyun standards."
查过很多资料,也把官方文档的数据带入到我的代码中,验证是通过的
但是带入实际信息进行测试的时候还是会报错.
下面是我的PHP代码,已带入官方实例参数,验证得到的signature与文档中的一致.
<?php
//创建随机UUID,接受string的前缀
function create_uuid($prefix = ""){
$str = md5(uniqid(mt_rand(), true));
$uuid = substr($str,0,8) . '-';
$uuid .= substr($str,8,4) . '-';
$uuid .= substr($str,12,4) . '-';
$uuid .= substr($str,16,4) . '-';
$uuid .= substr($str,20,12);
return $prefix . $uuid;
}
//创建ISO8601格式的时间,接受标准时间戳输入
function gmt_iso8601($time) {
$dtStr = date("c", $time);
$mydatetime = new DateTime($dtStr);
$expiration = $mydatetime->format(DateTime::ISO8601);
$pos = strpos($expiration, '+');
$expiration = substr($expiration, 0, $pos);
return $expiration."Z";
}
//设置时区
date_default_timezone_set('UTC');
//视频储存名称时间戳+15位随机数
$newname=create_uuid().".mp4";
$Aid = "testId";
$AKey = "testKeySecret";
/* 拼接requestURL */
$action_data = array(
"PipelineId"=>"18692f58006c41bc9d64a83808530ce7",
"Action"=>"SubmitJobs","
Input"=>"{
'Bucket':'7cgcg-video',
'Location':'oss-cn-shanghai',
'Object':'7cgcg-video\/20170220_143336.mp4'
}",
"Outputs"=>"[{
'OutputObject':$newname,
'TemplateId':'14222958739bfe5e647cdf63e1306118',
'WaterMarks':{
'WaterMarkTemplateId':'4a4d14da76444a68bab093124f64b799'
},
'UserData':'testid-001'
}]");
$action_data=http_build_query($action_data);
//设置公共参数
$public_data=array(
'AccessKeyId'=>$Aid,
'Action'=>'SearchTemplate',
'Format'=>'XML',
'PageSize'=>'2',
'SignatureMethod'=>'HMAC-SHA1',
'SignatureNonce'=> '4902260a-516a-4b6a-a455-45b653cf6150',
'SignatureVersion'=>'1.0',
'Timestamp'=>'2015-05-14T09:03:45Z',
'Version'=>'2014-06-18'
);
//将公共参数格式化
foreach($public_data as $k=>$v){
if (empty($StringToSign)){
$StringToSign=$k."=".$v;
}else{
if ($k=="Timestamp"){
$StringToSign.="&".$k."=".rawurlencode($v);
}else{
$StringToSign.="&".$k."=".$v;
}
}
}
//计算签名
$StringToSign = utf8_encode("GET&%2F&".rawurlencode($StringToSign));
$signature = rawurlencode(utf8_encode(base64_encode(hash_hmac('SHA1', $StringToSign,($AKey.'&'), true))));
echo $signature;
echo "</br></br>";
//拼接公共参数
$public_data=http_build_query($public_data);
//加入签名
$other_data="Signature=".$signature.'&'.$public_data;
//拼接requestURL
$get_url = 'http://mts.aliyuncs.com?'.$action_data.'&'.$other_data;
echo $get_url;
echo "</br></br>";
// 初始化一个 cURL 对象
$curl = curl_init();
// 设置你需要抓取的URL
curl_setopt($curl, CURLOPT_URL, $get_url);
// 设置header 响应头是否输出
curl_setopt($curl, CURLOPT_HEADER, 1);
// 设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上。
// 1如果成功只将结果返回,不自动输出任何内容。如果失败返回FALSE
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0);
// 运行cURL,请求网页
$data = curl_exec($curl);
// 关闭URL请求
curl_close($curl);
// 显示获得的数据
print_r($data);
?>
参考的文档
https://help.aliyun.com/document_detail/29217.html?spm=5176.doc29218.6.568.6NUUCO
建议还是自己抓个包,对比下你认为的请求,和实际的请求,是不是有什么字段不符合标准?
最简单的,用官方的SDK发一次,抓个包
再用自己的SDK发一次,抓个包。
https://yq.aliyun.com/articles/34846?spm=5176.8091938.0.0.Y2fRLk
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。