Laravel框架简介:
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
Laravel短信验证码实现步骤:
第一步:
- 容联云通讯相关配置选项(SendTemplateSMS.php):
<?php
namespace App\Tool\SMS;
use App\Tool\SMS\M3Result;
class SendTemplateSMS
{
//主帐号
private $accountSid='8a2*****************************df00bc';
//主帐号Token
private $accountToken='418**********************************17';
//应用Id
private $appId='8a21**********************************00c2';
//请求地址,格式如下,不需要写https://
private $serverIP='app.cloopen.com';
//请求端口
private $serverPort='8883';
//REST版本号
private $softVersion='2013-12-26';
/**
* 发送模板短信
* @param to 手机号码集合,用英文逗号分开
* @param datas 内容数据 格式为数组 例如:array('Marry','Alon'),如不需替换请填 null
* @param $tempId 模板Id
*/
public function sendTemplateSMS($to,$datas,$tempId)
{
$m3_result = new M3Result();
// 初始化REST SDK
$rest = new CCPRestSDK($this->serverIP,$this->serverPort,$this->softVersion);
$rest->setAccount($this->accountSid,$this->accountToken);
$rest->setAppId($this->appId);
// 发送模板短信
// echo "Sending TemplateSMS to $to <br/>";
$result = $rest->sendTemplateSMS($to,$datas,$tempId);
if($result == NULL ) {
$m3_result->status = 1;
$m3_result->message = 'result error!';
}
if($result->statusCode != 0) {
$m3_result->status = $result->statusCode;
$m3_result->message = $result->statusMsg;
}else{
$m3_result->status = 0;
$m3_result->message = '发送成功';
}
return $m3_result;
}
//sendTemplateSMS("18576437523", array('1234', '5'), '1');
}
- 数据返回接口文件定义:(M3Result.php)
<?php
namespace App\Tool\SMS;
class M3Result
{
public $status;
public $message;
public function toJson()
{
return json_encode($this, JSON_UNESCAPED_UNICODE); // json_encode这个函数的功能是将数值转换成json数据存储格式。
}
}
- CCPRestSDK 接口:
<?php
namespace App\Tool\SMS;
class CCPRestSDK{
private $AccountSid;
private $AccountToken;
private $AppId;
private $SubAccountSid;
private $SubAccountToken;
private $ServerIP;
private $ServerPort;
private $SoftVersion;
private $Batch; //时间sh
private $BodyType = "xml";//包体格式,可填值:json 、xml
private $enabeLog = true; //日志开关。可填值:true、
private $Filename="../log.txt"; //日志文件
private $Handle;
function __construct($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;
}
/**
* 设置子帐号
*
* @param SubAccountSid 子帐号
* @param SubAccountToken 子帐号Token
*/
function setSubAccount($SubAccountSid,$SubAccountToken){
$this->SubAccountSid = $SubAccountSid;
$this->SubAccountToken = $SubAccountToken;
}
/**
* 设置应用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 friendlyName 子帐号名称
*/
function createSubAccount($friendlyName)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
if($this->BodyType=="json"){
$body= "{'appId':'$this->AppId','friendlyName':'$friendlyName'}";
}else{
$body="<SubAccount>
<appId>$this->AppId</appId>
<friendlyName>$friendlyName</friendlyName>
</SubAccount>";
}
$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/SubAccounts?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 = '返回包体错误';
// }
return $datas;
}
/**
* 获取子帐号
* @param startNo 开始的序号,默认从0开始
* @param offset 一次查询的最大条数,最小是1条,最大是100条
*/
function getSubAccounts($startNo,$offset)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
$body="
<SubAccount>
<appId>$this->AppId</appId>
<startNo>$startNo</startNo>
<offset>$offset</offset>
</SubAccount>";
if($this->BodyType=="json"){
$body= "{'appId':'$this->AppId','startNo':'$startNo','offset':'$offset'}";
}else{
$body="
<SubAccount>
<appId>$this->AppId</appId>
<startNo>$startNo</startNo>
<offset>$offset</offset>
</SubAccount>";
}
$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/GetSubAccounts?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 = '返回包体错误';
// }
return $datas;
}
/**
* 子帐号信息查询
* @param friendlyName 子帐号名称
*/
function querySubAccount($friendlyName)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
if($this->BodyType=="json"){
$body= "{'appId':'$this->AppId','friendlyName':'$friendlyName'}";
}else{
$body="
<SubAccount>
<appId>$this->AppId</appId>
<friendlyName>$friendlyName</friendlyName>
</SubAccount>";
}
$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/QuerySubAccountByName?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 = '返回包体错误';
// }
return $datas;
}
/**
* 发送模板短信
* @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;
}
/**
* 外呼通知
* @param to 被叫号码
* @param mediaName 语音文件名称,格式 wav。与mediaTxt不能同时为空。当不为空时mediaTxt属性失效。
* @param mediaTxt 文本内容
* @param displayNum 显示的主叫号码
* @param playTimes 循环播放次数,1-3次,默认播放1次。
* @param respUrl 外呼通知状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知。
* @param userData 用户私有数据
* @param maxCallTime 最大通话时长
* @param speed 发音速度
* @param volume 音量
* @param pitch 音调
* @param bgsound 背景音编号
*/
function landingCall($to,$mediaName,$mediaTxt,$displayNum,$playTimes,$respUrl,$userData,$maxCallTime,$speed,$volume,$pitch,$bgsound)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
if($this->BodyType=="json"){
$body= "{'playTimes':'$playTimes','mediaTxt':'$mediaTxt','mediaName':'$mediaName','to':'$to','appId':'$this->AppId','displayNum':'$displayNum','respUrl':'$respUrl',
'userData':'$userData','maxCallTime':'$maxCallTime','speed':'$speed','volume':'$volume','pitch':'$pitch','bgsound':'$bgsound'}";
}else{
$body="<LandingCall>
<to>$to</to>
<mediaName>$mediaName</mediaName>
<mediaTxt>$mediaTxt</mediaTxt>
<appId>$this->AppId</appId>
<displayNum>$displayNum</displayNum>
<playTimes>$playTimes</playTimes>
<respUrl>$respUrl</respUrl>
<userData>$userData</userData>
<maxCallTime>$maxCallTime</maxCallTime>
<speed>$speed</speed>
<volume>$volume</volume>
<pitch>$pitch</pitch>
<bgsound>$bgsound</bgsound>
</LandingCall>";
}
$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/Calls/LandingCalls?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 = '返回包体错误';
// }
return $datas;
}
/**
* 语音验证码
* @param verifyCode 验证码内容,为数字和英文字母,不区分大小写,长度4-8位
* @param playTimes 播放次数,1-3次
* @param to 接收号码
* @param displayNum 显示的主叫号码
* @param respUrl 语音验证码状态通知回调地址,云通讯平台将向该Url地址发送呼叫结果通知
* @param lang 语言类型
* @param userData 第三方私有数据
*/
function voiceVerify($verifyCode,$playTimes,$to,$displayNum,$respUrl,$lang,$userData)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
if($this->BodyType=="json"){
$body= "{'appId':'$this->AppId','verifyCode':'$verifyCode','playTimes':'$playTimes','to':'$to','respUrl':'$respUrl','displayNum':'$displayNum',
'lang':'$lang','userData':'$userData'}";
}else{
$body="<VoiceVerify>
<appId>$this->AppId</appId>
<verifyCode>$verifyCode</verifyCode>
<playTimes>$playTimes</playTimes>
<to>$to</to>
<respUrl>$respUrl</respUrl>
<displayNum>$displayNum</displayNum>
<lang>$lang</lang>
<userData>$userData</userData>
</VoiceVerify>";
}
$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/Calls/VoiceVerify?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 = '返回包体错误';
// }
return $datas;
}
/**
* IVR外呼
* @param number 待呼叫号码,为Dial节点的属性
* @param userdata 用户数据,在<startservice>通知中返回,只允许填写数字字符,为Dial节点的属性
* @param record 是否录音,可填项为true和false,默认值为false不录音,为Dial节点的属性
*/
function ivrDial($number,$userdata,$record)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
$body=" <Request>
<Appid>$this->AppId</Appid>
<Dial number='$number' userdata='$userdata' record='$record'></Dial>
</Request>";
$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/ivr/dial?sig=$sig";
$this->showlog("request url = ".$url);
// 生成授权:主帐户Id + 英文冒号 + 时间戳。
$authen = base64_encode($this->AccountSid . ":" . $this->Batch);
// 生成包头
$header = array("Accept:application/xml","Content-Type:application/xml;charset=utf-8","Authorization:$authen");
// 发送请求
$result = $this->curl_post($url,$body,$header);
$this->showlog("response body = ".$result);
$datas = simplexml_load_string(trim($result," \t\n\r"));
// if($datas == FALSE){
// $datas = new stdClass();
// $datas->statusCode = '172003';
// $datas->statusMsg = '返回包体错误';
// }
return $datas;
}
/**
* 话单下载
* @param date day 代表前一天的数据(从00:00 – 23:59)
* @param keywords 客户的查询条件,由客户自行定义并提供给云通讯平台。默认不填忽略此参数
*/
function billRecords($date,$keywords)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
if($this->BodyType=="json"){
$body= "{'appId':'$this->AppId','date':'$date','keywords':'$keywords'}";
}else{
$body="<BillRecords>
<appId>$this->AppId</appId>
<date>$date</date>
<keywords>$keywords</keywords>
</BillRecords>";
}
$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/BillRecords?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 = '返回包体错误';
// }
return $datas;
}
/**
* 主帐号信息查询
*/
function queryAccountInfo()
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 大写的sig参数
$sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
// 生成请求URL
$url="https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/AccountInfo?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,"",$header,0);
$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 = '返回包体错误';
// }
return $datas;
}
/**
* 短信模板查询
* @param date templateId 模板ID
*/
function QuerySMSTemplate($templateId)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
if($this->BodyType=="json"){
$body= "{'appId':'$this->AppId','templateId':'$templateId'}";
}else{
$body="<Request>
<appId>$this->AppId</appId>
<templateId>$templateId</templateId>
</Request>";
}
$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/QuerySMSTemplate?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 = '返回包体错误';
// }
return $datas;
}
/**
* 呼叫状态查询
* @param callid 呼叫Id
* @param action 查询结果通知的回调url地址
*/
function QueryCallState($callid,$action)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
if($this->BodyType=="json"){
$body= "{'Appid':'$this->AppId','QueryCallState':{'callid':'$callid','action':'$action'}}";
}else{
$body="<Request>
<Appid>$this->AppId</Appid>
<QueryCallState callid ='$callid' action='$action'/>
</Request>";
}
$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/ivr/call?sig=$sig&callid=$callid";
$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 = '返回包体错误';
// }
return $datas;
}
/**
* 呼叫结果查询
* @param callSid 呼叫Id
*/
function CallResult($callSid)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 大写的sig参数
$sig = strtoupper(md5($this->AccountSid . $this->AccountToken . $this->Batch));
// 生成请求URL
$url="https://$this->ServerIP:$this->ServerPort/$this->SoftVersion/Accounts/$this->AccountSid/CallResult?sig=$sig&callsid=$callSid";
$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,"",$header,0);
$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 = '返回包体错误';
// }
return $datas;
}
/**
* 语音文件上传
* @param filename 文件名
* @param body 二进制串
*/
function MediaFileUpload($filename,$body)
{
//主帐号鉴权信息验证,对必选参数进行判空。
$auth=$this->accAuth();
if($auth!=""){
return $auth;
}
// 拼接请求包体
$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/Calls/MediaFileUpload?sig=$sig&appid=$this->AppId&filename=$filename";
$this->showlog("request url = ".$url);
// 生成授权:主帐户Id + 英文冒号 + 时间戳。
$authen = base64_encode($this->AccountSid . ":" . $this->Batch);
// 生成包头
$header = array("Accept:application/$this->BodyType","Content-Type:application/octet-stream","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 = '返回包体错误';
// }
return $datas;
}
/**
* 子帐号鉴权
*/
function subAuth()
{
if($this->ServerIP==""){
$data = new stdClass();
$data->statusCode = '172004';
$data->statusMsg = 'serverIP为空';
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->SubAccountSid==""){
$data = new stdClass();
$data->statusCode = '172008';
$data->statusMsg = '子帐号为空';
return $data;
}
if($this->SubAccountToken==""){
$data = new stdClass();
$data->statusCode = '172009';
$data->statusMsg = '子帐号令牌为空';
return $data;
}
if($this->AppId==""){
$data = new stdClass();
$data->statusCode = '172012';
$data->statusMsg = '应用ID为空';
return $data;
}
}
/**
* 主帐号鉴权
*/
function accAuth()
{
if($this->ServerIP==""){
$data = new stdClass();
$data->statusCode = '172004';
$data->statusMsg = 'serverIP为空';
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;
}
}
}
第二步:Laravel发送手机号验证码实现逻辑:(controllers)
namespace App\Http\Controllers\Home;
use App\Tool\SMS\M3Result;
use App\Tool\SMS\SendTemplateSMS;
use App\Tool\SMS\CCPRestSDK;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
class 类 extends Controller{
public function sendCode(Request $request)
{
//1.获取要发送的手机号
$phone = $request->phone;
//2.生成模板中需要的参数,验证码和时间
$code = rand(1000, 9999);
$arr = [$code, 5];
//3.调用容联。云通讯的接口
$templateSMS=new SendTemplateSMS();
$M3result=new M3Result();
$M3result=$templateSMS->sendTemplateSMS($phone,$arr,1);
//4.将验证码存入session
session()->put('phone',$code);
//5。给客户端返回容联云通讯的响应结果
return $M3result->toJson();
}
}
第三步:Laravel发送手机号验证码前台代码(views)
- 表单部分(form)
<input name="phone" placeholder="手机号" type="text" lay-verify="phone" class="layui-input" >
<hr class="hr15">
<input name="code" style="width: 150px; float: left;" placeholder="手机验证码" type="text" class="layui-input">
<a href="javascript:;" id="yzm" onclick="sendCode();" style="width: 150px; float: right; display: block; font-size: 16px;color: #00a67c">发送验证码</a>
- js 部分
<script>
//点击发送验证码按钮
function sendCode() {
//倒计时60秒
var countdown=60;
//设置时间限制
function settime() {
if (countdown == 0){
$('#yzm').attr('onclick','sendCode'); //当时间为0的时候 ,点击发送验证码开始倒计时
$('#yzm').text('发送验证码');
countdown=60;
}else{
$('#yzm').removeAttr('onclick','sendCode');
$('#yzm').text('重新发送('+countdown+'s)');
countdown--;
setTimeout(function () { settime(); },1000); //1 秒(1000 毫秒)后弹出 显示的重新发送 。。。秒。
}
}
//1.获取手机号
var phone=$('input[name=phone]').val();
//2.判断手机号是否为空
if (!phone){
layer.msg('手机号为空');
return ;
}
//调用时间限制出来
settime();
//3.触发ajax,请求验证码,根据是否成功给提示信息
$.get('sendcode',{'phone':phone},function (data) {
if (data.status==1){
layer.msg('发送失败',{'time':1000,'icon':5});
}else{
layer.msg('发送成功',{'time':1000,'icon':6});
}
});
}
</script>
第四步:路由(routes)
Route::get('sendcode','Home\RegisterController@sendCode'); //发送验证码