tp5实现短信发送 (京东万象)
1、短信接口
场景:通常在使用手机号注册时需要发送短信验证码,在修改密码等敏感操作时也需要验证手机号发送短信验证码。
短信验证码的目的:验证用户的身份是否本人
在项目代码中发送短信,通常要调用第三方短信商的短信发送接口。
提供短信接口的平台:百度Apistore数据平台、聚合数据平台、京东万象等等
一般情况下,短信接口需要企业认证用户才能申请、一般都是收费的。
以京东万象为例:个人可以购买使用

选择一个短信接口


短信接口一般都有一个 模板报备 的概念,需要把发送的短信内容的格式先报备给短信商,
后续发短信的过程,只有满足报备格式的短信才能发送成功。
京东万象的短信接口需要APP KEY, 可以使用京东的帐号进行登录,登录之后可以查看到APPKEY
2、封装发送短信功能
发送短信功能:
将接口地址和appkey放在配置文件application/config.php

封装使用curl发送请求的函数curl_request函数 application/common.php
if(!function_exists('curl_request')) { //使用curl函数库发送请求 function curl_request($url, $post=true, $params=[], $https=true) { //初始化请求 $ch = curl_init($url); //默认是get请求。如果是post请求 设置请求方式和请求参数 if($post){ curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); } //如果是https协议,禁止从服务器验证本地证书 if($https){ curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); } //发送请求,获取返回结果 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $res = curl_exec($ch); /*if(!$res){ $msg = curl_error($ch); dump($msg);die; }*/ //关闭请求 curl_close($ch); return $res; } }
封装一个函数sendmsg用于发送短信application/common.php
if(!function_exists('sendmsg')){ //使用curl_request函数调用短信接口发送短信 function sendmsg($phone, $content) { //从配置中取出请求地址、appkey $gateway = config('msg.gateway'); $appkey = config('msg.appkey'); //https://way.jd.com/chuangxin/dxjk?mobile=13568813957&content=【创信】你的验证码是:5873,3分钟内有效!&appkey=您申请的APPKEY $url = $gateway . '?appkey=' . $appkey ."&content=".$content."&mobile=".$phone; //get请求 $url .= '&mobile=' . $phone . '&content=' . $content; $res = curl_request($url, false, [], true); //处理结果 if(!$res){ return '请求发送失败'; } //解析结果 $arr = json_decode($res, true); if(isset($arr['code']) && $arr['code'] == 10000){ //短信接口调用成功 return true; }else{ /*if(isset($arr['msg'])){ return $arr['msg']; }*/ return '短信发送失败'; } } }
3、手机号注册-发送短信验证码
发送ajax请求
验证规则
![]()

控制器方法:
//验证码发送 public function code(){ $comm = input(); $code = mt_rand(0000,9999); $content = "【二一年春】你的验证码是:{$code},3分钟内有效!"; $result = true; if ($result === true){ cache('register_code_'.$comm['phone'],$code,180); $res = [ 'code'=>200, 'msg'=>'短信发送成功', 'data'=>$code ]; echo json_encode($res);die; }else{ $res = [ 'code'=>201, 'msg'=>$result ]; echo json_encode($res);die; } }
③ 浏览器上测试时,在调试工具栏Network查看验证码
![]()
4、手机号注册-校验短信验证码
//验证码效验 public function phone(){ $params = input(); $rule = [ 'phone|手机号'=>'require', 'code|验证码'=>'require|length:4', ]; $validate = new \think\Validate($rule); if (!$validate->check($params)){ $error = $validate->getError(); return json(['code'=>400,'msg'=>$error]); } $code = cache('register_code_'.$params['phone']); if ($code!=$params['code']){ return json(['code'=>401,'msg'=>'验证码错误!']); } $data = \app\admin\model\User::getAdd($params); if ($data){ return json(['code'=>200,'msg'=>'注册成功!']); } }
5,、补充前端jq倒计时、短信发送限制



浙公网安备 33010602011771号