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倒计时、短信发送限制

 

 

 

 



posted on 2021-05-31 18:59  二十一年春  阅读(263)  评论(0)    收藏  举报