美文网首页
ThinkPHP 5.0.24 集成阿里云短信服务

ThinkPHP 5.0.24 集成阿里云短信服务

作者: zlchen | 来源:发表于2020-07-10 12:30 被阅读0次
新手指引.png

前提条件

在安装和使用阿里云PHP SDK前,确保您已经:

  • 请确认您的系统满足需求。
  • 已经注册阿里云账号并生成访问密钥(AccessKey)。详细步骤请参考创建AccessKey

1.安装PHP SDK

[root@iZbp1ho4i5t91cq1pp6ikoZ test.com]# composer require alibabacloud/client
Do not run Composer as root/super user! See https://getcomposer.org/root for details
Using version ^1.5 for alibabacloud/client
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 12 installs, 0 updates, 0 removals
  - Installing clagiordano/weblibs-configmanager (v1.0.7): Downloading (100%)
  - Installing adbario/php-dot-notation (2.2.0): Downloading (100%)
  - Installing symfony/polyfill-mbstring (v1.17.1): Downloading (100%)
  - Installing mtdowling/jmespath.php (2.5.0): Downloading (100%)
  - Installing danielstjules/stringy (3.1.0): Downloading (100%)
  - Installing psr/http-message (1.0.1): Downloading (100%)
  - Installing psr/http-client (1.0.1): Downloading (100%)
  - Installing ralouphie/getallheaders (3.0.3): Downloading (100%)
  - Installing guzzlehttp/psr7 (1.6.1): Downloading (failed)
Downloading (100%)
  - Installing guzzlehttp/promises (v1.3.1): Downloading (100%)
  - Installing guzzlehttp/guzzle (7.0.1): Downloading (100%)
  - Installing alibabacloud/client (1.5.25): Downloading (100%)
guzzlehttp/psr7 suggests installing zendframework/zend-httphandlerrunner (Emit PSR-7 responses)
guzzlehttp/guzzle suggests installing psr/log (Required for using the Log middleware)
Writing lock file
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!

2.控制器代码 获取验证码(将code 以及key存入缓存)

<?php

use think\Request;
use think\Cache; 

// 阿里云短信服务 202007101044
use AlibabaCloud\Client\AlibabaCloud;
use AlibabaCloud\Client\Exception\ClientException;
use AlibabaCloud\Client\Exception\ServerException;

// Download:https://github.com/aliyun/openapi-sdk-php
// Usage:https://github.com/aliyun/openapi-sdk-php/blob/master/README.md

//阿里云 访问密钥(AccessKey)
define('AccessKeyID', '<accessKeyId>');
define('AccessKeySecret', '<accessSecret>');
define('SMS_LOGIN','SMS_195****27'); //模版内容:【SignName】 验证码为:${code},您正在登录,若非本人操作,请勿泄露。
define('SMS_REG','SMS_195****33'); // 模版内容:【SignName】您正在注册****账号,验证码为:${code},请勿泄漏于他人!

class SendVerificationCode
{
     //随机产生六位数
    private function getSmsCode($len=6,$format='ALL') { 
         switch($format) { 
             case 'ALL':
                $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-@#~'; break;
             case 'CHAR':
                 $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz-@#~'; break;
             case 'NUMBER':
                $chars='0123456789'; break;
             default :
                $chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-@#~'; 
             break;
         }
         mt_srand((double)microtime()*1000000*getmypid()); 
         $password="";
         while(strlen($password)<$len)
            $password.=substr($chars,(mt_rand()%strlen($chars)),1);
         return $password;
    } 

    // 发送短信验证码  20200710115029
    public function sms_regverifysend(Request $request){
         if($request->param('token')){
             if('f04d5e2f87d0fcds' === $request->param('token')){
                 
                 if($request->isPost()){
            
                     $PhoneNumbers = $request->param('mobile');
                     $type = $request->param('type');
                     //是否开启调试
                     if(!empty($request->param('debug'))){
                         $debug = $request->param('debug')? 1 : 0;
                     }else{
                         $debug = 0;
                     }
                     
                     
                     if($type == 'login'){
                         $TemplateCode = SMS_LOGIN;
                     }elseif($type == 'reg'){
                         $TemplateCode = SMS_REG;
                     }
                     $SignName = "【SignName】";  //例如:阿里云 要和申请用的签名一致
                     //随机生成6位数字
                     $code = $this->getSmsCode(6,'NUMBER');
                     
                     AlibabaCloud::accessKeyClient(AccessKeyID, AccessKeySecret)
                                ->regionId('cn-hangzhou')
                                ->asDefaultClient();
        
                    try {
                        $result = AlibabaCloud::rpc()
                                              ->product('Dysmsapi')
                                              // ->scheme('https') // https | http
                                              ->version('2017-05-25')
                                              ->action('SendSms')
                                              ->method('POST')
                                              ->host('dysmsapi.aliyuncs.com')
                                              ->options([
                                                            'query' => [
                                                              'RegionId' => "cn-hangzhou",
                                                              'PhoneNumbers' => $PhoneNumbers,
                                                              'SignName' => $SignName,
                                                              'TemplateCode' => $TemplateCode,
                                                              'TemplateParam' => json_encode(["code"=>$code]),
                                                            ],
                                                        ])
                                              ->request();
                        /***
                         * Array
                            (
                                [Message] => OK
                                [RequestId] => 82B1AC3C-5F13-434F-A698-F1A73DB50D02
                                [BizId] => 224411294351309109^0
                                [Code] => OK
                            )
                            
                            Array
                            (
                                [Message] => 模板变量缺少对应参数值
                                [RequestId] => F8932DD4-801A-45B3-BB50-09432E4D0237
                                [Code] => isv.TEMPLATE_MISSING_PARAMETERS
                            )
                        **/
                        $arr = $result->toArray();
                        
                        if($debug){
                            print_r($result->toArray());
                            die;
                        }
                        
                        if(strtolower($arr['Code']) == 'ok' ){
                            
                           //存code到缓存中
                            $key = 'verificationCode_'.$this->getSmsCode(15,'ALL');
                            //有效期3分钟
                            $expiredAt = time() + 3 * 60;
                            Cache::set($key,['mobile'=>$mobile,'code'=>$code],$expiredAt);    
                            $data = [
                                'verification_key' => $key,
                                'expiredAt' => date('Y-m-d H:i:s',$expiredAt),
                                'verification_code' => $code
                            ];
                            echo json_encode(['code'=>1,"messege"=>'验证码发送成功','data'=>$data,'verify_time_total'=>60]);
                        }else{
                            echo json_encode(['code'=>0,"messege"=>'验证码发送失败','data'=>$arr]);
                        }
                        
                    } catch (ClientException $e) {
                        echo $e->getErrorMessage() . PHP_EOL;
                    } catch (ServerException $e) {
                        echo $e->getErrorMessage() . PHP_EOL;
                    }
                }else{
                    echo json_encode(['code'=>0,"messege"=>'please use post request']);
                }
                 
             }else{
                   
                   echo json_encode(['code'=>1001, 'messege'=>'没有访问权限', 'data'=>[]]);
             }
             
         }else{
            
            echo json_encode(['code'=>1000, 'messege'=>'参数有误', 'data'=>[]]); //  响应json串 
         }
            
    }
}
?>

3.比对验证码

    //小程序用户注册或者登陆  202007021308
    public function user_register(Request $request){
         
         if($request->param('token')){
             if('f04d5e2f87d0fcds' === $request->param('token')){
                 if($request->isPost()){
                     //add 20200710132225
                     $verification_key = $request->param('verification_key');
                     $code = $request->param('code');
                     
                     $verifyData = Cache::get($verification_key);
                     if( !$verifyData){
                        //$this->setMsg('验证码已失效');
                        echo json_encode(['code'=>0, 'messege'=>'验证码已失效']);
                        die;
                     }
                     if(!hash_equals($code,(string)$verifyData['code'])){
                        //$this->setMsg('验证码错误');
                        echo json_encode(['code'=>0, 'messege'=>'验证码错误']);
                        die;
                     }
                     //删除缓存
                     Cache::rm($verification_key);
                     
                     $openid = $request->param('openid');
                     $tel = $request->param('tel');
                     //  var_dump($request->param());
                     //  die;
                     
                     $user_data = array(
                        'tel' => $tel,
                        'binding_tel_time' => date('Y-m-d H:i:s')
                     );
                     //fetchSql(true)生成的SQL等同于:SELECT `id`,`nickName`,`openid` FROM `ims_yckj_liucheng_fans` WHERE  `openid` = 'opxz9v0zpideUCpFuDCIU7ZbY_bQ'  AND `uniacid` = 8 LIMIT 1
                     $user = Db::table('ims_yckj_liucheng_fans')->where('openid', $openid)->where('uniacid', 8)->field(array('id', 'nickName', 'openid'))->find();
                   
                     if (!empty($user)) {
                        
                         $result = Db::table('ims_yckj_liucheng_fans')->data($user_data)->where('openid', $openid)->where('uniacid', 8)->update();
                         if (!empty($result)) {
                             echo json_encode(['code'=>1, 'messege'=>'注册成功', 'data'=>$request->param()]); 
                         }else{
                             echo json_encode(['code'=>0, 'messege'=>'注册失败', 'data'=>$request->param()]);
                         }
                     }else{
                         echo json_encode(['code'=>0, 'messege'=>'请先授权登录', 'data'=>$request->param()]);
                     }
                     
                     
                 }else{
                     
                     echo json_encode(['code'=>0, 'messege'=>'请使用post请求传参', 'data'=>[]]); 
                 }
                 
             }else{
                   echo json_encode(['code'=>1001, 'messege'=>'没有访问权限', 'data'=>[]]);
             }
             
         }else{
             echo json_encode(['code'=>1000, 'messege'=>'参数有误', 'data'=>[]]); 
         }
         
    }

4.使用ApiPost调用接口

获取验证码
用户登录、注册验证码.png
模拟用户注册
用户注册.png

相关文章

网友评论

      本文标题:ThinkPHP 5.0.24 集成阿里云短信服务

      本文链接:https://www.haomeiwen.com/subject/tqapcktx.html