阿里云发送短信

2019-03-04 11:01:41 阅读:4 编辑
<?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 percentEncode ($str)
{
    // 使用 urlencode 编码后,将 "+","*","%7 E" 做替换即满足 ECS API 规定的编码规范
    $res = urlencode ($str);
    $res = preg_replace ('/\+/', '%20', $res);
    $res = preg_replace ('/\*/', '%2 A', $res);
    $res = preg_replace ('/%7 E/', '~', $res);
    return $res;
}

function computeSignature ($parameters, $accessKeySecret)
{
    // 将参数 Key 按字典顺序排序
    ksort ($parameters);
    // 生成规范化请求字符串
    $canonicalizedQueryString = '';
    foreach ($parameters as $key => $value)
    {$canonicalizedQueryString .= '&' . percentEncode ($key)
            . '=' . percentEncode ($value);
    }
    // 生成用于计算签名的字符串 stringToSign
    $stringToSign = 'GET&%2 F&' . 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 规范
$accessKeyId = 'xx';      // 这里填写您的 Access Key ID
$accessKeySecret = 'yy';  // 这里填写您的 Access Key Secret
$ParamString="{\"code\":\"1234\"}";

$data = array ('AccessKeyId' => $accessKeyId,
    'Action' => 'SendSms',
    'Format' => 'xml',
    'OutId' => '123',
    'PhoneNumbers' => '18050056050',
    'RegionId' => 'cn-hangzhou',
    'SignName'=>'签名',
    'SignatureMethod' => 'HMAC-SHA1',
    'SignatureNonce'=> '45 e25 e9 b-0 a6 f-4070-8 c85-2956 eda1 b466',
    'SignatureVersion' => '1.0',
    'TemplateCode' => 'SMS_158948234',
    'TemplateParam' => $ParamString,
    'Timestamp' => date ($dateTimeFormat),
    'Version' => '2017-05-25'
);
// 计算签名并把签名结果加入请求参数
//echo $data ['Version']."<br>";
//echo $data ['Timestamp']."<br>";
$data ['Signature'] = computeSignature ($data, $accessKeySecret);
// 发送请求
$result = xml_to_array (https_request ($target.http_build_query ($data)));

var_dump ($result);
//echo $result ['Error']['Code']."--->".$result ['Error']['Message'];
//echo "<br><br>".$target . http_build_query ($data);
?>