PHP控制阿里云短信API接口实现短信群发功能

阿里云短信支持先使用后支付的原则,价格为4分半1条。

通过SDK可以与网站功能的绑定,实现响应的短信发送功能

现已统一合并升级为:消息服务。

消息服务

阿里云消息服务(Message Service,简称 MNS)是一种高效、可靠、安全、便捷、可弹性扩展的分布式消息服务。MNS能够帮助应用开发者在他们应用的分布式组件上自由的传递数据、通知消息,构建松耦合系统。

新的SDK下载地址:

Java SDK:https://help.aliyun.com/document_detail/51063.html
Python SDK:https://help.aliyun.com/document_detail/51372.html
C# SDK:https://help.aliyun.com/document_detail/52016.html
PHP SDK: https://help.aliyun.com/document_detail/51929.html

如果你像我一样是以前申请的短信服务升级过来的,那么旧的接口与API仍然能使用,新申请的只能使用新的SDK了。

本文旨在通过PHP实现阿里云短信接口,摆脱繁琐的SDK。

短信界面通过表单方式实现。

<div style="width:90%;margin:auto;margin-top:100px;text-align:center;font-size:12px;color:#192E32;">
<form method="post" action=""> 
   <b>模板CODE:</b>&nbsp;&nbsp;<input type="text" name="tcode" id="tcode" required="required" value="SMS_12345678" 
onFocus
="if(value==defaultValue){value='';this.style.color='#000'}" onBlur="if(!value){value=defaultValue;this.style.color='#999'}"
oninput
="myinput()" onpropertychange="myclick()" style="color:#999999;height:26px; width:150px; line-height:26px;" /> <span class="error" style="color:red;">&nbsp;&nbsp;阿里云短信模板编号</span> <br><br> <b>用户类型:</b> <input type="radio" name="tuser" id="tuser" value="suppliers" checked="checked"; />供应商 <input type="radio" name="tuser" id="tuser" value="users" />全部用户 <span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span> <br><br> <input type="submit" name="sub" id="sub" value="发送短信" disabled="true" /> </form> </div> <script type="text/javascript"> function myinput(){ if(document.getElementById("tcode").value){ document.getElementById("sub").removeAttribute("disabled"); } else{ document.getElementById("sub").setAttribute("disabled",disabled); } }; function myclick(){ if(document.getElementById("tcode").value){ document.getElementById("sub").setAttribute("disabled",false); } else{ document.getElementById("sub").setAttribute("disabled",true); } }; </script>

注意:阿里云短信模板编号为SMS_形式,通过JS控制输入提交按钮是否可用。

<?php

define('IN_ECS', true);
require(dirname(__FILE__) . '/includes/init.php');
//ECShop初始化页面文件
      
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);    
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)."\"}";  
    // 发送请求 
    if($_REQUEST['act'] == 'aliyun_mns'){// POST表单提交请求页面动作?act=aliyun_mns
        /* 显示模板 */
        if (isset($_POST['tcode']) && isset($_POST['tuser'])) {
        $tcode=$_POST["tcode"];// 表单提交SMS短信模板
        $tuser=$_POST["tuser"]; //表单提交用户组       
        $sql = "SELECT DISTINCT mobile_phone FROM " .$ecs->table($tuser);
        $phoneNO = $db->getCol($sql);
        $ii=0;
        foreach($phoneNO as $key=>$pn)
        {
            if(preg_match("/^1[34578]\d{9}$/",$pn)){
                $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' =>$tcode,  
                'RecNum' => $pn,  
                'ParamString' => $ParamString  
                );  
                $data['Signature'] = computeSignature($data, $accessKeySecret);
                //给每一位用户发短信                
                $result = xml_to_array(https_request($target.http_build_query($data))); 
            }
        }
    }        
        /* 显示Smarty模板 */
        assign_query_info();
        $smarty->display('aliyun_mns.htm');  
    }     
?>

创建和查看Access Key

https://ak-console.aliyun.com/#/accesskey/

YourSignName 和 YourSMSTemplateCode 获取在阿里云控制台消息服务。

posted @ 2017-07-03 16:28  年来未归客  阅读(2104)  评论(0编辑  收藏  举报