=4? $codeLength-1 : 5; $numMin = pow(10,$codeLength); $numMax = pow(10,$codeLength+1)-1; $code = $code? $code : rand($numMin,$numMax); $expire = isset($params['expire']) ? intval($params['expire']) : 300; // 有效期 $openSms = isset($smsConfig['status']) ? $smsConfig['status'] : true; // 短信功能是否开启 $signName = isset($smsConfig['sign_name']) ? $smsConfig['sign_name'] : ''; $accessKey = isset($smsConfig['access_key']) ? $smsConfig['access_key'] : ''; $accessSecret = isset($smsConfig['access_secret']) ? $smsConfig['access_secret'] : ''; $regionId = isset($smsConfig['sms_region']) ? $smsConfig['sms_region'] : 'cn-hangzhou'; $templateId = isset($smsConfig[$tpName . '_template_id']) ? $smsConfig[$tpName . '_template_id'] : ''; $jsonData = json_encode(['code' => $code], 256); if(!$openSms){ PRedis::set('sms:error_'.$scene.':'.$mobile, ['config'=> $smsConfig,'params'=> $params], 600); return 2018; } if(empty($accessSecret) || empty($accessSecret) || empty($templateId)){ PRedis::set('sms:error_'.$scene.':'.$mobile, ['config'=> $smsConfig,'params'=> $params], 600); return 2014; } if(empty($signName) || empty($tpName) || empty($code)){ PRedis::set('sms:error_'.$scene.':'.$mobile, ['config'=> $smsConfig,'params'=> $params], 600); return 2015; } if(PRedis::get('sms:lock_'.$scene.':'.$mobile)){ return 2021; } // 初始化参数 AlibabaCloud::accessKeyClient($accessKey, $accessSecret) ->regionId($regionId ? $regionId : 'cn-hangzhou') ->asDefaultClient(); // 处理调用 try { $params = [ 'RegionId' => $regionId? $regionId : 'cn-hangzhou', 'PhoneNumbers' => $mobile, 'SignName' => $signName, 'TemplateCode' => $templateId, 'TemplateParam' => $jsonData, ]; $result = AlibabaCloud::rpc() ->product('Dysmsapi') ->version('2017-05-25') ->action('SendSms') ->method('POST') ->options(['query' => $params]) ->request(); $result = $result? $result->toArray() : []; PRedis::set('sms:result_'.$scene.':'.$mobile, $result, 600); if ($result && $result['Code'] == "OK"){ // 写缓存 $codeData = ['code'=> $code, 'params'=> $params, 'date'=> date('Y-m-d H:i:s')]; PRedis::set('sms:scene_'.$scene.':'.$mobile, $codeData, $expire); PRedis::set('sms:lock_'.$scene.':'.$mobile, $code, 10); return $codeData; }else{ return $result['Code']? $result['Code'] : 2017; } } catch (ClientException $exception) { PRedis::set('sms:error_'.$scene.':'.$mobile, $exception, 600); return 2017; } catch (SeekException $exception) { PRedis::set('sms:error_'.$scene.':'.$mobile, $exception, 600); return 2017; } } /** * 验证短信验证码 * @param $mobile 手机号码 * @param $code 当前验证码 * @param string $scene 场景:code-默认 * @return bool|int */ public static function checkCode($mobile, $code, $scene='code'){ $codeData = PRedis::get('sms:scene_'.$scene.':'.$mobile); $sendCode = isset($codeData['code'])? $codeData['code'] : ''; if(empty($codeData)){ return 2019; } if($sendCode == $code){ PRedis::del('sms:scene_'.$scene.':'.$mobile); return true; } return 2020; } }