微信小程序 登录实例详解


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 鼠标点击事件及其它捕获
Jun 04 Javascript
简介JavaScript中Math.LOG10E属性的使用
Jun 14 Javascript
JavaScript类型系统之布尔Boolean类型详解
Jun 26 Javascript
jQuery网页定位导航特效实现方法
Dec 19 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
May 05 Javascript
浅谈express 中间件机制及实现原理
Aug 31 Javascript
javascript实现循环广告条效果
Dec 12 Javascript
Vue.js 中的 v-model 指令及绑定表单元素的方法
Dec 03 Javascript
运用js实现图层拖拽的功能
May 24 Javascript
js设置鼠标悬停改变背景色实现详解
Jun 26 Javascript
JavaScript实现Excel表格效果
Feb 07 Javascript
微信小程序连续签到7天积分获得功能的示例代码
Aug 20 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
日本收入最高的漫画家:海贼王作者版税年收入高达8.45亿元
2020/03/04 日漫
PHP生成指定随机字符串的简单实现方法
2015/04/01 PHP
PHP常用算法和数据结构示例(必看篇)
2017/03/15 PHP
javascript 关闭IE6、IE7
2009/06/01 Javascript
jquery EasyUI的formatter格式化函数代码
2011/01/12 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
js jquery ajax的几种用法总结(及优缺点介绍)
2014/01/28 Javascript
实例分析javascript中的call()和apply()方法
2014/11/28 Javascript
javascript的日期对象、数组对象、二维数组使用说明
2014/12/22 Javascript
JavaScript简介
2015/02/15 Javascript
javascript实现网页端解压并查看zip文件
2015/12/15 Javascript
jQuery防止重复绑定事件的解决方法
2016/05/14 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
微信公众号 摇一摇周边功能开发
2016/12/08 Javascript
Bootstrap进度条学习使用
2017/02/09 Javascript
JS+HTML5实现图片在线预览功能
2017/07/22 Javascript
Node.js笔记之process模块解读
2018/05/31 Javascript
[03:49]2016完美“圣”典风云人物:AMS专访
2016/12/06 DOTA
python中异常捕获方法详解
2017/03/03 Python
Python实现PS滤镜的旋转模糊功能示例
2018/01/20 Python
Centos7 Python3下安装scrapy的详细步骤
2018/03/15 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
pygame实现简易飞机大战
2018/09/11 Python
树莓派实现移动拍照
2019/06/22 Python
PIL图像处理模块paste方法简单使用详解
2019/07/17 Python
canvas粒子动画背景的实现示例
2018/09/03 HTML / CSS
RealTek面试题
2016/06/28 面试题
大专生自我鉴定范文
2013/10/01 职场文书
大专应届生个人的自我评价
2013/11/21 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
个人评语大全
2014/05/04 职场文书
招商引资工作汇报材料
2014/10/28 职场文书
中班下学期个人工作总结
2015/02/12 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL
java解析XML详解
2021/07/09 Java/Android
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript