微信小程序 登录实例详解


Posted in Javascript onJanuary 16, 2017

微信小程序登录

一. 小程序不支持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);
      }
    })
  },

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
JavaScript 学习笔记(七)字符串的连接
Dec 31 Javascript
自定义的一个简单时尚js下拉选择框
Nov 20 Javascript
javascript中style.left和offsetLeft的用法说明
Mar 07 Javascript
Javascript 实现图片无缝滚动
Dec 19 Javascript
JavaScript显示表单内元素数量的方法
Apr 02 Javascript
JavaScript 模块化编程(笔记)
Apr 08 Javascript
vue如何引用其他组件(css和js)
Apr 13 Javascript
JavaScript this在函数中的指向及实例详解
Oct 14 Javascript
vuex state中的数组变化监听实例
Nov 06 Javascript
vue.js的状态管理vuex中store的使用详解
Nov 08 Javascript
JS实现点星星消除小游戏
Mar 24 Javascript
交互式可视化js库gojs使用介绍及技巧
Feb 18 Javascript
微信小程序 传值取值的几种方法总结
Jan 16 #Javascript
详解vue-Resource(与后端数据交互)
Jan 16 #Javascript
微信小程序 封装http请求实例详解
Jan 16 #Javascript
详解vue-validator(vue验证器)
Jan 16 #Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
Jan 16 #Javascript
webpack入门必知必会
Jan 16 #Javascript
angular+ionic 的app上拉加载更新数据实现方法
Jan 16 #Javascript
You might like
php递归列出所有文件和目录的代码
2008/09/10 PHP
PHP+Mysql日期时间如何转换(UNIX时间戳和格式化日期)
2012/07/15 PHP
如果文字过长,则将过长的部分变成省略号显示
2006/06/26 Javascript
js创建数据共享接口——简化框架之间相互传值
2011/10/23 Javascript
浅谈Javascript变量作用域问题
2014/12/16 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
JavaScript html5利用FileReader实现上传功能
2020/03/27 Javascript
Javascript实现的StopWatch功能示例
2017/06/13 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
Next.js实现react服务器端渲染的方法示例
2019/01/06 Javascript
layui table 复选框跳页后再回来保持原来选中的状态示例
2019/10/26 Javascript
js判断一个对象是数组(函数)的方法实例
2019/12/19 Javascript
js实现滑动进度条效果
2020/08/21 Javascript
python登录pop3邮件服务器接收邮件的方法
2015/04/30 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python自动生产表情包
2017/03/17 Python
django框架中间件原理与用法详解
2019/12/10 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
python实现五子棋程序
2020/04/24 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
美国户外运动商店:Sun & Ski
2018/08/23 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
新法人代表任命书
2014/06/06 职场文书
小学五年级语文上册教学计划
2015/01/22 职场文书
锅炉工岗位职责
2015/02/13 职场文书
干货:如何写好工作计划!
2019/05/17 职场文书
导游词之四川熊猫基地
2020/01/13 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android
利用python做数据拟合详情
2021/11/17 Python
python数字图像处理数据类型及颜色空间转换
2022/06/28 Python