今天使用了fecmall的appserver端做了个发送手机短信验证码的接口,出现 fined variable: modules

问题咨询 · tgy3300 · 于 4年前 发布 · 1510 次阅读

就三个功能,挺简单的,

public function actionSend($PhoneNumbers){

        //生成验证码
        $this->createSmsCode();

        return $this->getSessionSmsCode();
    }

现在的问题是:actionSend 使用 $this->getSessionSmsCode() 后,存在session里的验证码就清空了,在做验证码比对时,再次使用 $this->getSessionSmsCode() 来获取验证码时为空的,xdebug后,跟踪代码发如上截图错误。

//生成手机验证码,并记录在session中
    private function createSmsCode()
    {
        $key = '';
        for( $i=0; $i < $this->codeLen; $i++ ) {
            $key .= mt_rand(1, 9);
        }
        Yii::$app->session->set($this->_sessionKey, $key);
        Yii::$app->session->set($this->_sms_time, time());
    }
//从session中获取验证码
    public function getSessionSmsCode()
    {
        $sessionKeyCode = Yii::$app->session->get($this->_sessionKey);
        $sms_time       = Yii::$app->session->get($this->_sms_time);

        if( time() - $sms_time < 900){
            return $sessionKeyCode;
        }else{
            return 8888888888;
        }
    }
共收到 14 条回复
Fecmall#14年前 0 个赞

fecmall-2版本,appserver api端 使用session是不行的。session是浏览器web用的

tgy3300#24年前 0 个赞

@Fecmall [#1楼](#comment1)

哪我要怎么办呢,可有替代方案

Fecmall#34年前 0 个赞

可以加密一下,就像密码那样,

1.生成6位数字验证码$smsStr,调用手机短信api发送短信给用户手机

2.将数字验证码进行加密,譬如encrypt_str = md5($smsStr),然后将加密后的字符串encrypt_str返回给前端html

3.用户form里面就有了加密后的数字验证码,用户填写短信验证码,提交表单

4.用户提交的短信验证码$formSmsStr,验证一下:

if (md5($formSmsStr) == $encrypt_str) {

}

和密码验证原理类似。

tgy3300#44年前 0 个赞

@Fecmall #3楼

appserver api端 不能使用session,能使用cookei吗?

Fecmall#54年前 0 个赞

@tgy3300 [#4楼](#comment4)

1.解决办法告诉你了,没有一点波澜

2.不能使用session,能使用cookei吗? 本人表示无语,多去学习一下理论,不然这问题问的有点丢人(如果是php程序员)。

tgy3300#64年前 0 个赞

这样,验证码怎么做失效呢

Fecmall#74年前 0 个赞

@tgy3300 #6楼

,可以试一下jwt这个思路,将code和时间拼接起来,本地有一个私钥,进行加密,发送给前端,前端提交到服务端后,通过私钥进行解密,然后得到code和时间,然后做比较

还一个思路就是,实现一个类似session的功能,这个需要用redis,你可以看一下fecmall的图片验证码的部分,用的就是redis,每个用户生成一个uuid,发送给用户,uuid对应的图片验证码保存到redis里面。

tgy3300#84年前 0 个赞

奇怪,http://demo.fancyecommerce.com/#/customer/account/register 页面用到的表单注册接口,,http://fecshop.appserver.fancyecommerce.com/customer/register/account 中 \Yii::$service->helper->captcha->validateCaptcha($captcha) 里可以使用session,如下

public function validateCaptcha($captchaData)
    {
        $captchaData = $this->getCode($captchaData);
        $sessionCaptchaData = \Yii::$service->session->get($this->_sessionKey);

        return ($captchaData === $sessionCaptchaData) ? true : false;
    }

我做的短信验证码,也是这思路,使用方式也和这个一样,为什么我的那个不行,

Fecmall#94年前 0 个赞

1.二版本的验证码部分默认去除,如果想要加验证码,需要安装redis

2.看清楚代码,是fecmall封装的session services \Yii::$service->session , 而不是yii2的 Yii::$app->session 组件

tgy3300#104年前 0 个赞

我其实用的就是以前的fecshop的文件配置版本,,新版的全后台配置版本,我没用,我使用的,也是 \Yii::$service->session->get($this->_sessionKey),session配置的storage为SessionRedis

Fecmall#114年前 0 个赞

@tgy3300 #10楼

嗯,fecmall-1版本,是可以这样用的,你可以参考一下验证码的原理,做你的短信码

tgy3300#124年前 0 个赞

我参考的就是图片验证码的做法,但感觉Redis没使用起来,我怎么检测是否使用了Redis存储session了,我

// 把验证码存入session,并记录创建时间
    public function setSessionCode()
    {
        \Yii::$service->session->set($this->_sessionKey, $this->code);
        \Yii::$service->session->set( $this->_sms_time, time() );
    }

这样后,去

这里面没有找到

\Yii::$service->session->set($this->_sessionKey, $this->code);
        \Yii::$service->session->set( $this->_sms_time, time() );

这两句生成的 session

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics