微信小程序 登录实例详解


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中使用构造函数实现继承的代码
Aug 12 Javascript
基于jquery的无刷新分页技术
Jun 11 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
Oct 29 Javascript
JSON字符串转JSON对象
Jul 31 Javascript
JS实现的文件拖拽上传功能示例
May 21 Javascript
vue cli2.0单页面title修改方法
Jun 07 Javascript
小程序实现带年月选取效果的日历
Jun 27 Javascript
Vue.js的复用组件开发流程完整记录
Nov 29 Javascript
node.js使用express框架进行文件上传详解
Mar 03 Javascript
详解vue为什么要求组件模板只能有一个根元素
Jul 22 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
Sep 12 Javascript
微信小程序和H5页面间相互跳转代码实例
Sep 19 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获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
PHP生成不重复标识符的方法
2014/11/21 PHP
php实现的统计字数函数定义与使用示例
2017/07/26 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
JS过滤url参数特殊字符的实现方法
2013/12/24 Javascript
JavaScript中判断原生函数检查function是否是原生代码
2014/09/09 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
js日期范围初始化得到前一个月日期的方法
2015/05/05 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
jQuery对html元素的取值与赋值实例详解
2015/12/18 Javascript
javascript仿百度输入框提示自动下拉补全
2016/01/07 Javascript
javascript日期比较方法实例分析
2016/06/17 Javascript
jquery判断iPhone、Android设备类型
2016/09/14 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
vue-router中scrollBehavior的巧妙用法
2018/07/09 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
[01:28:56]2014 DOTA2华西杯精英邀请赛 5 24 CIS VS DK
2014/05/26 DOTA
[03:43]2014DOTA2西雅图国际邀请赛 newbee战队巡礼
2014/07/07 DOTA
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
2018/02/23 Python
python3下载抖音视频的完整代码
2019/06/05 Python
Python 画出来六维图
2019/07/26 Python
使用python编写一个语音朗读闹钟功能的示例代码
2020/07/14 Python
Python中logging日志的四个等级和使用
2020/11/17 Python
为什么要做架构设计
2015/07/08 面试题
音乐专业应届生教师求职信
2013/11/04 职场文书
人力资源管理专业自荐书范文
2014/02/10 职场文书
机电职业生涯规划书范文
2014/03/08 职场文书
交通事故协议书范文
2014/04/16 职场文书
爱我中华教学反思
2014/04/28 职场文书
Python中使用Lambda函数的5种用法
2021/04/01 Python
MySQL派生表联表查询实战过程
2022/03/20 MySQL