SmsCodeValidator.php 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <?php
  2. namespace common\models\validators;
  3. use common\enums\StatusEnum;
  4. use common\models\extend\SmsLog;
  5. use yii\validators\Validator;
  6. /**
  7. * 短信验证码验证器
  8. *
  9. * 在rule使用:
  10. *
  11. * ['verifyCode', '\common\models\validators\SmsCodeValidator', 'usage' => 'userRegister'],
  12. *
  13. * Class SmsCodeValidator
  14. * @package common\models\common
  15. * @author jianyan74 <751393839@qq.com>
  16. */
  17. class SmsCodeValidator extends Validator
  18. {
  19. /**
  20. * 对应Smslog表中的usage字段,用来匹配不同用途的验证码
  21. *
  22. * @var string sms code type
  23. */
  24. public $usage;
  25. /**
  26. * Model或者form中提交的手机号字段名称
  27. *
  28. * @var string
  29. */
  30. public $phoneAttribute = 'mobile';
  31. /**
  32. * 验证码过期时间
  33. *
  34. * @var int
  35. */
  36. public $expireTime = 60 * 15;
  37. /**
  38. * @param \yii\base\Model $model
  39. * @param string $attribute
  40. */
  41. public function validateAttribute($model, $attribute)
  42. {
  43. if (!empty($model->getErrors())) {
  44. return false;
  45. }
  46. $fieldName = $this->phoneAttribute;
  47. $cellPhone = $model->$fieldName;
  48. $smsLog = SmsLog::find()->where([
  49. 'mobile' => $cellPhone,
  50. 'error_code' => 200,
  51. 'used' => StatusEnum::DISABLED,
  52. 'usage' => $this->usage,
  53. ])->orderBy('id desc')->one();
  54. /** @var $smsLog SmsLog */
  55. $time = time();
  56. if (
  57. is_null($smsLog) ||
  58. ($smsLog->code != $model->$attribute) ||
  59. ($smsLog->created_at > $time || $time > ($smsLog->created_at + $this->expireTime))
  60. ) {
  61. $this->addError($model, $attribute, '验证码错误');
  62. } else {
  63. $smsLog->used = StatusEnum::ENABLED;
  64. $smsLog->use_time = $time;
  65. $smsLog->save();
  66. }
  67. }
  68. }
粤ICP备19079148号