开发者社区> 问答> 正文

计算得到的MTS签名不符合标准


我根据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);
?>






展开
收起
酵母君 2017-02-22 18:38:58 3821 0
2 条回答
写回答
取消 提交回答
  • 回 1楼mousepad942的帖子
    怎么解决?是哪一步不符合规范吗?
    2017-02-23 11:49:33
    赞同 展开评论 打赏
  • 不错哦
    2017-02-23 11:46:51
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载