非常感谢,最主要是把前面的POST看漏了,就看了你的回答后也没有弄明白,后来研究了下面的python代码(不会python),才发现要把POST拼接到主机域名前面,汗,当然urlencode也是个问题.下面的代码是修改后的
<?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' => $SourceText,
'Source' => $Source,
'Target' => $Target,
'Nonce' => mt_rand(10000, 99999),
'Timestamp' => time(),
'Version' => '2018-03-21'
);
$arr['Signature'] = self::sign('POST' . $this->uriData, $arr, $this->SecretKey);
return self::curlPost("https://$this->uriData", $arr);
}
public static function sign($uriData, $params, $SecretKey){
$params = self::formatQueryParaMap($params);
$srcStr = "$uriData/?$params";
$signStr = base64_encode(hash_hmac('sha1', $srcStr, $SecretKey, true));
return $signStr;
}
protected static function formatQueryParaMap($paraMap, $urlEncode = false) {
$buff = "";
ksort($paraMap);
foreach ($paraMap as $k => $v) {
$v = self::auto_charset($v);
if ($urlEncode) {
$v = urlencode($v);
}
$buff .= $k . "=" . $v . "&";
}
$reqPar = '';
if (strlen($buff) > 0) {
$reqPar = substr($buff, 0, strlen($buff) - 1);
}
return $reqPar;
}
public static function curlPost($url = '', $postData = '', $options = array()) {
if (is_array($postData)) {
$postData = self::formatQueryParaMap($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;
}
public static function auto_charset($data, $to='utf-8') {
if(is_string($data)) {
$encode_arr = array('UTF-8','ASCII','GBK','GB2312','BIG5','JIS','eucjp-win','sjis-win','EUC-JP');
$encoded = mb_detect_encoding($data, $encode_arr);
$data = mb_convert_encoding($data, $to, $encoded);
return $data;
}else{
return $data;
}
}
}