我们短信api用的是云信使平台提供的非免费短信服务:官网提供的demo有两种,分别是function加其调用、class文件加其调用、

在这里我们用class文件加调用;

首先,ThinkPHP里面自定义类文件,非常简单,1、按照传智播客方法,在项目之中任意地方创建classname.class.php文件,将里面的class声明到某个namespace下面,然后$class=new \namespacename\classname();这样去实例化,复习一下,class()括号里面是可以传递参数的,类实例化时候也是可以传递参数的,但是类定义的时候是class{###}所以传递参数定义是在里面的__construct()也就是构造方法之中;2、自己在urban项目之中是,将云信使平台提供的类文件放在ThinkPHP的liberary文件夹里面:

 <?php
 namespace Org\Util;
 class SmsApi {
     /**内部逻辑除参数传递之外不需要我们修改**/
 }
 ?>

然后我们在Home模块的controller里面实例化:

 <?php
 namespace Home\Controller;
  header('Content-Type:text/html; charset=utf-8');
 class SendController extends CommonController{
     //发送短信的控制类为index
 public function sendsms($phone)
             {
                 //接口账号
                 $uid =  C('message.uid');

                 //登录密码
                 $pwd = C('message.pwd');

                 /**
                 * 实例化接口
                 *
                 * @param string $uid 接口账号
                 * @param string $pwd 接口密码
                 */
                 $api = new \Org\Util\SmsApi($uid,$pwd);

                 //发送的手机 多个号码用,英文逗号隔开
                 $mobile = $phone;

                 $coded=$api->randNumber();
                 //短信内容
                 $content="您好!您的验证码是".$coded."。请尽快验证。【urban】";
                 //发送全文模板短信
                 $result = $api->sendAll($mobile,$content);

                 $_SESSION['sms_code']=$coded;//将发送的验证码数据存储session里面

                 if($result['stat']=='100')
                 {
                     return array('html'=>'发送成功');//这里之所以写成数组,是为了ajax函数返回json格式数据方便处理用
                 }
                 else
                 {
                     return array('html'=>'发送失败:'.$result['stat'].'('.$result['message'].')');
                 }

     }
 }
 ?>

其实和第一种是一样的实例化,只是放置的位置不一样而已,也就是命名空间不一样而已,顺便说一下上面的C方法,其实就是在config.php文件定义的数据:

 <?php
 return array(
     /*--------以下为短信接口的一些参数--------*/
     'message' => array(
          //申请的短信接口平台
          'http' => 'http://api.sms.cn/sms/',
          //申请时候的用户账号
         'uid' => '***',
         //申请时候的用户密码
         'pwd' => '***',
          )
     );13   ?>

好啦,现在我们已经将官方给的class以及控制器都引入TP之中了,那么现在需要写一个方法去实例化控制器(并且传入控制器必要的参数,而在控制器被实例化

也就是会实例化短信发送接口类文件),function:

 public function sendsms(){
     $input = I('post.');
     $phone=$input['phone'];//接收到电话号码,传递给短信发送接口函数用于发送短信
     $Send=A("Send");//实例化短信发送控制器
     $res=$Send->sendsms($phone);
     if($res){
       $this->ajaxReturn($res,'JSON');
      }
 }

当然你没有看错,后面那个$this->ajaxReturn()就是告诉你,在前台点击发送短信发送ajax请求给这个方法,这个是一个ajax接口函数;

现在教教你如何实现点击之后发送ajax请求并且开始倒计时,倒计时内无法点击发送短信按钮:

 <div >
   <label ><span><input name="data[mobile]" id="phone" type="text" value="" placeholder="請輸入常用的手機號" ></span></label>
 </div>
  <div>
  <label data-toggle="tooltip" data-placement="bottom" data-html="text"
   title="若手機裝有安全類軟件,短信可能會被攔截,如果未收到短信提示請查看安全類軟件是否標記為垃圾短信!"><span>
  <input name="phone" type="text" placeholder="短信验证码"></span>
  <input  style="fontSize:13px;" type="button" value="获取验证码" id="btnSendCode" onclick="sendMessage()"></input></label>
  </div>

给你看看javascript代码:

 <script type="text/javascript">
     /*-------------------------------------------*/
     var InterValObj; //timer变量,控制时间
     var count = 120; //间隔函数,1秒执行
     var curCount;//当前剩余秒数
     var code = ""; //验证码
     var codeLength = 6;//验证码长度
     function sendMessage() {
         curCount = count;
         var phone=$("#phone").val();//手机号码
         if(phone != ""){
             // //产生验证码
             // for (var i = 0; i < codeLength; i++) {
             //     code += parseInt(Math.random() * 9).toString();
             // }
             //设置button效果,开始计时
             $("#btnSendCode").attr("disabled", "true");
             InterValObj = window.setInterval(SetRemainTime, 1000); //启动计时器,1秒执行一次
             //向后台发送处理数据
             $.ajax({
                 type: "POST", //用POST方式传输
                 dataType: "JSON", //数据格式:JSON
                 url: "{:U('Index/sendsms')}", //目标地址
                 data: {"phone": phone },
                 error: function (res) {
                     alert(res.html);
                  },
                 success: function (res){
                     alert(res.html);
                 }
             });
         }else{
             alert("手机号码不能为空!");
         }
     }
     //timer处理函数
     function SetRemainTime() {
         if (curCount == 0) {
             window.clearInterval(InterValObj);//停止计时器
             $("#btnSendCode").removeAttr("disabled");//启用按钮
             $("#btnSendCode").val("重新发送验证码");
             code = ""; //清除验证码。如果不清除,过时间后,输入收到的验证码依然有效
         }
         else {
             curCount--;
             $("#btnSendCode").val( curCount + "内重新发送");
         }
     }
     </script>

看到没,当点击发送短信的时候,随即开始倒计时,并且在倒计时内button的属性为disabled,也就是不可点击;

这样就实现了想要的前端效果

附加:云信使之中的变量模板以及全文模板如何设置、、以及他们的差别所在,懂吧???上面的有个设置发送过去的短信验证码存入session是为了在提交用户资料时候用于验证用户输入的短信验证码是否正确;

短信接口调用以及ajax发送短信接口实现以及前端样式的更多相关文章

  1. android中调用系统的发送短信、发送邮件、打电话功能

    1 调用发送短信功能: Uri smsToUri = Uri.parse("smsto:");  Intent sendIntent = new Intent(Intent.ACT ...

  2. 中国网建SMS短信接口调用(java发送和接收手机短信)

    1.先注册账号,一定要填写好签名格式.不填会返回-51错误.   代码信息接口详细==>http://sms.webchinese.cn/api.shtml   . 2.测试代码 package ...

  3. c# 调用短信平台接口,给手机发送短信

    项目上要做个发手机短信的功能.网上找找了,用的微米的短信接口. 注册后,获得UID和UID key,C#代码中需要这个 调用代码很简单 ", con = "[微米]您的验证码是:6 ...

  4. .net短信接口调用示例(106短信通道)

    1. [代码]调用代理示例 using System;using System.Data;using System.Configuration;using System.Collections;usi ...

  5. 接口调用实现类&& 为什么Autowired定义在接口上

    1.接口与回调 package edu.cqu.interfaceTest; import java.awt.Toolkit; import java.awt.event.ActionEvent; i ...

  6. IOS中调用系统拨打电话发送短信

    一.调用打电话界面 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[NSString stringWithFormat ...

  7. zabbix短信接口调用

    #!/bin/bash TIME=`date +%Y-%m-%d` KEY="UJK9rk50HD8du8JE8h87RUor0KERo5jk" username="za ...

  8. iOS开发之调用系统打电话发短信接口以及程序内发短信

    在本篇博客开头呢,先说一下写本篇的博客的原因吧.目前在做一个小项目,要用到在本应用程序内发验证码给其他用户,怎么在应用内发送短信的具体细节想不大起来了,于是就百度了一下,发现也有关于这方面的博客,点进 ...

  9. Linux系统中调用短信猫发送短信(笔记)

    1, 拷贝底层串口依赖的librxtxSerial.so到JDK安装路径cp librxtxSerial.so /usr/java/{0}/jre/lib/{1} # {0}: JDK的基础目录,例如 ...

随机推荐

  1. 九度OJ1207

    题目给你了一个很大的n,然后让你去计算它的质因数.对N进行开方得到的是一个大约在32000左右的数,我们可以用埃氏筛法进行素数打表.对所有prime[i]<=sqrt(n),分别看prime[i ...

  2. Ubuntu 之 initramfs 报错解决之一

    问题出现: ubuntu 更新后,编辑文件提示权限不够,并提示更新错误,重启后进入 initramfs ,仔细看提示错误有: file system check of the root filesys ...

  3. Centos安装(更新)git(亲测有效)

    Centos 6.5默认安装的是git 1.7.X 版本,使用过程中会有一些奇怪的问题,对于用户名.密码支持不是很友好.将Centos6.5上的git更新到2.0.5,方法如下: 1.安装编译git时 ...

  4. (medium)LeetCode 222.Count Complete Tree Nodes

    Given a complete binary tree, count the number of nodes. Definition of a complete binary tree from W ...

  5. win10 10586 关机便利贴报内存不能为 read 应用程序错误

    解决方案: 最小化便利贴后关机.

  6. CSS 子元素选择器与后代选择器区别实例讲解

    css子元素选择器和后代选择器在功能描述上非常相同,但是他们其实是有区别的,本文章通过两个简单的实例向大家介绍子元素选择器与后代选择器的区别,需要的朋友可以参考一下. 首先我们来了解一下子元素选择器与 ...

  7. Html5——地理定位及地图

    常用的navigator.geolocation对象有以下三种方法: 获取当前地理位置:navigator.geolocation.getCurrentPosition(success_callbac ...

  8. XBox360-双光盘游戏自制GOD

    一直在找极限竞速4(Forza4),虽然这个版本比较老,但因为带体感.终于下到了,可惜是2个ISO.试着自己做GOD.用到两个软件:Iso2God和Xbox Backup Creator(俗称XBC) ...

  9. 欧几里得算法与扩展欧几里得算法_C++

    先感谢参考文献:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 注:以下讨论的数均为整数 一.欧几里得算法(重点是证 ...

  10. It English 每日更新

    unary operator 一元运算符 short circuit evaluation 短路经查询