微信小程序 登录实例详解


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 相关文章推荐
网页设计常用的一些技巧
Dec 22 Javascript
js arguments对象应用介绍
Nov 28 Javascript
在js文件中写el表达式取不到值的原因及解决方法
Dec 23 Javascript
JavaScript和CSS交互的方法汇总
Dec 02 Javascript
jQuery Ajax 实例代码 ($.ajax、$.post、$.get)
Apr 29 Javascript
利用Jquery队列实现根据输入数量显示的动画
Sep 01 Javascript
jQuery.parseHTML() 函数详解
Jan 09 Javascript
javascript浏览器用户代理检测脚本实现方法
Oct 27 Javascript
vue内置指令详解
Apr 03 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
Sep 23 Javascript
解决vant title-active-color与title-inactive-color不生效问题
Nov 03 Javascript
关于小程序优化的一些建议(小结)
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将数据库中所有内容生成静态html文档的代码
2010/04/12 PHP
php笔记之常用文件操作
2010/10/12 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
php 伪造HTTP_REFERER页面URL来源的三种方法
2016/09/22 PHP
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
intro.js 页面引导简单用法 分享
2013/08/06 Javascript
jQuery实现的简单拖拽功能示例
2016/09/13 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
vue.js之vue-cli脚手架的搭建详解
2017/05/05 Javascript
js实现图片放大展示效果
2017/08/30 Javascript
详解用Node.js实现Restful风格webservice
2017/09/29 Javascript
node的process以及child_process模块学习笔记
2018/03/06 Javascript
浅谈手写node可读流之流动模式
2018/06/01 Javascript
详解Nodejs mongoose
2018/06/10 NodeJs
element-ui表格合并span-method的实现方法
2019/05/21 Javascript
vue-week-picker实现支持按周切换的日历
2019/06/26 Javascript
package.json各个属性说明详解
2020/03/11 Javascript
pip安装Python库时遇到的问题及解决方法
2017/11/23 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
python实现list由于numpy array的转换
2018/04/04 Python
postman模拟访问具有Session的post请求方法
2019/07/15 Python
200行python代码实现贪吃蛇游戏
2020/04/24 Python
python搜索算法原理及实例讲解
2020/11/18 Python
HTML5 标准将把互联网视频扔回到黑暗时代
2010/02/10 HTML / CSS
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
涉外经济法专业毕业生推荐信
2013/11/24 职场文书
计算机专业毕业生求职信分享
2013/12/24 职场文书
社区庆八一活动方案
2014/02/02 职场文书
企业优秀团员事迹材料
2014/08/20 职场文书
2015年档案管理工作总结
2015/04/08 职场文书
大学感恩节活动总结
2015/05/05 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android