微信小程序 登录实例详解


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 多级下拉菜单核心代码
May 21 Javascript
jquery实现弹出层效果实例
May 19 Javascript
js 创建对象 经典模式全面了解
Aug 16 Javascript
Jquery组件easyUi实现选项卡切换示例
Aug 23 Javascript
Javascript实现图片懒加载插件的方法
Oct 20 Javascript
Vue路由跳转问题记录详解
Jun 15 Javascript
解决vue2 在mounted函数无法获取prop中的变量问题
Nov 15 Javascript
用npm-run实现自动化任务的方法示例
Jan 14 Javascript
js图片查看器插件用法示例
Jun 22 Javascript
浅谈Vue使用Cascader级联选择器数据回显中的坑
Oct 31 Javascript
VUE+Element实现增删改查的示例源码
Nov 23 Vue.js
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
Dec 02 Vue.js
微信小程序 传值取值的几种方法总结
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
绿山咖啡和蓝山咖啡
2021/03/04 新手入门
使用eAccelerator加密PHP程序
2008/10/03 PHP
用PHP实现递归循环每一个目录
2010/08/08 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
php获取从百度搜索进入网站的关键词的详细代码
2014/01/08 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
JavaScript 面向对象的 私有成员和公开成员
2010/05/13 Javascript
jquery 插件开发备注
2010/08/27 Javascript
js读取本地excel文档数据的代码
2010/11/11 Javascript
Javascript实现DIV滚动自动滚动到底部的代码
2012/03/01 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
2013/08/19 Javascript
再分享70+免费的jquery 图片滑块效果插件和教程
2014/12/15 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记6)
2015/12/20 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
JavaScript运动框架 解决速度正负取整问题(一)
2017/05/17 Javascript
jQuery实现html table行Tr的复制、删除、计算功能
2017/07/10 jQuery
深入分析JavaScript 事件循环(Event Loop)
2020/06/19 Javascript
在Vuex中Mutations修改状态操作
2020/07/24 Javascript
Python数据类型学习笔记
2016/01/13 Python
Python tkinter模块中类继承的三种方式分析
2017/08/08 Python
SVM基本概念及Python实现代码
2017/12/27 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
对Python中list的倒序索引和切片实例讲解
2018/11/15 Python
python的scipy实现插值的示例代码
2019/11/12 Python
Python数据分析pandas模块用法实例详解
2019/11/20 Python
通过实例简单了解Python中yield的作用
2019/12/11 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
奖学金自我鉴定范文
2013/10/03 职场文书
中英文求职信范文
2014/01/27 职场文书
葬礼司仪主持词
2014/03/31 职场文书
平安建设工作方案
2014/06/02 职场文书
婚礼女方父母答谢词
2015/01/04 职场文书
刘胡兰观后感
2015/06/16 职场文书
Go语言基础切片的创建及初始化示例详解
2021/11/17 Golang
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python