基于PHP实现短信验证码接口的方法
步骤:
1、登录荣联运通讯注册获取ACCOUNT SID、AUTH TOKEN、Rest URL(生产)、AppID(默认);
2、注册测试用手机号码(先注册测试号码方可使用);
3、下载demo示例,并将代码放到项目中(最好单独建文件夹存储)。
代码区:
<?php /* * 短信接口测试 */ class TestApp extends ShoppingbaseApp{ public function index(){ $this->display('test.html'); } public function get_info() { include_once(ROOT_PATH.'/includes/rly_message/rest.app.php');//引入模板文件 //主帐号,对应开官网发者主账号下的 ACCOUNT SID $accountSid = ''; //主帐号令牌,对应官网开发者主账号下的 AUTH TOKEN $accountToken = ''; //应用Id,在官网应用列表中点击应用,对应应用详情中的APP ID //在开发调试的时候,可以使用官网自动为您分配的测试Demo的APP ID $appId =''; //请求地址 //沙盒环境(用于应用开发调试):sandboxapp.cloopen.com //生产环境(用户应用上线使用):app.cloopen.com $serverIP ='app.cloopen.com'; //请求端口,生产环境和沙盒环境一致 $serverPort ='8883'; //REST版本号,在官网文档REST介绍中获得。 $softVersion ='2013-12-26'; //global $accountSid,$accountToken,$appId,$serverIP,$serverPort,$softVersion; $phone_mob = isset($_GET['phone_mob']) ? $_GET['phone_mob'] : ''; if($phone_mob){ $this->sendTemplateSMS($phone_mob,array('3519','5'),"1",$accountSid,$accountToken,$appId,$serverIP,$serverPort,$softVersion);//手机号码,替换内容数组,模板ID } } /** * 发送模板短信 * @param to 手机号码集合,用英文逗号分开 * @param datas 内容数据 格式为数组 例如:array('Marry','Alon'),如不需替换请填 null * @param $tempId 模板Id,测试应用和未上线应用使用测试模板请填写1,正式应用上线后填写已申请审核通过的模板ID */ public function sendTemplateSMS($to,$datas,$tempId,$accountSid,$accountToken,$appId,$serverIP,$serverPort,$softVersion) { // 初始化REST SDK $rest = new RestApp($serverIP,$serverPort,$softVersion); $rest->setAccount($accountSid,$accountToken); $rest->setAppId($appId); // 发送模板短信 echo "Sending TemplateSMS to $to <br/>"; $result = $rest->sendTemplateSMS($to,$datas,$tempId); if($result == NULL ) { echo "result error!"; exit(); } if($result->statusCode!=0) { echo "error code :" . $result->statusCode . "<br>"; echo "error msg :" . $result->statusMsg . "<br>"; //TODO 添加错误处理逻辑 }else{ echo "Sendind TemplateSMS success!<br/>"; // 获取返回信息 $smsmessage = $result->TemplateSMS; echo "dateCreated:".$smsmessage->dateCreated."<br/>"; echo "smsMessageSid:".$smsmessage->smsMessageSid."<br/>"; //TODO 添加成功处理逻辑 } } }
二、模板文件(rest.app.php可根据自己使用的框架重新命名,也可直接使用demo原先的名字)
<?php class RestApp { private $AccountSid ; private $AccountToken ; private $AppId ; private $ServerIP; // ='app.cloopen.com' private $ServerPort ; //='8883' private $SoftVersion ; // ='2013-12-26' private $Batch; //时间戳 private $BodyType = "xml";//包体格式,可填值:json 、xml private $enabeLog = true; //日志开关。可填值:true、 private $Filename="./log.txt"; //日志文件 private $Handle; function __construct($ServerIP,$ServerPort,$SoftVersion) { $this->RestApp($ServerIP,$ServerPort,$SoftVersion); } function RestApp($ServerIP,$ServerPort,$SoftVersion) { $this->Batch = date("YmdHis"); $this->ServerIP = $ServerIP; $this->ServerPort = $ServerPort; $this->SoftVersion = $SoftVersion; $this->Handle = fopen($this->Filename, 'a'); } /** * 设置主帐号 * * @param AccountSid 主帐号 * @param AccountToken 主帐号Token */ function setAccount($AccountSid,$AccountToken){ $this->AccountSid = $AccountSid; $this->AccountToken = $AccountToken; } /** * 设置应用ID * @param AppId 应用ID */ function setAppId($AppId){ $this->AppId = $AppId; } /** * 打印日志 * * @param log 日志内容 */ function showlog($log){ if($this->enabeLog){ fwrite($this->Handle,$log."\n"); } } /** * 发起HTTPS请求 */ function curl_post($url,$data,$header,$post=1) { //初始化curl $ch = curl_init(); //参数设置 $res= curl_setopt($ch, CURLOPT_URL,$url); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, $post); if($post) { curl_setopt($ch, CURLOPT_POSTFIELDS, $data); } curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HTTPHEADER,$header); $result = curl_exec($ch); //连接失败 if($result == FALSE){ if($this->BodyType=='json'){ $result = "{\"statusCode\":\"172001\",\"statusMsg\":\"网络错误\"}"; } else { $result = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Response><statusCode>172001</statusCode><statusMsg>网络错误</statusMsg></Response>"; } } curl_close($ch); return $result; } /** * 发送模板短信 * @param to 短信接收彿手机号码集合,用英文逗号分开 * @param datas 内容数据 * @param $tempId 模板Id */ function sendTemplateSMS($to,$datas,$tempId) { //主帐号鉴权信息验证,对必选参数进行判空。 //$auth=$this->accAuth(); // if($auth!=""){ // return $auth; // } // 拼接请求包体 if($this->BodyType=="json"){ $data=""; for($i=0;$i<count($datas);$i++){ $data = $data. "'".$datas[$i]."',"; } $body= "{'to':'$to','templateId':'$tempId','appId':'$this->AppId','datas':[".$data."]}"; }else{ $data=""; for($i=0;$i<count($datas);$i++){ $data = $data. "<data>".$datas[$i]."</data>"; } $body="<TemplateSMS> <to>$to</to> <appId>$this->AppId</appId> <templateId>$tempId</templateId> <datas>".$data."</datas> </TemplateSMS>"; } $this->showlog("request body = ".$body); // 大写的sig参数 $sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch)); // 生成请求URL $url="https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/SMS/TemplateSMS?sig=$sig"; $this->showlog("request url = ".$url); // 生成授权:主帐户Id + 英文冒号 + 时间戳。 $authen = base64_encode($this->AccountSid . ":" . $this->Batch); // 生成包头 $header = array("Accept:application/$this->BodyType","Content-Type:application/$this->BodyType;charset=utf-8","Authorization:$authen"); // 发送请求 $result = $this->curl_post($url,$body,$header); $this->showlog("response body = ".$result); if($this->BodyType=="json"){//JSON格式 $datas=json_decode($result); }else{ //xml格式 $datas = simplexml_load_string(trim($result," \t\n\r")); } // if($datas == FALSE){ // $datas = new stdClass(); // $datas->statusCode = '172003'; // $datas->statusMsg = '返回包体错误'; // } //重新装填数据 if($datas->statusCode==0){ if($this->BodyType=="json"){ $datas->TemplateSMS =$datas->templateSMS; unset($datas->templateSMS); } } return $datas; } /** * 主帐号鉴权 */ function accAuth() { if($this->ServerIP==""){ $data = new stdClass(); $data->statusCode = '172004'; $data->statusMsg = 'IP为空'; return $data; } if($this->ServerPort<=0){ $data = new stdClass(); $data->statusCode = '172005'; $data->statusMsg = '端口错误(小于等于0)'; return $data; } if($this->SoftVersion==""){ $data = new stdClass(); $data->statusCode = '172013'; $data->statusMsg = '版本号为空'; return $data; } if($this->AccountSid==""){ $data = new stdClass(); $data->statusCode = '172006'; $data->statusMsg = '主帐号为空'; return $data; } if($this->AccountToken==""){ $data = new stdClass(); $data->statusCode = '172007'; $data->statusMsg = '主帐号令牌为空'; return $data; } if($this->AppId==""){ $data = new stdClass(); $data->statusCode = '172012'; $data->statusMsg = '应用ID为空'; return $data; } } } ?>
三、前台模板代码(test.html)
<p style="height:100px;border:1px solid gray;text-align:center;padding-top:20px;"> <form action="" method="post"> 请输入手机号码:<input type="text" name="phone_mob" ><input type="button" name="btn" value="点击获取验证码"><br /> 输入验证码:<input type="text" name="yzm" value=""><br /> <input type="submit" name="sbt" value="提交"> </form> </p>
四、js代码
<script type="text/javascript"> $(function(){ $('input[name=btn]').on('click',function(){ var phone_mob = $('input[name=phone_mob]').val(); $.ajax({ type: "GET", url: "index.php?app=test&act=get_info",//请求后台的URL地址 dataType: "json", data:{'phone_mob' : phone_mob}, success:function(data){ if(data.done && data.retval) { //console.log(data.retval); alert('成功!'); } } }); }); }); </script>
基于PHP实现短信验证码接口的方法的更多相关文章
- php短信验证码接口接入流程及代码示例
对于绝大部分企业来说,所使用的短信验证码接口都是第三方短信服务商所提供,目前市场上短信服务商有很多,在此向大家推荐一家动力思维乐信,运营13年,值得信赖! 就拿动力思维乐信短信验证码接口为例,详细介绍 ...
- 重构客户注册-基于ActiveMQ实现短信验证码生产者
重构目标:将bos_fore项目中的CustomerAction作为短信消息生产者,将消息发给ActiveMQ,创建一个单独的SMS项目,作为短信息的消费者,从ActiveMQ获取短信消息,调用第三方 ...
- Python2-Django配置阿里大于的短信验证码接口
1.短信发送开发指南地址:https://help.aliyun.com/document_detail/55491.html?spm=a2c4g.11186623.6.568.l5zTwH 2.SD ...
- 请给你的短信验证码接口加上SSL双向验证
序言 去年年底闲来几天,有位同事专门在网上找一些注册型的app和网站,研究其短信接口是否安全,半天下来找到30来家,一些短信接口由于分析难度原因,没有继续深入,但差不多挖掘到20来个,可以肆意被调用, ...
- C# 开发(创蓝253)手机短信验证码接口
创蓝253: https://www.253.com/ #region 获取手机验证码(创蓝253) /// <summary> /// 获取手机验证码(创蓝253) /// </s ...
- asp实现阿里大鱼短信API接口的方法
阿里大鱼是阿里推出的产品,官方提供JAVA..NET.PHP等版本的SDK下载,不知为何,唯独不提供ASP版本的SDK. 不提供没关系,自己写就是了,参照官方提供的API写一个就是了. 本来以为无非是 ...
- 如何对接网建SMS短信通短信验证码接口
1首先注册登录网建SMS网站 http://www.smschinese.cn/ 2.下载Java代码 3.JAVA调用 import java.io.UnsupportedEncodingExce ...
- java 随机生成6位短信验证码
生成6位随机数字其实很简单,只需一行代码,具体如下: String verifyCode = String.valueOf(new Random().nextInt(899999) + 100000) ...
- iOS点击获取短信验证码按钮
概述 iOS点击获取短信验证码按钮, 由于 Demo整体测试运行效果 , 整个修改密码界面都已展现, 并附送正则表达式及修改密码逻辑. 详细 代码下载:http://www.demodashi.com ...
随机推荐
- java获取一天前的时间
获取一天前的时间 Date date = new Date(); Calendar calendar = Calendar.getInstance(); calendar.setTime(date); ...
- Python-序列常用方法 + * += extend append方法区别
+ 两边都是相同序列类型.拼接成一个新的序列 print((1, 2, 3) + (4, 6)) print("beimenchuixue" + "ximenchuife ...
- Centos-对比文件差异-diff
diff 比较文件差异 相关选项 -c 显示全部内容,并标记不同之处 -b 忽略行尾空格,并认为字符串中一个或多个空格视为相同 -r 当比较双方都是目录时,会比较子目录中的文件 -s 当两个文件相同 ...
- You must give at least one requirement to install (see "pip help install")
语言: python why? install 后面没有参数,也就是说没有给想要安装的包 way? pip install 后面要跟想要安装的包名
- shiro认证流程源码分析--练气初期
写在前面 在上一篇文章当中,我们通过一个简单的例子,简单地认识了一下shiro.在这篇文章当中,我们将通过阅读源码的方式了解shiro的认证流程. 建议大家边读文章边动手调试代码,这样效果会更好. 认 ...
- 剑指Offer(三):从尾到头打印链表
一.前言 刷题平台:牛客网 二.题目 输入一个链表,返回一个反序的链表. 1.思路 通常,这种情况下,我们不希望修改原链表的结构.返回一个反序的链表,这就是经典的"后进先出",我们 ...
- C++有子对象的派生类的构造函数
转载:https://blog.csdn.net/qq1169091731/article/details/50934588?utm_source=blogxgwz6 类的数据成员不但可以是标准型(如 ...
- 达梦产品技术支持培训-day7-DM8数据库备份与还原-原理
(本文部分内容摘自DM产品技术支持培训文档,如需要更详细的文档,请查询官方操作手册,谢谢) 1.DM8备份还原简介 1.1.基本概念 (1)表空间与数据文件 ▷ DM8表空间类型: ▷ SYSTEM ...
- 50个你必须了解的Kubernetes面试问题
Kubernetes一直是当今业界的流行语,也是最好的编排工具.它吸引了许多想要提升自己职业生涯的经验丰富的专业人士.HuaWei,Pokemon,Box,eBay,Ing,Yahoo Japan,S ...
- maven下载依赖包下载失败
在家办公,遇到项目的maven包下载不了,刚开始以为是vpn的问题,折腾半天反复确认之后没有发现什么问题. 同时试过阿里巴巴的maven仓库,删除过以来,重新导过包发现都不行. 后来在idea的设置里 ...