微信小程序 登录实例详解


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删除指定的html标签并保留标签内文本内容的方法
Apr 02 Javascript
jquery手风琴特效插件
Feb 04 Javascript
谈谈JavaScript类型系统之Math
Jan 06 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
基于JQuery打造无缝滚动新闻步骤详解
Mar 31 Javascript
js删除Array数组中指定元素的两种方法
Aug 03 Javascript
JS实现的DIV块来回滚动效果示例
Feb 07 Javascript
原生JS实现不断变化的标签
May 22 Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 Javascript
Angular实现的进度条功能示例
Feb 18 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
Sep 21 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
php REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
PHP获取当前日期所在星期(月份)的开始日期与结束日期(实现代码)
2013/06/18 PHP
Yii使用Captcha验证码的方法
2015/12/28 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
PHP实现带进度条的Ajax文件上传功能示例
2019/07/02 PHP
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
js几个验证函数代码
2010/03/25 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
教你用jquery实现iframe自适应高度
2014/06/11 Javascript
js事件绑定快捷键以ctrl+k为例
2014/09/30 Javascript
JavaScript italics方法入门实例(把字符串显示为斜体)
2014/10/17 Javascript
node.js [superAgent] 请求使用示例
2015/03/13 Javascript
Bootstrap的图片轮播示例代码
2015/08/31 Javascript
js与applet相互调用的方法
2016/06/22 Javascript
BootStrap初学者对弹出框和进度条的使用感觉
2016/06/27 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
React中使用async validator进行表单验证的实例代码
2018/08/17 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
vue进入页面时不在顶部,检测滚动返回顶部按钮问题及解决方法
2019/10/30 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
js实现随机点名器精简版
2020/06/29 Javascript
Python的Twisted框架上手前所必须了解的异步编程思想
2016/05/25 Python
django 多数据库配置教程
2018/05/30 Python
Python3实现的判断回文链表算法示例
2019/03/08 Python
pip安装python库的方法总结
2019/08/02 Python
详解python 条件语句和while循环的实例代码
2020/12/28 Python
Python利用socket模块开发简单的端口扫描工具的实现
2021/01/27 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
美国宠物商店:Wag.com
2016/10/25 全球购物
高职助产应届生自荐信
2013/09/24 职场文书
开业庆典邀请函
2014/01/08 职场文书
干部年终考核评语
2015/01/04 职场文书
大学辅导员述职报告
2015/01/10 职场文书
2019年思想汇报
2019/06/20 职场文书
javascript实现计算器功能详解流程
2021/11/01 Javascript