thinkphp5开发的时候需要用到短信验证码,在官网下载下来demo后,不放入thinkphp框架中能正常运行,但是放入框架中出现了很多错误,直接贴上配置好的代码吧,特别注意的是,demo代码中有new stdClass();但是框架报错not found,经过调试,找到的解决办法是将new stdClass();改为new \stdClass();就可以了,只是在stdClass前面加了一个反斜杠‘\’我把容联的demo放到框架的extend目录下,修改后的代码如下:
1.SendCode.php
serverIP, $this->serverPort, $this->softVersion);
$rest->setAccount($this->accountSid, $this->accountToken);
$rest->setAppId($this->appId);
// 发送模板短信
echo "Sending TemplateSMS to $to
";
$result = $rest->sendTemplateSMS($to, $datas, $tempId);
if ($result == NULL) {
echo "result error!";
}
if ($result->statusCode != 0) {
echo "error code :" . $result->statusCode . "
";
echo "error msg :" . $result->statusMsg . "
";
//TODO 添加错误处理逻辑
} else {
echo "Sendind TemplateSMS success!
";
// 获取返回信息
$smsmessage = $result->TemplateSMS;
echo "dateCreated:" . $smsmessage->dateCreated . "
";
echo "smsMessageSid:" . $smsmessage->smsMessageSid . "
";
//TODO 添加成功处理逻辑
}
}
}
2.REST.php
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 = "172001 网络错误 ";
}
}
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;$iAppId','datas':[".$data."]}";
}else{
$data="";
for($i=0;$i".$datas[$i]."";
}
$body="
$to
$this->AppId
$tempId
".$data."
";
}
$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;
}
}
}
3.thinkphp5框架默认的index控制器代码(Index.php)
sendTemplateSMS("电话号码",array('验证码','有效时间'),"1");
}
}
将上诉代码复制到自己的框架中,修改SendCode.php中的$accountSid、$authToken、$appId,Index.php中填入接收验证码的手机号、要发送的验证码、验证码有效时间即可,访问控制器index的index方法即可运行成功。下面是代码结构图