阿里云短信支持先使用后支付的原则,价格为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。

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

  1. <div style="width:90%;margin:auto;margin-top:100px;text-align:center;font-size:12px;color:#192E32;">
  2. <form method="post" action="">
  3. <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;" />
  4. <span class="error" style="color:red;">&nbsp;&nbsp;阿里云短信模板编号</span>
  5. <br><br>
  6. <b>用户类型:</b>
  7. <input type="radio" name="tuser" id="tuser" value="suppliers" checked="checked"; />供应商
  8. <input type="radio" name="tuser" id="tuser" value="users" />全部用户
  9. <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>
  10. <br><br>
  11. <input type="submit" name="sub" id="sub" value="发送短信" disabled="true" />
  12. </form>
  13. </div>
  14. <script type="text/javascript">
  15. function myinput(){
  16. if(document.getElementById("tcode").value){
  17. document.getElementById("sub").removeAttribute("disabled");
  18. }
  19. else{
  20. document.getElementById("sub").setAttribute("disabled",disabled);
  21. }
  22. };
  23. function myclick(){
  24. if(document.getElementById("tcode").value){
  25. document.getElementById("sub").setAttribute("disabled",false);
  26. }
  27. else{
  28. document.getElementById("sub").setAttribute("disabled",true);
  29. }
  30. };
  31. </script>

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

  1. <?php
  2.  
  3. define('IN_ECS', true);
  4. require(dirname(__FILE__) . '/includes/init.php');
  5. //ECShop初始化页面文件
  6.  
  7. function https_request($url)
  8. {
  9. $curl = curl_init();
  10. curl_setopt($curl, CURLOPT_URL, $url);
  11. curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
  12. curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
  13. curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
  14. $data = curl_exec($curl);
  15. if (curl_errno($curl)) {return 'ERROR '.curl_error($curl);}
  16. curl_close($curl);
  17. return $data;
  18. }
  19. function xml_to_array($xml){
  20. $reg = "/<(\w+)[^>]*>([\\x00-\\xFF]*)<\\/\\1>/";
  21. if(preg_match_all($reg, $xml, $matches)){
  22. $count = count($matches[0]);
  23. for($i = 0; $i < $count; $i++){
  24. $subxml= $matches[2][$i];
  25. $key = $matches[1][$i];
  26. if(preg_match( $reg, $subxml )){
  27. $arr[$key] = xml_to_array( $subxml );
  28. }else{
  29. $arr[$key] = $subxml;
  30. }
  31. }
  32. }
  33. return @$arr;
  34. }
  35. function random($length = 6 , $numeric = 0) {
  36. PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
  37. if($numeric) {
  38. $hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
  39. } else {
  40. $hash = '';
  41. $chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghjkmnpqrstuvwxyz';
  42. $max = strlen($chars) - 1;
  43. for($i = 0; $i < $length; $i++) {
  44. $hash .= $chars[mt_rand(0, $max)];
  45. }
  46. }
  47. return $hash;
  48. }
  49. $target = "https://sms.aliyuncs.com/?";
  50. //阿里云短信请求地址头
  51. $mobile_code = random(6,1);
  52. function percentEncode($str)
  53. {
  54. // 使用urlencode编码后,将"+","*","%7E"做替换即满足ECS API规定的编码规范
  55. $res = urlencode($str);
  56. $res = preg_replace('/\+/', '%20', $res);
  57. $res = preg_replace('/\*/', '%2A', $res);
  58. $res = preg_replace('/%7E/', '~', $res);
  59. return $res;
  60. }
  61. function computeSignature($parameters, $accessKeySecret)
  62. {
  63. // 将参数Key按字典顺序排序
  64. ksort($parameters);
  65. // 生成规范化请求字符串
  66. $canonicalizedQueryString = '';
  67. foreach($parameters as $key => $value)
  68. {
  69. $canonicalizedQueryString .= '&' . percentEncode($key)
  70. . '=' . percentEncode($value);
  71. }
  72. // 生成用于计算签名的字符串 stringToSign
  73. $stringToSign = 'GET&%2F&' . percentencode(substr($canonicalizedQueryString, 1));
  74. //echo "<br>".$stringToSign."<br>";
  75. // 计算签名,注意accessKeySecret后面要加上字符'&'
  76. $signature = base64_encode(hash_hmac('sha1', $stringToSign, $accessKeySecret . '&', true));
  77. return $signature;
  78. }
  79. // 注意使用GMT时间
  80. date_default_timezone_set("GMT");
  81. $dateTimeFormat = 'Y-m-d\TH:i:s\Z'; // ISO8601规范
  82. $accessKeyId = '根据实际修改'; // 这里填写您的Access Key ID
  83. $accessKeySecret = '根据实际修改'; // 这里填写您的Access Key Secret
  84. $ParamString="{\"code\":\"".strval($mobile_code)."\"}";
  85. // 发送请求
  86. if($_REQUEST['act'] == 'aliyun_mns'){// POST表单提交请求页面动作?act=aliyun_mns
  87. /* 显示模板 */
  88. if (isset($_POST['tcode']) && isset($_POST['tuser'])) {
  89. $tcode=$_POST["tcode"];// 表单提交SMS短信模板
  90. $tuser=$_POST["tuser"]; //表单提交用户组
  91. $sql = "SELECT DISTINCT mobile_phone FROM " .$ecs->table($tuser);
  92. $phoneNO = $db->getCol($sql);
  93. $ii=0;
  94. foreach($phoneNO as $key=>$pn)
  95. {
  96. if(preg_match("/^1[34578]\d{9}$/",$pn)){
  97. $data = array(
  98. // 公共参数
  99. 'SignName'=>'根据实际修改',
  100. 'Format' => 'XML',
  101. 'Version' => '2016-09-27',
  102. 'AccessKeyId' => $accessKeyId,
  103. 'SignatureVersion' => '1.0',
  104. 'SignatureMethod' => 'HMAC-SHA1',
  105. 'SignatureNonce'=> uniqid(),
  106. 'Timestamp' => date($dateTimeFormat),
  107. // 接口参数
  108. 'Action' => 'SingleSendSms',
  109. 'TemplateCode' =>$tcode,
  110. 'RecNum' => $pn,
  111. 'ParamString' => $ParamString
  112. );
  113. $data['Signature'] = computeSignature($data, $accessKeySecret);
  114. //给每一位用户发短信
  115. $result = xml_to_array(https_request($target.http_build_query($data)));
  116. }
  117. }
  118. }
  119. /* 显示Smarty模板 */
  120. assign_query_info();
  121. $smarty->display('aliyun_mns.htm');
  122. }
  123. ?>

创建和查看Access Key

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

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

PHP控制阿里云短信API接口实现短信群发功能的更多相关文章

  1. java 调用短信 api 接口发送短信

    参考:   https://blog.csdn.net/u014793522/article/details/59062014 参考 :https://blog.csdn.net/Lu_shilusi ...

  2. 如何防止短信API接口遍历

    短信API接口在web中得到越来越多的应用,如用户注册,登录,密码重置等业务模块都会使用手机验证码进行身份验证.一般情况下,我们会采用这样的安全策略,将短信发送频率限制在正常的业务流控范围内,比如,一 ...

  3. 五:用JAVA写一个阿里云VPC Open API调用程序

    用JAVA写一个阿里云VPC Open API调用程序 摘要:用JAVA拼出来Open API的URL 引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软 ...

  4. 试了下阿里云的OPEN Api

    逐渐理解open api的意义,试了下阿里云的续费接口,续费一个月 package com.test; /** * @author * @date 2018/12/05 */ import com.a ...

  5. 阿里云视频直播API签名机制源码

    阿里云视频直播API签名机制源码 本文展示:通过代码实现下阿里视频直播签名处理规则 阿里云视频直播签名机制,官方文档链接:https://help.aliyun.com/document_detail ...

  6. 关于新浪和腾讯短网址API接口的调用

    最新新浪t.cn短网址和腾讯url.cn短网址生成api接口,快速生成t.cn及url.cn超短链接,接口都可以正常调用,觉得不错可以收藏一下. 新浪短网址api接口:1. http://yldwz. ...

  7. 如何利用新浪官方的短网址API接口实现T.cn短链接的压缩生成

    短网址的实现原理就是有一个数据表会配置文件将短网址和实际网址进行对应,当请求某个短网址时,程序跳转到对应的实际网址上去,从而实现网址的访问.目前国内最稳定最好用的是新浪T.cn短链接. 之前新浪提供了 ...

  8. 阿里云ONS而微软Azure Service Bus体系结构和功能比较

    阿里云ONS而微软Azure Service bus体系结构和功能比较 版权所有所有,转载请注明出处http://blog.csdn.net/yangzhenping.谢谢! 阿里云的开放消息服务: ...

  9. 用Python调用华为云API接口发短信

    [摘要] 用Python调用华为云API接口实现发短信,当然能给调用发短信接口前提条件是通过企业实名认证,而且有一个通过审核的短信签名,话不多说,showcode #!/usr/bin/python3 ...

随机推荐

  1. 使用PInvoke互操作,让C#和C++愉快的交互优势互补

    一:背景 1. 讲故事 如果你常翻看FCL的源码,你会发现这里面有不少方法借助了C/C++的力量让C#更快更强悍,如下所示: [DllImport("QCall", CharSet ...

  2. Java IO(二)File

    Java IO(二)File 一.概述 在 Java 中,File 类是 java.io 包中唯一代表磁盘文件本身的对象,也就是说,如果希望在程序中操作文件和目录,则都可以通过 File 类来完成.F ...

  3. HttpSession之表单的重复提交 & 验证码

    如果采用 HttpServletResponse.sendRedirct() 方法将客户端重定向到成功页面,将不会出现重复提交问题 1.表单的重复提交 1). 重复提交的情况: ①. 在表单提交到一个 ...

  4. 【转】DataFrame合并

    参考:python 把几个DataFrame合并成一个DataFrame——merge,append,join,conca 横向合并(扩展列):merge,类似SQL的join,内连接,外连接等. 纵 ...

  5. NetCore项目实战篇08---Docker挂载mysql并连接.netCoreWeb

    我们的项目之前在直接连接的mysql,今天我们将通过docker挂载mysql 并与我们开发的webapi项目连接. 1. 安装docker 下载地址: https://download.docker ...

  6. (Java实现) 洛谷 P1553 数字反转(升级版)

    题目描述 给定一个数,请将该数各个位上数字反转得到一个新数. 这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数.整数反转是将所有数位对调:小数反转是把整数部分的数反转, ...

  7. Java实现 LeetCode 477 汉明距离总和

    477. 汉明距离总和 两个整数的 汉明距离 指的是这两个数字的二进制数对应位不同的数量. 计算一个数组中,任意两个数之间汉明距离的总和. 示例: 输入: 4, 14, 2 输出: 6 解释: 在二进 ...

  8. Java实现 蓝桥杯VIP 基础练习 芯片测试

    问题描述 有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多. 每个芯片都能用来测试其他芯片.用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏.而用坏芯片测试其他芯片时,会随机给出好或是 ...

  9. Java实现 蓝桥杯VIP 算法提高 计算器

    算法提高 计算器 时间限制:1.0s 内存限制:256.0MB [问题描述] 王小二的计算器上面的LED显示屏坏掉了,于是他找到了在计算器维修与应用系学习的你来为他修计算器. 屏幕上可以显示0~9的数 ...

  10. java实现还款计算

    标题: 还款计算 银行贷款的等额本息还款方法是: 每月还固定的金额,在约定的期数内正好还完(最后一个月可能会有微小的零头出入). 比如说小明在银行贷款1万元.贷款年化利率为5%,贷款期限为24个月. ...