手机验证码及注册流程的实现
前提: 1.注册阿里大鱼账号
2.移入头像点击下方的accesskey, 开始使用子用户accesskey,
填写用户名\选择权限(输入'短信'二字,选择)\创建用户.会获取到ID和Secret.
3.点击上方的产品与服务,找到'云通讯'下的'短信服务'.认真填写
签名管理 和 模板管理. 要用到签名名称和模板code.短信内容就是模板内容,请认真填写,
必须审核通过才可以开始下一步.
4.下载SDK,网址: https://help.aliyun.com/document_detail/55359.html?spm=5176.doc55451.6.569.0uXt4J
选择PHP,点击下载 用到的只有'api_sdk',改变文件名为 'dysms',放到网站的api目录里面.
功能描述:
输入手机号,点击{ajax}获取验证码,判断手机号是否已经注册.已注册给出提示,如果未注册的话发送手机验证码.如果验证码发送成功的话,把‘获取验证码’改为'倒计时',注意:发送成功 后台数据库要新建一个表(smsverif)用来存储 手机
号,验证码,发送时间. 因为点击'注册'的时候要与发送时间去进行判断 ‘验证码是否相等,时间是否在有效时间内’. 最后
点击注册post提交 注意:不管是 ajax还是submit 提交方式都要改成 post,可以自行去测试,我并不知道对不对. 提交过去之后去跟smsverif表
查询手机号和验证码是否存在,存在的话在进行判断是否在有效时间内,如果都成功的话,格式化想要存储的数据放到session里面跳转至
相应的页面.
实现思路:(只贴一些重要的代码)
/*倒计时
手机登录注册时使用
*/
function countdown(){
var mydate= new Date();//获取当前时间
mydate.setMinutes(mydate.getMinutes()+1); //当前时间加1分钟
var end_time = new Date(mydate).getTime();//月份是实际月份-1
var sys_second = (end_time-new Date().getTime())/1000;
var timer = setInterval(function(){
if (sys_second > 1) {
sys_second -= 1;
var second = Math.floor(sys_second % 60);
$("#btn_code").attr("disabled","true");//添加disabled属性
$("#btn_code").css("color","red");
$("#btn_code").html(second+"s(已发送)");
} else {
$("#btn_code").removeAttr("disabled");//移除disabled属性
$("#btn_code").css("color","#999");
$("#btn_code").html("获取验证码");
clearInterval(timer);//清除定时器
}
},1000);
}
/**
* 发送验证码
* @param[integer] $mobile [手机号]
*/
public function send_mobile($mobile){
$code=$this->createSMSCode($length = 4); //用于生成验证码
require_once './application/Api/dysms/vendor/autoload.php';//路径一定要检测是否正确
Config::load();//加载区域结点配置
$accessKeyId = '';//阿里大鱼id
$accessKeySecret = '';//阿里大鱼Secret
$templateCode = ''; //短信模板ID,我就是随便写的
//短信API产品名(短信产品名固定,无需修改)
$product = "Dysmsapi";
//短信API产品域名(接口地址固定,无需修改)
$domain = "dysmsapi.aliyuncs.com";
//暂时不支持多Region(目前仅支持cn-hangzhou请勿修改)
$region = "cn-hangzhou";
// 初始化用户Profile实例
$profile = DefaultProfile::getProfile($region, $accessKeyId, $accessKeySecret);
// 增加服务结点
DefaultProfile::addEndpoint("cn-hangzhou", "cn-hangzhou", $product, $domain);
// 初始化AcsClient用于发起请求
$acsClient = new DefaultAcsClient($profile);
// 初始化SendSmsRequest实例用于设置发送短信的参数
$request = new SendSmsRequest();//注意打印$request,确定里面是否有下面的参数,我的是phoneNumbers(),有的是mobileNumbers();
// 必填,设置短信接收号码
$request->setphoneNumbers($mobile);
// 必填,设置阿里大鱼签名名称
$request->setSignName('');
// 必填,设置大鱼模板CODE
$request->setTemplateCode('');
$smsData = array('code'=>$code);//所使用的模板若有变量 在这里填入变量的值我的变量名为username此处也为username
//选填-假如模板中存在变量需要替换则为必填(JSON格式),友情提示:如果JSON中需要带换行符,请参照标准的JSON协议对换行符的要求,比如短信内容中包含/r/n的情况在JSON中需要表示成//r//n,否则会导致JSON在服务端解析失败
$request->setTemplateParam(json_encode($smsData));
//发起访问请求
$acsResponse = $acsClient -> getAcsResponse($request);
//返回请求结果
$result = json_decode(json_encode($acsResponse), true);
$resp = $result['Code'];//resp等于OK,则表示是发送成功,除此之外都是错误信息,文档里面有专门的参数详解,可以据此找出错误原因.
文档:https://help.aliyun.com/document_detail/55284.html?spm=a2c4g.11186623.2.3.erDhsw.
$this->sendMsgResult($resp,$mobile,$code);//如果$resp == OK,数据库添加必要数据,ajax返回.
}