Thinkphp5短信验证不能在同控制器里跨函数读取session的解决方法


项目背景:

      Thinkphp5框架做PC端和后台数据处理,利用UNIAPP写微信小程序和H5端,系统设置用户注册和密码找回等操作必须通过手机短信验证码完成,众所周知,这一操作的流程实际挺简单的,通过小程序或H5端生成验证码,将验证码和客户手机号码发送至我们的服务器,由服务器向SMS短信服务发起请求并顺利将完整的手机短信发送至客户手机并返回结果给我们的服务器,服务器再告诉小程序或H5短信是否发送成功。

      我们都知道整个过程服务端控制器我们有两个函数即发送短信函数SendSMS和处理注册的函数Reg,我的处理是:

SendSMS函数请求短信服务发送成功后,把手机号和验证码写入Session中,然后在Reg函数里处理小程序或H5端发送过来的数据是否和Session里的值一样,否则提示注册失败,下面我把部分贴出来以便大家更容易理解!


SendSMS函数部分代码:

if($result['state']){
	session('sms_mobile', $sms_mobile);
	session('sms_captcha', $sms_captcha);
	echo '发送成功';
	//echo 'SendSMS Result:true,本验证码:'.$sms_captcha.",session验证码:".session('sms_captcha');
	exit;
}else{
	vm_json_encode(1,$result['message']);
	exit;
}

Reg函数部分代码:

//判断验证码是否正确
	//vm_json_encode(1,'输入为:'.$sms_captcha.",发送为:".session('sms_captcha').",发送手机为:".session('sms_mobile'));
        if ($sms_captcha != session('sms_captcha')) {
        vm_json_encode(1,'验证码错误');
       }
        if ($sms_mobile != session('sms_mobile')) {
        vm_json_encode(1,'手机号与接收号不一致');
       }

大家可以看到,两个函数我都加了调试输出,但结果是SendSMS函数里的sessioin可以读取,而Reg函数里的session确是空的,百度查了很多贴子,基本处理方法是修改配置文件,基本上应该是写SESSION的目录是否有权限、修改PHP.INI、设置配置文件config.php等,我也没花很多时间去研究了,我改了配置文件如下,其它的也按网贴做了修改(不对的大家别喷呀):

return [
    'session' => [
        'id' => '',
        // SESSION_ID的提交变量,解决flash上传跨域
        'var_session_id' => '',
        // SESSION 前缀
        'prefix' => '',
        // 驱动方式 支持redis memcache memcached
        'type' => '',
        // 是否自动开启 SESSION
        'auto_start' => true,
		//SESSION选项
		'use_trans_sid'=>1,
		'use_only_cookies'=>0,
    ],
];

但是依然没能解决问题,后来看网上一位仁兄讲是不是可以用Cache解决呢,呵呵,人往往这样牛角尖是钻不出的,换个思路效果往往完全不同,人生不也是如此吗?

简单的处理思维即是把session换成cahche即可完美解决问题!


解决代码如下:


引用think\Cache;
SendSMS函数修改:

if($result['state']){
Cache::set('sms_mobile',$sms_mobile,3600);
Cache::set('sms_captcha',$sms_captcha,3600);
//session('sms_mobile', $sms_mobile);
//session('sms_captcha', $sms_captcha);
echo '发送成功';
//echo 'SendSMS Result:true,本验证码:'.$sms_captcha.",session验证码:".session('sms_captcha');
exit;
}else{
vm_json_encode(1,$result['message']);
exit;
}

Reg函数修改:
//判断验证码是否正确
//vm_json_encode(1,'输入为:'.$sms_captcha.",发送为:".Cache::get('sms_captcha').",发送手机为:".Cache::get('sms_mobile'));
if ($sms_captcha != Cache::get('sms_captcha')) {
vm_json_encode(1,'验证码错误');
}
if ($sms_mobile != Cache::get('sms_mobile')) {
vm_json_encode(1,'手机号与接收号不一致');
}


注:本文转载自唯马网络,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除。

评论