| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- <?php
- /**
- * 短信服务
- * @author wesmiler
- */
- namespace app\weixin\service;
- use AlibabaCloud\Client\AlibabaCloud;
- use GuzzleHttp\Exception\ClientException;
- use GuzzleHttp\Exception\SeekException;
- class Sms
- {
- /**
- * 发生短信验证码
- * @param $mobile 手机号码
- * @param $params 短信参数:tpName-模板名称标识,code-短信验证码,expire-有效期/s
- * @param string $scene 场景标识:默认code
- * @return array|bool
- */
- public static function sendCode($mobile, $params, $scene = 'code')
- {
- if(empty($mobile)){
- return 2012;
- }
- // 参数配置
- $smsConfig = cmf_get_option('sms_config');
- $tpName = isset($params['tpName']) ? $params['tpName'] : ''; // 短信模板名称
- $code = isset($params['code']) ? trim($params['code']) : ''; // 验证码
- $codeLength = isset($smsConfig['code_length']) ? intval($smsConfig['code_length']) : 0;
- $codeLength = $codeLength>=4? $codeLength-1 : 5;
- $numMin = pow(10,$codeLength);
- $numMax = pow(10,$codeLength+1)-1;
- $code = $code? $code : rand($numMin,$numMax);
-
- $expire = isset($params['expire']) && $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 isset($result['Message']) && $result['Message']? $result['Message'] : 2017;
- }
- } catch (ClientException $exception) {
- PRedis::set('sms:error_'.$scene.':'.$mobile, $exception->getMessage(), 600);
- return 2017;
- } catch (SeekException $exception) {
- PRedis::set('sms:error_'.$scene.':'.$mobile, $exception->getMessage(), 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;
- }
- }
|