php阿里云短信接口POST和GET方式访问成功demo

<?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规定的编码规范  
    $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");  
$target = "https://dysmsapi.aliyuncs.com/?";  
$dateTimeFormat = 'Y-m-d\TH:i:s\Z'; // ISO8601规范  
$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电子商务有限公司',
    'SignatureMethod' => 'HMAC-SHA1',
    'SignatureNonce'=> uniqid(),
    'SignatureVersion' => '1.0',
    'TemplateCode' => 'SMS_9705XXXX', 
    'TemplateParam' => $ParamString,
    'Timestamp' => date($dateTimeFormat),
    'Version' => '2017-05-25'
);  
// 计算签名并把签名结果加入请求参数  
$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);  
?>

用post方式访问只需要改三处:
1、将computeSignature函数内的拼接字符GET改成POST

 // 生成用于计算签名的字符串 stringToSign  
$stringToSign = 'POST&%2F&' . percentencode(substr($canonicalizedQueryString, 1));  

2、将发送http请求的PHP函数https_request改为用POST方式传:

   function https_request($url)  
{  
    $curl = curl_init();
    //设置抓取的url
    curl_setopt($curl, CURLOPT_URL, 'https://dysmsapi.aliyuncs.com');
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);  
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    //设置头文件的信息作为数据流输出
    curl_setopt($curl, CURLOPT_HEADER, 1);
    //设置获取的信息以文件流的形式返回,而不是直接输出。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    //设置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、调用https_request的参数需要调整为POST要传输的值

$result = xml_to_array(https_request(http_build_query($data)));  

DONE!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 详细参考网址:https://help.aliyun.com/document_detail/56189.html...
    CJDUDU阅读 9,062评论 0 1
  • 首先下载SDK与DOME文档 http://download.csdn.net/download/weixin_4...
    熊大y阅读 3,660评论 0 0
  • 很多时候,女人在事业上,在工作上都是以女汉子形象出现的,只有这样,才能更好的保护他们,因为这是一个对女人不平...
    张栩溪阅读 2,463评论 0 1
  • 一个工作日,为了上班赶早叫了“滴滴”车,过一会儿司机来了。是一位中年老大姐,我们在车上有一搭没一搭的闲聊。照例说说...
    小幼班安安阅读 1,801评论 1 0
  • 在长江边上,在一座层峦叠嶂的山峰下,有一块石头,跟别的石头不一样,它不仅体形高大,而且极像一个女人在盼望着她的丈夫...
    Mr_稻香老农阅读 4,590评论 6 8

友情链接更多精彩内容