微信小程序 登录实例详解
程序员文章站
2022-06-29 20:09:56
微信小程序登录
一. 小程序不支持cookie会话
1. 通过传递与检验3rd_session来保持会话
2. 3rd_session可以执行‘`head -...
微信小程序登录
一. 小程序不支持cookie会话
1. 通过传递与检验3rd_session来保持会话
2. 3rd_session可以执行‘`head -n 80 /dev/urandom | tr -dc a-za-z0-9 | head -c 168`该命令生成
3. 使用redis或者数据库存储session
4. 生成的3rd_session发送给客户端,写入storage
5. 客户端的每次请求必须带上3rd_session
二、加密数据解码
1. $iv,$code是被加密过的数据,由于请求过程中因为编码原因+号变成了空格,所以我们需要用下面的方法转换回来
function define_str_replace($data){ return str_replace(' ','+',$data); }
三、例子:
php
// 微信登录 public function weixin_login(){ $session_db=d('session'); $session_id=i('get.sessionid',''); $session=$session_db->getsession($session_id); if( !empty( $session ) ){ $this->ajaxreturn(['error_code'=>0,'sessionid'=>$session_id]); }else{ $iv=define_str_replace(i('get.iv')); //把空格转成+ $encrypteddata=urldecode(i('get.encrypteddata')); //解码 $code=define_str_replace(i('get.code')); //把空格转成+ $msg=d('weixin')->getuserinfo($code,$encrypteddata,$iv); //获取微信用户信息(openid) if($msg['errcode']==0){ $open_id=$msg['data']->openid; $users_db=d('users'); $info=$users_db->getuserinfo($open_id); if(!$info||empty($info)){ $users_db->adduser(['open_id'=>$open_id,'last_time'=>['exp','now()']]); //用户信息入库 $info=$users_db->getuserinfo($open_id); //获取用户信息 $session_id=`head -n 80 /dev/urandom | tr -dc a-za-z0-9 | head -c 168`; //生成3rd_session $session_db->addsession(['uid'=>$info['id'],'id'=>$session_id]); //保存session } if($session_id){ $this->ajaxreturn(['error_code'=>0,'sessionid'=>$session_id]); //把3rd_session返回给客户端 }else{ $this->ajaxreturn(['error_code'=>0,'sessionid'=>$session_db->getsid($info['id'])]); } }else{ $this->ajaxreturn(['error_code'=>'用户信息获取失败!']); } } }
获取微信信息模型(包括信息解密,官方例子点击下载)
require_once abs_app_path.'/addon/aes/wxbizdatacrypt.php'; class weixinmodel{ // 获取微信的用户信息(openid) public function getuserinfo($code,$encrypteddata,$iv){ $appid=c('appid'); $secret=c('secret'); $grant_type='authorization_code'; $url='https://api.weixin.qq.com/sns/jscode2session'; $url= sprintf("%s?appid=%s&secret=%s&js_code=%s&grant_type=%",$url,$appid,$secret,$code,$grant_type); $user_data=json_decode(file_get_contents($url)); $session_key= define_str_replace($user_data->session_key); $data=""; $wxbizdatacrypt=new \wxbizdatacrypt($appid,$session_key); $errcode=$wxbizdatacrypt->decryptdata($encrypteddata,$iv,$data); return ['errcode'=>$errcode,'data'=>json_decode($data),'session_key'=>$session_key]; } }
javascript
getuserinfo: function(cb) { var that = this if (this.globaldata.userinfo) { typeof cb == "function" && cb(this.globaldata.userinfo) } else { //调用登录接口 wx.login({ success: function(r) { wx.getuserinfo({ success: function(res) { that.login({ code: r.code, iv: res.iv, encrypteddata: encodeuricomponent(res.encrypteddata), }) that.globaldata.userinfo = res.userinfo typeof cb == "function" && cb(that.globaldata.userinfo) } }) } }) } }, login: function(param) { wx.request({ url: this.requesturl('index/weixin_login'), data: param, header: { 'content-type': "application/json", }, success: function(res) { var data = json.parse(res.data.trim()); wx.setstoragesync('sessionid', data.sessionid); } }) },
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
上一篇: 【汇智学堂】JAVAWEB学习日志