112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			112 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
<?php
 | 
						|
 | 
						|
namespace app\repository;
 | 
						|
 | 
						|
use app\model\SmsLog;
 | 
						|
use app\service\Repository;
 | 
						|
use app\service\Sms;
 | 
						|
use Exception;
 | 
						|
use think\db\exception\DataNotFoundException;
 | 
						|
use think\db\exception\DbException;
 | 
						|
use think\db\exception\ModelNotFoundException;
 | 
						|
use think\facade\Log;
 | 
						|
use think\Model;
 | 
						|
 | 
						|
/**
 | 
						|
 * 通用域 相关操作
 | 
						|
 *
 | 
						|
 * Class CommonRepository
 | 
						|
 * @package app\repository
 | 
						|
 * @method self getInstance(Model $model = null) static
 | 
						|
 */
 | 
						|
class CommonRepository extends Repository
 | 
						|
{
 | 
						|
    public const SMS_TYPE_REGISTER      = 'register';//注册
 | 
						|
    public const SMS_TYPE_LOGIN         = 'login';//登录
 | 
						|
    public const SMS_TYPE_BINDING       = 'binding';//绑定
 | 
						|
    public const SMS_TYPE_EDIT_PASSWORD = 'edit_password';//修改密码
 | 
						|
 | 
						|
    public const SMS_STATUS_OK      = 1;//短信验证通过
 | 
						|
    public const SMS_STATUS_WAITING = 0;//验证码待检测
 | 
						|
 | 
						|
    /**
 | 
						|
     * 发送短信
 | 
						|
     *
 | 
						|
     * @param  string  $phone
 | 
						|
     * @param  string  $type
 | 
						|
     * @return bool
 | 
						|
     */
 | 
						|
    public function sendSms(string $phone, string $type): bool
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $now = time();
 | 
						|
            $res = SmsLog::create([
 | 
						|
                'phone'      => $phone,
 | 
						|
                'type'       => $type,
 | 
						|
                'code'       => rand(100000, 999999),
 | 
						|
                'created_at' => date('Y-m-d H:i:s', $now),
 | 
						|
                'expired_at' => date('Y-m-d H:i:s', $now + 5 * 60),
 | 
						|
            ]);
 | 
						|
 | 
						|
            $res = Sms::send($phone, $res['code']);
 | 
						|
            if (is_bool($res)) {
 | 
						|
                return $res;
 | 
						|
            }
 | 
						|
 | 
						|
            Log::error(json_encode($res, JSON_FORCE_OBJECT));
 | 
						|
            return false;
 | 
						|
        } catch (Exception $e) {
 | 
						|
            Log::error(sprintf("[发送短信验证码失败]%s:%d %s", $e->getFile(), $e->getLine(), $e->getMessage()));
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 检查短信验证码
 | 
						|
     *
 | 
						|
     * @param  string  $phone
 | 
						|
     * @param  string  $code
 | 
						|
     * @param  string  $type
 | 
						|
     * @return bool
 | 
						|
     * @throws DataNotFoundException
 | 
						|
     * @throws DbException
 | 
						|
     * @throws ModelNotFoundException
 | 
						|
     */
 | 
						|
    public function checkSms(string $phone, string $code, string $type): bool
 | 
						|
    {
 | 
						|
        $item = (new SmsLog())->where('phone', $phone)
 | 
						|
            ->where('type', $type)
 | 
						|
            ->where('code', $code)
 | 
						|
            ->order('created_at', 'desc')
 | 
						|
            ->order('id', 'desc')
 | 
						|
            ->find();
 | 
						|
        if (!$item) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        if ($item['expired_at'] < date('Y-m-d H:i:s')) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        return $item->save(['status' => self::SMS_STATUS_OK]);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * 日志记录
 | 
						|
     *
 | 
						|
     * @param  string  $msg
 | 
						|
     * @param  Exception|null  $e
 | 
						|
     * @param  string  $level
 | 
						|
     * @param  string  $channel
 | 
						|
     */
 | 
						|
    public static function log(string $msg, Exception $e = null, string $level = 'error', string $channel = 'file')
 | 
						|
    {
 | 
						|
        if ($e != null) {
 | 
						|
            $msg = sprintf("[%s]%s:%s %s", $msg, $e->getFile(), $e->getLine(), $e->getMessage());
 | 
						|
        } else {
 | 
						|
            $msg = sprintf("%s", $msg);
 | 
						|
 | 
						|
        }
 | 
						|
        Log::channel($channel)->$level($msg);
 | 
						|
    }
 | 
						|
} |