微信小程序 登录实例详解


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京东商城双11焦点图多图广告特效代码分享
Sep 06 Javascript
JavaScript模块规范之AMD规范和CMD规范
Oct 27 Javascript
Javascript获取统一管理的提示语(message)
Feb 03 Javascript
如何使用PHP+jQuery+MySQL实现异步加载ECharts地图数据(附源码下载)
Feb 23 Javascript
微信小程序实战之自定义模态弹窗(8)
Apr 18 Javascript
如何封装了一个vue移动端下拉加载下一页数据的组件
Jan 06 Javascript
浅谈js闭包理解
Mar 28 Javascript
基于Node.js搭建hexo博客过程详解
Jun 25 Javascript
JavaScript canvas仿代码流瀑布
Feb 10 Javascript
Javascript异步编程async实现过程详解
Apr 02 Javascript
微信小程序用户登录和登录态维护的实现
Dec 10 Javascript
36个正则表达式(开发效率提高80%)
Nov 17 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和MySql中计算时间差的方法
2011/04/22 PHP
PHP创建单例后台进程的方法示例
2017/05/23 PHP
laravel 出现command not found问题的解决方案
2019/10/23 PHP
有关javascript的性能优化 (repaint和reflow)
2013/04/12 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
JavaScript实现随机替换图片的方法
2015/04/16 Javascript
基于jQuery日历插件制作日历
2016/03/11 Javascript
Javascript中内建函数reduce的应用详解
2016/10/20 Javascript
JS获得一个对象的所有属性和方法实例
2017/02/21 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
IScroll5实现下拉刷新上拉加载的功能实例
2017/08/11 Javascript
Vue header组件开发详解
2018/01/26 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
VUE 配置vue-devtools调试工具及安装方法
2018/09/30 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
2018/10/12 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
Python pass 语句使用示例
2014/03/11 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
mysql 之通过配置文件链接数据库
2017/08/12 Python
Python中应该使用%还是format来格式化字符串
2018/09/25 Python
pytorch标签转onehot形式实例
2020/01/02 Python
英国的知名精品百货公司:House of Fraser(福来德)
2016/08/14 全球购物
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
运动会解说词50字
2014/01/18 职场文书
服务生自我鉴定
2014/01/22 职场文书
婚礼答谢宴主持词
2014/03/14 职场文书
私人委托书格式
2014/09/10 职场文书
单位委托书格式范本
2014/09/29 职场文书
群众路线专项整治方案
2014/10/27 职场文书
电气工程师岗位职责
2015/02/12 职场文书
公司放假通知怎么写
2015/04/15 职场文书
学校后勤工作总结2015
2015/05/15 职场文书
灵魂歌王观后感
2015/06/17 职场文书