微信小程序 登录实例详解


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 相关文章推荐
在IE中调用javascript打开Excel的代码(downmoon原作)
Apr 02 Javascript
Javascript中Eval函数的使用说明
Oct 11 Javascript
跟我学习javascript的基本类型和引用类型
Nov 16 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
Apr 18 Javascript
jQuery插件实现图片轮播特效
Jun 16 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
Dec 14 Javascript
基于vue实现分页/翻页组件paginator示例
Mar 09 Javascript
JS 实现banner图片轮播效果(鼠标事件)
Aug 04 Javascript
浅谈webpack组织模块的原理
Mar 10 Javascript
微信小程序block的使用教程
Apr 01 Javascript
vue 指令之气泡提示效果的实现代码
Oct 18 Javascript
微信小程序实现注册登录功能(表单校验、错误提示)
Dec 10 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中让上传的文件大小在上传前就受限制的两种解决方法
2013/06/24 PHP
php导出word文档与excel电子表格的简单示例代码
2014/03/08 PHP
php发送get、post请求的6种方法简明总结
2014/07/08 PHP
PHP设计模式之迭代器模式Iterator实例分析【对象行为型】
2020/04/26 PHP
Laravel服务容器绑定的几种方法总结
2020/06/14 PHP
用 javascript 实现的点击复制代码
2007/03/24 Javascript
JQuery为textarea添加maxlength属性的代码
2010/04/07 Javascript
document.write()及其输出内容的样式、位置控制
2013/08/12 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
javascript获取浏览器类型和版本的方法(js获取浏览器版本)
2014/03/13 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
jQuery+Ajax实现无刷新分页
2015/10/30 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
浅谈Webpack核心模块tapable解析
2018/09/11 Javascript
Vue数据双向绑定的深入探究
2018/11/27 Javascript
python自动化测试之连接几组测试包实例
2014/09/28 Python
Python中endswith()函数的基本使用
2015/04/07 Python
Python发送form-data请求及拼接form-data内容的方法
2016/03/05 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
python用装饰器自动注册Tornado路由详解
2017/02/14 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
python opencv对图像进行旋转且不裁剪图片的实现方法
2019/07/09 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
Python @property及getter setter原理详解
2020/03/31 Python
Python学习之time模块的基本使用
2021/01/17 Python
使用HTML5 Canvas API绘制弧线的教程
2016/03/22 HTML / CSS
英国一家专门出售品牌鞋子的网站:Allsole
2016/08/07 全球购物
性能服装:HYLETE
2018/08/14 全球购物
全球领先的美容用品专卖店:Beauty Plus Salon
2018/09/04 全球购物
《灯光》教学反思
2014/02/08 职场文书
工作保证书范文
2014/04/29 职场文书
党员作风建设自查报告
2014/10/23 职场文书
Pytest中conftest.py的用法
2021/06/27 Python
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫