微信小程序 登录实例详解


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 相关文章推荐
location.href用法总结(最主要的)
Dec 27 Javascript
在javascript中如何得到中英文混合字符串的长度
Jan 17 Javascript
js创建表单元素并使用submit进行提交
Aug 14 Javascript
在JavaScript中使用对数Math.log()方法的教程
Jun 15 Javascript
jQuery Ajax Post 回调函数不执行问题的解决方法
Aug 15 Javascript
浅谈EasyUi ComBotree树修改 父节点选择的问题
Nov 07 Javascript
基于JavaScript实现微信抢红包功能
Jul 20 Javascript
js实现方块上下左右移动效果
Aug 17 Javascript
animate.css在vue项目中的使用教程
Aug 05 Javascript
js canvas实现橡皮擦效果
Dec 20 Javascript
atom-design(Vue.js移动端组件库)手势组件使用教程
May 16 Javascript
layui table去掉右侧滑动条的实现方法
Sep 05 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另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
Yii2.0预定义的别名功能小结
2016/07/04 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
input输入框的自动匹配(原生代码)
2013/03/19 Javascript
分享一个常用的javascript静态类
2014/12/31 Javascript
javascript+html5实现仿flash滚动播放图片的方法
2015/04/27 Javascript
在JavaScript中处理字符串之link()方法的使用
2015/06/08 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
原生javascript实现自动更新的时间日期
2016/02/12 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
2017/03/02 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
js前端面试之同步与异步问题详解
2019/04/03 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
原生JS实现微信通讯录
2020/06/18 Javascript
js实现直播点击飘心效果
2020/08/19 Javascript
[01:04:35]2018DOTA2亚洲邀请赛 4.3 突围赛 Secret vs VG 第一场
2018/04/04 DOTA
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
Python远程视频监控程序的实例代码
2019/05/05 Python
PyQt4编程之让状态栏显示信息的方法
2019/06/18 Python
pytorch中使用cuda扩展的实现示例
2020/02/12 Python
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
SQL Server面试题
2013/04/04 面试题
正规的求职信范文分享
2013/12/11 职场文书
商场中秋节广播稿
2014/01/17 职场文书
物资采购方案
2014/06/12 职场文书
感恩老师演讲稿600字
2014/08/28 职场文书
体育活动总结
2015/02/04 职场文书
走进毛泽东观后感
2015/06/04 职场文书
七一晚会主持词
2015/06/29 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
MySQL空间数据存储及函数
2021/09/25 MySQL
「海贼王」112.9万粉丝纪念图标公布
2022/03/21 日漫