最近项目用到阿里云的短信服务,下载阿里云短信服务官方SDK及DEMO,包含众多的文件夹及文件,一大堆的类,类引用地址也是乱的,没法直接运行。
里面包含多个接口(短信发送API,短信查询API,短信消息API),项目只需要短信发送接口即可。
只好研究下官方的文档,精简代码。(研究的过程中发现官方的文档就是个坑,缺少很多字段)
精简后的代码如下:(精简采用POST方式JSON格式SHA1加密)
$url = 'http://dysmsapi.aliyuncs.com/';
$accessKeyId = "yourAccessKeyId";
$accessKeySecret = "yourAccessKeySecret";
date_default_timezone_set("GMT");
$Timestamp = date('Y-m-d\TH:i:s\Z');
$parameters = [
'PhoneNumbers' => '15000000000',
'SignName' => '短信签名',
'TemplateCode' => '短信模板Code',
'TemplateParam' => '{"code":"123456"}',
'OutId' => '1234',
'RegionId' => 'cn-hangzhou',
'AccessKeyId' => $accessKeyId,
'Format' => 'JSON',
'SignatureMethod' => 'HMAC-SHA1',
'SignatureVersion' => '1.0',
'SignatureNonce' => uniqid(),
'Timestamp' => $Timestamp,
'Action' => 'SendSms',
'Version' => '2017-05-25',
];
$Signature = $this->computeSignature($parameters, $accessKeySecret);
$parameters['Signature'] = $Signature;
echo curl_post($url,$parameters);
exit;
public function computeSignature($parameters, $accessKeySecret)
{
ksort($parameters);
$canonicalizedQueryString = '';
foreach($parameters as $key => $value)
{
$canonicalizedQueryString .= '&' . $this->percentEncode($key). '=' . $this->percentEncode($value);
}
$stringToSign = 'POST'.'&%2F&' . $this->percentencode(substr($canonicalizedQueryString, 1));
$signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret."&", true));
return $signature;
}
protected function percentEncode($str)
{
$res = urlencode($str);
$res = preg_replace('/\+/', '%20', $res);
$res = preg_replace('/\*/', '%2A', $res);
$res = preg_replace('/%7E/', '~', $res);
return $res;
}