短信接口API

jadebing 2022-01-01 原文


短信接口API

我用的FLEA,可能大家都没听说过,但原理是一样的,大家适当参考下吧。

  1. token和client_token我是配置在一个config文件里的

    array(
    \’token\’ => \’ aaaa\’,
    \’param\’ =>array(
    \’url\’ => \’http://\’, // 短信接口地址
    \’method\’=>\’sms.send\’, // 接口名称 自己定义的
    \’client_token\’ => \’bbbbbbb\’,
    )
    ),
    );
    ?>

2.api接口

<?php
        FLEA::loadClass(\'TMIS_Controller\');
        class Controller_Org_Sms extends TMIS_Controller {
                    var $_json;//从json文件载入后的对象
                    var $_arr_method=array();//所有的方法名列表
                    var $_method;//当前的方法
                    var $_params;//当前参数
                    var $_success;//是否成功
                    var $_msg;//失败的错误信息,或者成功后的结果json
                    // var $_modelExample;

                    function __construct() {
                            // $this->_modelExample = & FLEA::getSingleton(\'Model_Jichu_Message\'); 这个是记录发送短信的信息内容,发送人,时间等的表,如果不需要存数据库,可以不用
                            $this->_url = "发送短信的url";
                    }



        /**
             * 生成签名的算法,这个算法应该每个短信接口的网站都有自己的算法规则,我这里是互亿的签名算法
        */
                  private function getSign($params ,$token_client = \'\'){
   
                        //签名步骤一:按字典序排序参数
                         ksort($params , SORT_STRING);

                        $string = http_build_query($params);

                        //签名步骤二:在string后加入Token
                        $string = $string . "&client_token=".$token_client;
                        return strtoupper(md5($string));
                }

//发送短信的接口
                public function sendSms($params = array()){
                        $data = array(
                                \'to\'           =>$params[\'to\'],
                                \'content\'      =>$params[\'content\'],
                                \'curtime\'      =>time()-1,
                            );
                        return $this->callApi($data);
                }

            function callApi($post) {
                        require "Config/sms_config.php";
                        $arrSMS = $sms_config[\'SMS\'];
                        $param = $arrSMS[\'param\'];

                        $url = $param[\'url\'];
                        $token = $arrSMS[\'token\'];

                        $post[\'client_token\'] = $arrSMS[\'param\'][\'client_token\'];
                        $post[\'method\'] = $arrSMS[\'param\'][\'method\'];

                        $post[\'sign\'] = $this->getSign($post ,$token);

                        //curl post 请求
                        $objRequest = FLEA::getSingleton(\'Api_Httprequest\'); //调用第三步Api_Httprequest类
                        $result = $objRequest->post($post,$url);

                        $result = json_decode($result ,1);
                        return $result;
}

}
?>

3.curl 的 post请求和get请求封装成一个类

    <?php
        /*********************************************************************\
         *  Remark :用curl模拟http请求,用来访问api,一般在api的调用方被包含
        \*********************************************************************/
        class Api_Httprequest{

        //post方式提交数据,注意post_data不能有嵌套的数组
        public function post($post_data,$url) {
                        $ch = curl_init();
                        curl_setopt($ch, CURLOPT_POST, 1);
                        curl_setopt($ch, CURLOPT_HEADER, 0);
                        curl_setopt($ch, CURLOPT_URL,$url);
                        //设置cURL 参数,要求结果保存到字符串中还是输出到屏幕上, 0为直接输出屏幕,非0则不输出
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                        //为了支持cookie
                        //curl_setopt($ch, CURLOPT_COOKIEJAR, \'cookie.txt\');
                        /*
                        // POST数据
                        curl_setopt($ch, CURLOPT_POST, 1);
                        // 把post的变量加上
                        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
                        */
                        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
                        //curl_excc会输出内容,而$result只是状态标记
                        $result = curl_exec($ch);
                        $errorCode = curl_errno($ch);
                        //释放curl句柄
                        curl_close($ch);

                        if(0 !== $errorCode) {
                                $this->_success = false;
                                $this->writeLog($url ,$post_data);
                        return false;
                        }

            $this->_success = true;
            $this->_msg = $result;
            $this->writeLog($url ,$post_data);
            // $result = ob_get_contents();
            // ob_end_clean();
            return $result;
    }

    function get($query,$url) {
            $info = parse_url($url);#print_r($info);exit;
            $fp = fsockopen($info["host"], 80, $errno, $errstr, 3);
            $head = "GET ".$info[\'path\']."?".$info["query"]." HTTP/1.0\r\n";
            $head .= "Host: ".$info[\'host\']."\r\n";
            $head .= "\r\n";
            $write = fputs($fp, $head);
            while (!feof($fp)) {
                    $line = fread($fp,4096);
                    echo $line;
            }
}

}
?>

4.前台传值代码




获取验证码

		        </div>
      
                       <button type="submit" id="submit" tabindex="4">登 录</button>
<script type="text/javascript">
    //点击获取验证码按钮
        $(\'.action-get-verifycode\').click(function(e){
		e.preventDefault();
        var el = document.getElementById(\'username\') ;
        var elp = document.getElementById(\'password\') ;
        if(this.hasClass(\'disabled\')) return false;
        sendVerify(this,\'username\' + \'=\' + el.value + \'&password\' + \'=\' + elp.value);
});

	function sendVerify(el,data) {
    var url = el.href;
    var textCont = el.getElement(\'span span\');
	el.addClass(\'disabled\');
 	// $(el).find(\'span\').attr(\'disabled\',true);
 	// $(el).attr(\'disabled\',true);
    textCont.innerHTML = el.innerText + \'(<i>0</i> )\';
    var ttt = textCont.getElement(\'i\');
    var cd = new countdown(textCont.getElement(\'i\'), {
        start: 60,
        secondOnly: true,
        callback: function(e) {
            el.removeClass(\'disabled\');
            textCont.innerHTML = \'重发验证码\';
        }
    });
    Query.send(url, el, data, function(rs) {
        if(rs.success) {
            cd.stop();
            el.removeClass(\'disabled\');
            textCont.innerHTML = \'重发验证码\';
        }else{
            cd.stop();
        	el.removeClass(\'disabled\');
            textCont.innerHTML = \'获取验证码\';
        }
    });
}

5.验证用户名,密码,短信发送次数等,然后 调用方法:

//随机取6位字符数
public function randomkeys($length){
$key = \’\’;
$pattern = \’1234567890\’; //字符池
for($i=0;$i<$length;$i++){
$key .= $pattern{mt_rand(0,9)}; //生成php随机数
}
return $key;
}

//设置session保存时间

public function start_session($expire = 0) {
if ($expire == 0) {
$expire = ini_get(\’session.gc_maxlifetime\’);
} else{
ini_set(\’session.gc_maxlifetime\’, $expire);
}
session_start();
setcookie(session_name(), session_id(), time() + $expire, “/”);
}

从前台传入用户名和密码,判断是否正确
function actionSetVcode(){

	//判断是否填写用户名
	if($_POST[\'username\']){
		$p[\'username\']=$_POST[\'username\'];
	}else{
		$msg = "无效用户名!";
		echo json_encode(array(\'success\'=>false,\'msg\'=>$msg));
		exit;
	}

	$m=FLEA::getSingleton(\'Model_Acm_User\');//加载用户的数据库

	//判断用户名和密码是否一致
	$str = " SELECT passwd from acm_userdb where userName=\'{$p[\'username\']}\'";
	$passwd = $m->findBySql($str);

	if($passwd[0][\'passwd\']!=$_POST[\'password\']){
		$msg = "用户名和密码不一致!";
		echo json_encode(array(\'success\'=>false,\'msg\'=>$msg));
		exit;
	}

	//判断用户是否绑定手机号
	$sql = "SELECT phone from acm_userdb where userName=\'{$p[\'username\']}\'";
	$rs = $m->findBySql($sql);

	if(!$rs[0][\'phone\'] && $p[\'username\']!=\'admin\'){
		$msg = "对应用户可能没绑定手机号!";
		echo json_encode(array(\'success\'=>false,\'msg\'=>$msg));
		exit;
	}

	$_SESSION[\'count\'] = isset($_SESSION[\'count\'])?$_SESSION[\'count\']:0;
	if($_SESSION[\'count\']>=3){
		$msg = "今日发送次数已用完";
		echo json_encode(array(\'success\'=>false,\'msg\'=>$msg));
		exit;
	}

    if( time() - $_SESSION[\'lastmodify\'] < 120 ){
                $msg = \'2分钟发送一次,还没到两分钟则不进行发送\';
                echo json_encode(array(\'success\'=>false,\'msg\'=>$msg));
	    exit;
        }




    $vcode = $this->randomkeys(6);//取得随机6位数验证码

    $mobile = $rs[0][\'phone\'];
    $time_sess = 3600 * 3;//设置验证码有效时间
	$this->start_session($time_sess);

    $_SESSION[\'VcodeforLogin\'] = $vcode;
    $_SESSION[\'mobileforLogin\'] = $mobile;
    $_SESSION[\'username\'] = $_POST[\'username\'];
    $_SESSION[\'password\'] = $_POST[\'password\'];
    $_SESSION[\'count\'] ++;
    $_SESSION[\'lastmodify\'] = time();

    $content = "您的验证码是:".$vcode."。请不要把验证码泄露给其他人。";

$Sms = FLEA::getSingleton(\'Controller_Org_Sms\');//加载api控制器接口
$result = $Sms->sendSms(array(\'to\'=>$mobile ,\'content\'=>$content));//调用sendSms方法,$mobile是发送给谁,$content是发送的内容,

    $result =  json_decode($result,1);

    $arr = array(\'success\'=>true);
	echo json_encode($arr);exit;//
}

6.点击登录,传用户名,密码,填写的验证码和发送的验证码是否一致;
//确定按钮点击后效果
$(\’#form_login\’).submit(function(){

		var verify = $(\'#verify\').val();
		var username = $(\'#username\').val();
		var password = $(\'#password\').val();


			//填写验证码
		var url = "?controller=Login&action=loginIndex";
		var param = {
				\'username\':username,
				\'password\':password,
				\'verify\':verify
		};
		$(\'#submit\').attr(\'disabled\',true);
		$.ajax({
	            type: "POST",
	            url: url,
	            data: param,
	            dataType: \'json\',
	            async: false,//同步操作
	            success:function(json){
	            	console.log(json);
		            if(json.success==false){
		                showError(json.msg);
		                setTimeout(function(){
							$(\'#submit\').attr(\'disabled\',false);
							$(\'#submit\').text(\'登 录\');

						}, 500);
		        		return false;

		            }else{
		                showMsg(\'登陆成功\');
		            }
	           },

	        });
	        var urls = "?controller=Main&action=Index";
		setTimeout(function(){window.location.href=urls;}, 500);

	        return false;

		$(\'#submit\').attr(\'disabled\',true);
		$(\'#submit\').text(\'登录中…\');
		$(this).ajaxSubmit({
			\'data\':{\'is_ajax\':true},
			success:function(t,b,f){
				var json = eval("("+t+")");
				if(json.success==true){
					showMsg(\'登陆成功\');
					setTimeout(function(){window.location.href=json.href;}, 500);
				}else{
					showError(json.msg);
					setTimeout(function(){
						$(\'#submit\').attr(\'disabled\',false);
						$(\'#submit\').text(\'登 录\');
					}, 500);
				}
			}
		});
		
		return false;
	});
发表于
2017-12-25 14:23 
少不更事、 
阅读(1715
评论(0
编辑 
收藏 
举报

 

版权声明:本文为jadebing原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/jadebing/p/8109202.html

短信接口API的更多相关文章

随机推荐

  1. Windows版本redis高可用方案探究

    目录 前言 前提 搭建redis主从 配置主redis-28380 配置从redis-23381 配置从red […]...

  2. Cordova的优点及缺点

    简介 Cordova是一个用基于HTML、CSS和JavaScript的,用于创建跨平台移动应用程序的快速开发 […]...

  3. Matlab 【解一元一次方程】

    ============================ syms r; //声明变量 r r=solve(\ […]...

  4. 带坑使用微信小程序框架WePY组件化开发项目

     纯粹用来记录,以防再犯~ 1. 接手的wepy项目版本是 1.7.2 ,so我没有初始化的过程… […]...

  5. Flutter loading

    如何和原生APP系统自带的一样实现一个通用的loading? 有多种实现方式,这里举例两种: 第一:用Over […]...

  6. Key-Value Store Indexer(Lily HBase Indexer) 小型采坑

    环境: Cloudera Express 5.12.1 JDK 1.8.0_92 CentOS 7 步骤1:数 […]...

  7. 软件工程第六次作业 – 陆(H)

    软件工程第六次作业 团队作业:项目的总结与反思,请从以下方面展开: 1、选题 2、团队合作及冲突解决 3、项目 […]...

  8. 移动 web 开发问题和优化小结

    1.前言 到目前为止,互联网行业里,手机越来越智能化,移动端占有的比例越来越高,尤其实在电商,新闻,广告,游戏 […]...

展开目录

目录导航