Php集成容联短信验证码功能
1. 准备工作:
单独建立一个容联短信验证的类RonglianApi.php,内容如下:
<?php
/*
* Copyright (c) 2014 The CCP project authors.All Rights Reserved.
*
* Use of this source code is governed by aBeijing Speedtong Information Technology Co.,Ltd license
* that can be found in the LICENSE file in theroot of the web site.
*
* http://www.yuntongxun.com
*
* An additional intellectual property rightsgrant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root ofthe source tree.
*/
class REST {
private$AccountSid;
private$AccountToken;
private$AppId;
private$ServerIP;
private$ServerPort;
private$SoftVersion;
private$Batch; //时间戳
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');
}
/**
* 设置主帐号
*
* @paramAccountSid 主帐号
* @paramAccountToken 主帐号Token
*/
functionsetAccount($AccountSid,$AccountToken){
$this->AccountSid = $AccountSid;
$this->AccountToken = $AccountToken;
}
/**
* 设置应用ID
*
* @paramAppId 应用ID
*/
functionsetAppId($AppId){
$this->AppId = $AppId;
}
/**
* 打印日志
*
* @param log日志内容
*/
functionshowlog($log){
if($this->enabeLog){
fwrite($this->Handle,$log."\n");
}
}
/**
* 发起HTTPS请求
*/
functioncurl_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 短信接收彿手机号码集合,用英文逗号分开
* @paramdatas 内容数据
* @param$tempId 模板Id
*/
functionsendTemplateSMS($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;
}
/**
* 主帐号鉴权
*/
functionaccAuth()
{
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;
}
}
}
?>
2. 新建一个send.php文件,单独写一个发送函数:
function sendSMS($to, $datas, $tempId) {
// require_once("../RonglianSms/RonglianApi.php");
// include_once ('../RonglianSms/Ronglian_config.php');
require_once("RonglianApi.php");
global $accountSid, $accountToken, $appId,$serverIP, $serverPort, $softVersion;
//主帐号,对应开官网发者主账号下的 ACCOUNT SID
$accountSid = '8a48b55152a56fc20152f1d6d813597';
//主帐号令牌,对应官网开发者主账号下的 AUTH TOKEN
$accountToken = '24ba2f35da53433b962418c2ea33055';
//应用Id,在官网应用列表中点击应用,对应应用详情中的APPID
//在开发调试的时候,可以使用官网自动为您分配的测试Demo的APP ID
$appId ='8a48b55152a56fc20152f1da900d598';
//请求地址
//沙盒环境(用于应用开发调试):sandboxapp.cloopen.com
//生产环境(用户应用上线使用):app.cloopen.com
$serverIP = 'sandboxapp.cloopen.com';
//请求端口,生产环境和沙盒环境一致
$serverPort = '8883';
//REST版本号,在官网文档REST介绍中获得。
$softVersion = '2013-12-26';
// 初始化REST SDK
$rest =new REST($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!";
break;
}
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 添加成功处理逻辑
}
}
3. 调用发送函数:
publicfunction webSendSMS()
{
$tel =$_REQUEST['tel'];
$type =$_REQUEST['type'] ?: 1;//1注册2忘记密码
if(empty($tel)) {
die('手机号未填写');
}
if(empty($type)) {
die('类型未写');
}
$rand =rand(1000, 9999);
$data =array('recode_telphone' => $tel,
'recode_type' => $type,
'recode_dateline' => date('Y-m-d H:i:s', time()),
'recode_number' => $rand);
$userInfo = $this->model->table('users')->where('user_tel =' .$tel)->find();
if($userInfo) {
die('用户已经注册');
}
$getrecodeinfo =$this->model->table('get_recode')->where("recode_telphone ='" . $tel . "' and recode_type ='" . $type ."'")->find();
if($getrecodeinfo) {
$this->model->table('get_recode')->data($data)->where("recode_id= '" . $getrecodeinfo['recode_id'] . "'")->update();
} else {
$this->model->table('get_recode')->data($data)->insert();
}
//调用发送函数:
$ip = "1";
$this->sendSMS($tel, array($rand,'5'),$ip);
die('1');
}