微信小程序 登录实例详解


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 相关文章推荐
Tab页界面,用jQuery及Ajax技术实现
Sep 21 Javascript
JavaScript模板入门介绍
Sep 26 Javascript
js仿百度贴吧验证码特效实例代码
Jan 16 Javascript
js实现二代身份证号码验证详解
Nov 20 Javascript
jquery实现对联广告的方法
Feb 05 Javascript
JavaScript中的标签语句用法分析
Feb 10 Javascript
全面了解构造函数继承关键apply call
Jul 26 Javascript
第一次记录Bootstrap table学习笔记(1)
May 18 Javascript
BootstrapTable加载按钮功能实例代码详解
Sep 22 Javascript
微信小程序switch开关选择器使用详解
Jan 31 Javascript
一看就会的vuex实现登录验证(附案例)
Jan 09 Javascript
vue实现路由懒加载的3种方法示例
Sep 01 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实现的获取URL信息的类
2007/01/02 PHP
PHP daddslashes 使用方法介绍
2012/10/26 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
Yii2使用swiftmailer发送邮件的方法
2016/05/03 PHP
PHP 5.6.11 访问SQL Server2008R2的几种情况详解
2016/08/08 PHP
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
jquery post方式传递多个参数值后台以数组的方式进行接收
2013/01/11 Javascript
jquery打开直接跳到网页最下面、最低端实现代码
2013/04/22 Javascript
jquery foreach使用示例
2013/09/12 Javascript
js自动生成对象的属性示例代码
2013/10/28 Javascript
JS锚点的设置与使用方法
2016/09/05 Javascript
jQuery动态追加页面数据以及事件委托详解
2017/05/06 jQuery
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
2017/10/24 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
详解python的webrtc库实现语音端点检测
2017/05/31 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
在Python 中同一个类两个函数间变量的调用方法
2019/01/31 Python
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
Django 静态文件配置过程详解
2019/07/23 Python
python函数的万能参数传参详解
2019/07/26 Python
python飞机大战pygame碰撞检测实现方法分析
2019/12/17 Python
python获取依赖包和安装依赖包教程
2020/02/13 Python
linux 下selenium chrome使用详解
2020/04/02 Python
python多进程使用函数封装实例
2020/05/02 Python
Django 解决上传文件时,request.FILES为空的问题
2020/05/20 Python
解决python 执行sql语句时所传参数含有单引号的问题
2020/06/06 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
h5移动端调用支付宝、微信支付的实现
2020/06/08 HTML / CSS
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
班组安全员工作职责
2014/02/01 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
SQL SERVER存储过程用法详解
2022/02/24 SQL Server