微信小程序 登录实例详解


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 相关文章推荐
网页里控制图片大小的相关代码
Jun 13 Javascript
javascript奇异的arguments分析
Oct 20 Javascript
JQuery对checkbox操作 (循环获取)
May 20 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
Jan 15 Javascript
js捕获鼠标右键菜单中的粘帖事件实现代码
Apr 01 Javascript
解释&&和||在javascript中的另类用法
Jul 28 Javascript
JavaScript实现页面5秒后自动跳转的方法
Apr 16 Javascript
使用AngularJS来实现HTML页面嵌套的方法
Jun 17 Javascript
jQuery+CSS3实现3D立方体旋转效果
Nov 10 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
Sep 16 Javascript
vue 组件中添加样式不生效的解决方法
Jul 06 Javascript
vue路由前进后退动画效果的实现代码
Dec 10 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
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
php_imagick实现图片剪切、旋转、锐化、减色或增加特效的方法
2014/12/15 PHP
php简单图像创建入门实例
2015/06/10 PHP
php使用curl代理实现抓取数据的方法
2017/02/03 PHP
javascript之对系统的toFixed()方法的修正
2007/05/08 Javascript
JavaScript 高级篇之DOM文档,简单封装及调用、动态添加、删除样式(六)
2012/04/07 Javascript
js中的scroll和offset 使用比较的实例与分析
2013/09/29 Javascript
js动态修改input输入框的type属性(实现方法解析)
2013/11/13 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
jstree创建无限分级树的方法【基于ajax动态创建子节点】
2016/10/25 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
jQuery实现导航回弹效果
2017/02/27 Javascript
利用纯JS实现像素逐渐显示的方法示例
2017/08/14 Javascript
JS实现超级好看的鼠标小尾巴特效
2020/12/01 Javascript
[52:02]DOTA2-DPC中国联赛 正赛 Phoenix vs Dragon BO3 第二场 2月26日
2021/03/11 DOTA
python实现多线程行情抓取工具的方法
2018/02/28 Python
python实现K近邻回归,采用等权重和不等权重的方法
2019/01/23 Python
Python中xml和dict格式转换的示例代码
2019/11/07 Python
Numpy 理解ndarray对象的示例代码
2020/04/03 Python
详解HTML5布局和HTML5标签
2020/10/26 HTML / CSS
中国最大的团购网站:聚划算
2016/09/21 全球购物
经济实惠的豪华家具:My-Furniture
2019/03/12 全球购物
Ben Sherman官方网站:英国男装品牌
2019/10/22 全球购物
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
天网面试题
2013/04/07 面试题
秋季婚礼证婚词
2014/01/11 职场文书
技校个人求职信范文
2014/01/25 职场文书
幼儿园开学寄语
2014/04/03 职场文书
骨干教师事迹材料
2014/12/17 职场文书
宝葫芦的秘密观后感
2015/06/11 职场文书
信用卡收入证明范本
2015/06/12 职场文书
Python数据分析入门之教你怎么搭建环境
2021/05/13 Python
梳理总结Python开发中需要摒弃的18个坏习惯
2022/01/22 Python
Redis之RedisTemplate配置方式(序列和反序列化)
2022/03/13 Redis
Java数据结构之堆(优先队列)
2022/05/20 Java/Android