亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

「PHP開發APP接口實戰013」手機號快速登錄一

標簽:
PHP

需求分析

  • 用户使用手机号 + 短信验证码实现快速登录系统

  • 用户不存在,则自动创建用户帐号

  • 每次登录需要更新最后登陆时间

  • 如果配置为单点登陆,则每次登陆都生成一个新的 TOKEN(用户身份标识)

https://img1.sycdn.imooc.com//5d58b1e90001eb9706270748.png

功能流程图

接口地址:  http://127.0.0.1:20081/user/login
请求方式: POST

请求参数:
参数名必选类型说明
user_mobilestring手机号
codestring短信验证码
返回示例:
{    "status": "1",    "item": {        "user_token": "fa630cac17ebdfb115e13c3de8857a5a"
    }
}
返回参数说明:
参数名说明
user_token用户身份标识

创建接口

  1. /app/controllers 目录下创建控件器文件 UserController.php,添加代码:

<?phpclass UserController extends BaseController{    /**
     * 用户登陆
     * @throws Exception
     */
    public function loginAction()
    {        // 验证请求方法是否是POST
        $this->isPost();

    }
}

以上代码,创建了登陆接口,并验证了请求方式必须为 POST。

  1. 打开 /app/config/config.php, 在 authentication.exclude 添加元素 user/login。将登陆接口排除身份认证。如:

    // 身份认证配置
    'authentication' => [        'enable' => 1,  // 身份认证: 0 关闭, 1 激活
        'single' => 0, // 单点登录: 0 允许多个客户端同时登录; 1 同一时间,只请允许最后登录设备使用
        // 身份认证排除页面
        'exclude' => [            'index/index',            'user/login',            'sms/send',
        ]
    ],

请求参数验证

  • 手机号必填,且必须为11位有效手机号

  • 4位数字有效短信验证码

  1. 为控制器 UserController 创建验证类 XValidationUser, 并为 loginAction() 创建对应的验证函数 login(),如:

// 检测是否为空use Phalcon\Validation\Validator\PresenceOf;// 正则表达式验证use Phalcon\Validation\Validator\Regex;// 数字字符use Phalcon\Validation\Validator\Digit;// 介于二者之间,minimum<=x<=maximumuse Phalcon\Validation\Validator\Between;/**
 *
 * 用户参数验证
 */class XValidationUser{    /**
     * 登录参数验证
     * @param $params
     * @return bool
     * @throws Exception
     */
    public static function login($params)
    {
        $validation = new XValidation();
        $validation->add('user_mobile', new PresenceOf(['message' => '缺少手机号码']));
        $validation->add('user_mobile', new Regex(['message' => '无效手机号码', 'pattern' => '/^1[34578]{1}\d{9}$/']));
        $validation->add('code', new PresenceOf(['message' => '缺少短信验证码']));
        $validation->add('code', new Digit(['message' => '无效短信验证码']));
        $validation->add('code', new Between(['message' => '无效短信验证码', 'minimum' => 1000, 'maximum' => 9999]));
        $validation->add('code', new XValidatorCode(['message' => '无效短信验证码', 'with' => 'user_mobile']));        return $validation->valid($params);
    }
}

以上 PresenceOf, Regex, Digit, BetweenPhalcon 内置验证器,分别验证必填参数,手机号格式, 验证码是否为数字和是否在 10009999 之间(4位数字验证)。
XValidatorCode 为自定议短信验证码验证器。

  1. /app/library/SMS.php 中添加函数 validate(),添加以下代码:

    /**
     * 验证短信验证码
     * 只有最后一次发送的验证码才有效
     * 验证码有效时间5分钟
     * @param $mobile
     * @param $code
     * @return bool
     */
    public function validate($mobile, $code)
    {
        $codes = $this->getCacheCodes($mobile);        if (count($codes) == 0) {            return false;
        }

        $lastCode = end($codes);        // 只有最后一次发送的验证码才有效
        if ($lastCode['code'] != $code) {            return false;
        }        // 验证码有效时间5分钟
        if ($this->config['valid_time'] > 0 && time() - $lastCode['time'] > $this->config['valid_time']) {            return false;
        }        // 验证码已被验证,自动失效
        if (isset($lastCode['verified']) && $lastCode['verified'] == 1) {            return false;
        }        // 通过验证后,将验证在码状态设置为已验证
        $codes[count($codes) - 1]['verified'] = 1;        // 更新缓存
        XMemcache::instance('sms')->set($mobile, $codes);        return true;
    }
  • 检测提交的手机号和验证码是否与缓存数据一致,是否已被验证,是否过期等。

  • 若通过验证,还会将验证在码状态设置为已验证,防止重复使用。

  1. 创建短信验证码自定义验证器,在 /app/library/目录中新建 XValidatorCode.php 文件, 插入代码 :

<?phpuse Phalcon\Validation,    Phalcon\Validation\Validator,    Phalcon\Validation\ValidatorInterface,    Phalcon\Validation\Message;class XValidatorCode extends Validator implements ValidatorInterface{    /**
     * @param Validation $validation
     * @param $attribute
     * @return bool
     */
    public function validate(Validation $validation, $attribute)
    {
        $value = $validation->getValue($attribute);
        $mobile = $validation->getValue($this->getOption('with'));        if (!SMS::instance()->validate($mobile, $value)) {
            $message = $this->getOption('message');            if (!$message) {
                $message = '短信验证码错误';
            }
            $validation->appendMessage(new Message($message, $attribute, 'Code'));            return false;
        }        return true;
    }
}

调用方法:new XValidatorCode(['message' => '无效短信验证码', 'with' => 'user_mobile']

数据库连接

  1. 配置数据库连接参数,打开 /app/config/config.ini, 添加:

[database]adapter = Mysqlhost = localhostusername = rootpassword = 123456dbname = democharset = utf8port = 3306prefix = dm_

请根据自己数据库设置,自行更改对应参数

  1. 创建连接,打开 /app/public/index.php, 找到 $di = new Phalcon\Di\FactoryDefault();, 在下面添加以下代码:

// 设置数据库服务$di->set(    "db",    function () {
        $config = Config::instance()->get('database', 'ini');
        $config['options'] = [
            PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'UTF8'",
            PDO::ATTR_CASE => PDO::CASE_LOWER, // 强制列名小写。
            PDO::ATTR_ORACLE_NULLS => PDO::NULL_TO_STRING, //  将 NULL 转换成空字符串。
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 仅仅返回以键值作为下标的查询的结果集,名称相同的数据只返回一个。
        ];        return new \Phalcon\Db\Adapter\Pdo\Mysql($config);
    }
);

设置数据库服务, 并设置PDO默认属性:

  1. 指定数据库编码为UTF-8

  2. 强制指定列名小写

  3. 将结果集中NULL转换为空字符串

  4. 仅仅返回以键值作为下标的查询的结果集,名称相同的数据只返回一个

经过上面的简单操作,我们就可以在 Controller 中使用 $this->db 或模型来操作数据库了。官方文档

To be continued......



作者:一念觀心
链接:https://www.jianshu.com/p/9ae2659e03bd

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消