下面的代码自己写的,报错AuthFailure.SignatureFailure,The provided credentials could not be validated. Please check your signature is correct.麻烦帮看看哪里的问题,谢谢

<?php
header('Content-type:text/html; Charset=utf-8');
$SecretId = 'xxx';
$SecretKey = 'xxx';
$uriData = 'tmt.tencentcloudapi.com';

$SourceText = "hello world!";
$Source = "en";
$Target = "zh";
$region = 'ap-chengdu';

$test = new fanyi($SecretId, $SecretKey, $uriData);
$ret = $test->translate($SourceText, $Source, $Target, $region);

$ret = json_decode($ret, true);
print_r($ret);

class fanyi {
	protected $SecretId;
	protected $SecretKey;
	public function __construct($SecretId, $SecretKey, $uriData) {
		$this->SecretId = $SecretId;
		$this->SecretKey = $SecretKey;
		$this->uriData = $uriData;
	}
	public function translate($SourceText, $Source, $Target, $region) {
		$arr = array(
			'Action' => 'TextTranslate',
			'ProjectId' => 0,
			'Region' => $region,
			'SecretId' => $this->SecretId,
			'SourceText' => urlencode($SourceText),
			'Source' => $Source,
			'Target' => $Target,
			'Nonce' => mt_rand(10000, 99999),
			'Timestamp' => time(),
			'Version' => '2018-03-21'
		);
        $arr['Signature'] = urlencode(self::sign($this->uriData, $arr, $this->SecretKey));
		print_r($arr);
		return self::curlPost("https://$this->uriData", $arr);
	}
	public static function sign($uriData, $params, $SecretKey){
		ksort($params, SORT_STRING);
		$params = http_build_query($params);
		$srcStr = "$uriData/?$params";
		$signStr = base64_encode(hash_hmac('sha1', $srcStr, $SecretKey, true));
		return $signStr;
	}
	public static function curlPost($url = '', $postData = '', $options = array()) {
		if (is_array($postData)) {
			$postData = http_build_query($postData, true);
		}
		$ch = curl_init();
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_POST, 1);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
		curl_setopt($ch, CURLOPT_TIMEOUT, 30);
		if (!empty($options)) {
			curl_setopt_array($ch, $options);
		}
		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
		$data = curl_exec($ch);
		curl_close($ch);
		return $data;
	}
}
用户3347166用户3347166提问于
zqfan回答于
推荐

你这签名没有按照文档中要求的一步一步来啊:https://cloud.tencent.com/document/product/213/15693

1、拼接的时候是原文,但你却做了urlencode,而且还缺了应该在最前面的POST

2、signature总体上只需要做一次urlencode,但是做了两次,一次是显式的,一次是在http_build_query中隐式的,这个问题还在前面文档中专门强调了

有提供php sdk,其链接在每一个接口文档下面给出了,https://github.com/TencentCloud/tencentcloud-sdk-php。即使不想使用sdk,也有API Explorer提供签名的验证功能,其链接也在每一个接口文档下面给出了,https://console.cloud.tencent.com/api/explorer?Product=tmt&Version=2018-03-21&Action=TextTranslate。

回答过的其他问题

【建议】【API】使用API创建子网的时候允许指定已有路由表?

推荐

控制台使用的是新的接口,批量创建子网,https://cloud.tencent.com/document/product/215/31960,可以指定路由表。terraform开发的时候是基于api2.0开发的,还没有这个接口,因此暂时无法使用

 如何使用人工智能合成人声?

智能语音服务昨天刚上线了语音合成的功能,可以了解一下:https://cloud.tencent.com/document/api/441/18086

请问有创建项目的sdk吗?

推荐

这是api2.0的接口,使用对应的sdk,代码托管在http://github.com/qcloudapi

调用云解析API提示4100鉴权失败?

推荐
UTF8,并且注意要大写,例如%8E而不是%8e,官方文档中应该有提到这些注意事项的 image.png ... 展开详请

腾讯文接口的sign签名串获取为什么显示缺少signature参数?

你的密钥已经泄漏,请尽快删除此密钥。

请求发送时,你的query string里必须有经过签名算法计算出来的Signature参数,在你给出的例子url中,确实没有体现这个参数,所以报错了。请仔细阅读下文档,或者使用sdk,这样就可以不用关心签名过程了

就不能给个脚本吗!!!!!!!!!!!!!?

机器翻译目前支持API3.0,提供了6个语言的SDK,包含pyhton,java,php,go,nodejs,.net:https://github.com/TencentCloud/?utf8=%E2%9C%93&q=tencentcloud-sdk&type=&languag...... 展开详请

扫码关注云+社区

领取腾讯云代金券