微信小程序 登录实例详解


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 相关文章推荐
jquery 简短右键菜单 多浏览器兼容
Jan 01 Javascript
javascript语言结构小记(一)
Sep 10 Javascript
js螺旋动画效果的具体实例
Nov 15 Javascript
jquery根据锚点offset值实现动画切换
Sep 11 Javascript
jQuery实现数字加减效果汇总
Dec 16 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
Apr 20 Javascript
Javascript的表单验证-提交表单
Mar 18 Javascript
jquery 动态合并单元格的实现方法
Aug 26 Javascript
Vue2.5 结合 Element UI 之 Table 和 Pagination 组件实现分页功能
Jan 26 Javascript
AngularJs用户输入动态模板XSS攻击示例详解
Apr 21 Javascript
如何安装控制器JavaScript生成插件详解
Oct 21 Javascript
使用layui实现树形结构的方法
Sep 20 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分页集合包括使用方法
2013/10/21 PHP
使用php从身份证号中获取一系列线索(星座、生肖、生日等)
2016/05/11 PHP
extjs之去除s.gif的影响
2010/12/25 Javascript
单击按钮显示隐藏子菜单经典案例
2013/01/04 Javascript
JS 跳转页面延迟2种方法
2013/03/29 Javascript
让alert不出现弹窗的两种方法
2014/05/18 Javascript
jquery实现鼠标经过显示下划线的渐变下拉菜单效果代码
2015/08/24 Javascript
JS使用cookie实现DIV提示框只显示一次的方法
2015/11/05 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
vue实现添加标签demo示例代码
2017/01/21 Javascript
JS对象是否拥有某属性如何判断
2017/02/03 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
解决mpvue + vuex 开发微信小程序vuex辅助函数mapState、mapGetters不可用问题
2018/08/03 Javascript
微信小程序引用iconfont图标的方法
2018/10/22 Javascript
详解js 创建对象的几种方法
2019/03/08 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
Python中for循环和while循环的基本使用方法
2015/08/21 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
2017/06/07 Python
python写一个md5解密器示例
2018/02/23 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
python使用wxpy实现微信消息防撤回脚本
2019/04/29 Python
Python Tensor FLow简单使用方法实例详解
2020/01/14 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
HTML5 History API 实现无刷新跳转
2016/01/11 HTML / CSS
越南电子产品购物网站:FPT Shop
2017/12/02 全球购物
高尔夫球鞋、服装、手套和装备:FootJoy
2018/12/15 全球购物
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
戴森香港官方网站:Dyson香港
2021/02/11 全球购物
民事诉讼代理委托书
2014/10/08 职场文书
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
2021/04/13 Python
Java实现多文件上传功能
2021/06/30 Java/Android
关于Redis的主从复制及哨兵问题
2022/06/16 Redis
如何使用注解方式实现 Redis 分布式锁
2022/07/23 Redis