微信小程序 登录实例详解


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 全角转换实现代码
Jul 17 Javascript
javascript 冒泡排序 正序和倒序实现代码
Dec 14 Javascript
js函数的延迟加载实现代码
Oct 11 Javascript
js控制输入框获得和失去焦点时状态显示的方法
Jan 30 Javascript
在原生不支持的旧环境中添加兼容的Object.keys实现方法
Sep 11 Javascript
js封装成插件_Canvas统计图插件编写实例
Sep 12 Javascript
Angular使用操作事件指令ng-click传多个参数示例
Mar 27 Javascript
基于jQuery实现无缝轮播与左右点击效果
May 13 jQuery
微信小程序实现折叠展开效果
Jul 19 Javascript
Vue slot用法(小结)
Oct 22 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
Oct 16 Javascript
JS实现动态无缝轮播
Jan 11 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
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
phpword插件导出word文件时中文乱码问题处理方案
2014/08/19 PHP
在Win2003(64位)中配置IIS6+PHP5.2.17+MySQL5.5的运行环境
2016/04/04 PHP
php新建文件的方法实例
2019/09/26 PHP
动态加载js的几种方法
2006/10/23 Javascript
优化javascript的执行速度
2010/01/23 Javascript
js弹出层之1:JQuery.Boxy (二)
2011/10/06 Javascript
基于Jquery插件开发之图片放大镜效果(仿淘宝)
2011/11/19 Javascript
javascript 正则表达式相关应介绍
2012/11/27 Javascript
jquery选择器-根据多个属性选择示例代码
2013/10/21 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
javascript面向对象之访问对象属性的两种方式分析
2015/01/13 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
vue使用localStorage保存登录信息 适用于移动端、PC端
2019/05/27 Javascript
策略模式实现 Vue 动态表单验证的方法
2019/09/16 Javascript
Vue路由守卫之路由独享守卫
2019/09/25 Javascript
vue setInterval 定时器失效的解决方式
2020/07/30 Javascript
解决vue项目运行提示Warnings while compiling.警告的问题
2020/09/18 Javascript
解读Python编程中的命名空间与作用域
2015/10/16 Python
Python编码类型转换方法详解
2016/07/01 Python
Python虚拟环境virtualenv的安装与使用详解
2017/05/28 Python
python实现简单日期工具类
2019/04/24 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
简单了解python shutil模块原理及使用方法
2020/04/28 Python
基于Python模拟浏览器发送http请求
2020/11/06 Python
abstract class和interface有什么区别?
2012/01/03 面试题
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
2013/05/23 面试题
毕业生的自我评价分享
2013/12/18 职场文书
完美的中文自荐信
2014/05/24 职场文书
五四青年节的活动方案
2014/08/20 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
文案策划岗位职责
2015/02/11 职场文书
交通事故起诉书
2015/05/19 职场文书
Python实现随机生成迷宫并自动寻路
2021/06/13 Python