天天看點

php操作阿裡雲短信API接口

最近公司短信到期了,我看到阿裡雲裡面有個短信驗證碼服務,價格非常低,每條最高4分半,3秒可到,于是就申請了.

可是後面很難用,找不到例子代碼,然後自己摸索,也咨詢了阿裡雲的從業人員,花了2天才搞定,真不容易,記錄下來,便于今後自己和其他人查閱.

<?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;
}
function random($length = 6 , $numeric = 0) {
	PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
	if($numeric) {
		$hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
	} else {
		$hash = '';
		$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghjkmnpqrstuvwxyz';
		$max = strlen($chars) - 1;
		for($i = 0; $i < $length; $i++) {
			$hash .= $chars[mt_rand(0, $max)];
		}
	}
	return $hash;
}
$target = "https://sms.aliyuncs.com/?";

$mobile_code = random(6,1);

if(empty($mobile)){
	//exit('手機号碼不能為空');
}

if(empty($_SESSION['send_code']) or $send_code!=$_SESSION['send_code']){
	//防使用者惡意請求
	//exit('請求逾時,請重新整理頁面後重試');
}

function percentEncode($str)
{
    // 使用urlencode編碼後,将"+","*","%7E"做替換即滿足ECS API規定的編碼規範
    $res = urlencode($str);
    $res = preg_replace('/\+/', '%20', $res);
    $res = preg_replace('/\*/', '%2A', $res);
    $res = preg_replace('/%7E/', '~', $res);
    return $res;
}


function computeSignature($parameters, $accessKeySecret)
{
    // 将參數Key按字典順序排序
    ksort($parameters);
    // 生成規範化請求字元串
    $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");
$dateTimeFormat = 'Y-m-d\TH:i:s\Z'; // ISO8601規範
$accessKeyId = '';      // 這裡填寫您的Access Key ID
$accessKeySecret = '';  // 這裡填寫您的Access Key Secret
$ParamString="{\"code\":\"".strval($mobile_code)."\"}";

$data = array(
    // 公共參數
	'SignName'=>'交易禅',
    'Format' => 'XML',
    'Version' => '2016-09-27',
    'AccessKeyId' => $accessKeyId,
    'SignatureVersion' => '1.0',
    'SignatureMethod' => 'HMAC-SHA1',
    'SignatureNonce'=> uniqid(),
    'Timestamp' => date($dateTimeFormat),
    // 接口參數
	'Action' => 'SingleSendSms',
    'TemplateCode' => 'SMS_24805217',
    'RecNum' => '13886355784',
	'ParamString' => $ParamString
);
// 計算簽名并把簽名結果加入請求參數
//echo $data['Version']."<br>";
//echo $data['Timestamp']."<br>";
$data['Signature'] = computeSignature($data, $accessKeySecret);
// 發送請求
    
	$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);


?>