微信小程序 登录实例详解


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 相关文章推荐
js setTimeout opener的用法示例详解
Oct 23 Javascript
JS控制表格实现一条光线流动分割行的方法
Mar 09 Javascript
由浅入深讲解Javascript继承机制与simple-inheritance源码分析
Dec 13 Javascript
如何使用AngularJs打造权限管理系统【简易型】
May 09 Javascript
jQuery封装的屏幕居中提示信息代码
Jun 08 Javascript
Javascript之深入浅出prototype
Feb 06 Javascript
Node之简单的前后端交互(实例讲解)
Nov 14 Javascript
微信小程序模版渲染详解
Jan 26 Javascript
深入剖析Express cookie-parser中间件实现示例
Feb 01 Javascript
JavaScript闭包相关知识解析
Oct 19 Javascript
微信小程序 this.triggerEvent()的具体使用
Dec 10 Javascript
解决vue项目router切换太慢问题
Jul 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获取系统变量方法小结
2015/05/29 PHP
php生成图片验证码的方法
2016/04/15 PHP
PHP生成可点击刷新的验证码简单示例
2016/05/13 PHP
PHP实现将多个文件压缩成zip格式并下载到本地的方法示例
2018/05/23 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
2019/03/11 PHP
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
js获取url参数值的两种方式
2013/09/10 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
jQuery实现企业网站横幅焦点图切换功能实例
2015/04/30 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
Javascript 实现简单计算器实例代码
2016/10/23 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
微信小程序动态生成二维码的实现代码
2018/07/25 Javascript
jQuery开发仿QQ版音乐播放器
2020/07/10 jQuery
如何通过Proxy实现JSBridge模块化封装
2020/10/22 Javascript
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
[02:50]【扭转乾坤,只此一招】DOTA2永雾林渊版本开启新篇章
2020/12/22 DOTA
python中pandas.DataFrame对行与列求和及添加新行与列示例
2017/03/12 Python
Python内置函数 next的具体使用方法
2017/11/24 Python
用python实现的线程池实例代码
2018/01/06 Python
Python selenium页面加载慢超时的解决方案
2020/03/18 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
我能否用void** 指针作为参数, 使函数按引用接受一般指针
2013/02/16 面试题
高三语文教学反思
2014/01/15 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
摄影专业毕业生求职信
2014/08/05 职场文书
上班离岗检讨书
2014/09/10 职场文书
个人收入证明模板
2014/09/18 职场文书
个人党性分析总结
2015/03/05 职场文书
回复函范文
2015/07/14 职场文书