<?php
session_start();
header("Content-type:text/html; charset=UTF-8");
function https_request($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($curl);
if (curl_errno($curl)) {return 'ERROR '.curl_error($curl);}
curl_close($curl);
return $data;
}
function xml_to_array($xml){
$reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
if(preg_match_all($reg, $xml, $matches)){
$count = count($matches[0]);
for($i = 0; $i < $count; $i++){
$subxml= $matches[2][$i];
$key = $matches[1][$i];
if(preg_match( $reg, $subxml )){
$arr[$key] = xml_to_array( $subxml );
}else{
$arr[$key] = $subxml;
}
}
}
return @$arr;
}
if(empty($mobile)){
//exit('手機號碼不能為空');
}
if(empty($_SESSION['send_code']) or $send_code!=$_SESSION['send_code']){
//防用戶惡意請求
//exit('請求超時,請刷新頁面后重試');
}
function percentEncode($str)
{
// 使用urlencode編碼后旁舰,將"+","*","%7E"做替換即滿足ECS API規(guī)定的編碼規(guī)范
$res = urlencode($str);
$res = preg_replace('/\+/', '%20', $res);
$res = preg_replace('/\*/', '%2A', $res);
$res = preg_replace('/%7E/', '~', $res);
return $res;
}
function computeSignature($parameters, $accessKeySecret)
{
// 將參數(shù)Key按字典順序排序
ksort($parameters);
// 生成規(guī)范化請求字符串
$canonicalizedQueryString = '';
foreach($parameters as $key => $value)
{
$canonicalizedQueryString .= '&' . percentEncode($key)
. '=' . percentEncode($value);
}
// 生成用于計算簽名的字符串 stringToSign
$stringToSign = 'GET&%2F&' . percentencode(substr($canonicalizedQueryString, 1));
//echo "<br>".$stringToSign."<br>";
// 計算簽名而线,注意accessKeySecret后面要加上字符'&'
$signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));
return $signature;
}
// 注意使用GMT時間
date_default_timezone_set("GMT");
$target = "https://dysmsapi.aliyuncs.com/?";
$dateTimeFormat = 'Y-m-d\TH:i:s\Z'; // ISO8601規(guī)范
$accessKeyId = 'XXXXXXXX'; // 這里填寫您的Access Key ID
$accessKeySecret = 'XXXXXXXXXXXXXXXXX'; // 這里填寫您的Access Key Secret
$ParamString="{\"XXName\":\"test\",\"XXXXType\":\"test\"}";
$data = array(
'AccessKeyId' => $accessKeyId,
'Action' => 'SendSms',
'Format' => 'XML',
'OutId' => '123',
'PhoneNumbers' => '183XXXXXXXX',
'RegionId' => 'cn-hangzhou',
'SignName'=>'XXXX電子商務(wù)有限公司',
'SignatureMethod' => 'HMAC-SHA1',
'SignatureNonce'=> uniqid(),
'SignatureVersion' => '1.0',
'TemplateCode' => 'SMS_9705XXXX',
'TemplateParam' => $ParamString,
'Timestamp' => date($dateTimeFormat),
'Version' => '2017-05-25'
);
// 計算簽名并把簽名結(jié)果加入請求參數(shù)
$data['Signature'] = computeSignature($data, $accessKeySecret);
// 發(fā)送請求
$result = xml_to_array(https_request($target.http_build_query($data)));
echo $result['Error']['Code']."--->".$result['Error']['Message'];
echo "<br><br>".$target . http_build_query($data);
?>
用post方式訪問只需要改三處:
1铭污、將computeSignature函數(shù)內(nèi)的拼接字符GET改成POST
// 生成用于計算簽名的字符串 stringToSign
$stringToSign = 'POST&%2F&' . percentencode(substr($canonicalizedQueryString, 1));
2、將發(fā)送http請求的PHP函數(shù)https_request改為用POST方式傳:
function https_request($url)
{
$curl = curl_init();
//設(shè)置抓取的url
curl_setopt($curl, CURLOPT_URL, 'https://dysmsapi.aliyuncs.com');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
//設(shè)置頭文件的信息作為數(shù)據(jù)流輸出
curl_setopt($curl, CURLOPT_HEADER, 1);
//設(shè)置獲取的信息以文件流的形式返回膀篮,而不是直接輸出嘹狞。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//設(shè)置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $url);
$data = curl_exec($curl);
if (curl_errno($curl)) {return 'ERROR '.curl_error($curl);}
curl_close($curl);
return $data;
}
3、調(diào)用https_request的參數(shù)需要調(diào)整為POST要傳輸?shù)闹?/p>
$result = xml_to_array(https_request(http_build_query($data)));
DONE誓竿!