微信小程序 登录实例详解


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 相关文章推荐
In Javascript Class, how to call the prototype method.(three method)
Jan 09 Javascript
js宝典学习笔记(上)
Jan 10 Javascript
js全屏显示显示代码的三种方法
Nov 11 Javascript
AngularJS入门教程之REST和定制服务详解
Aug 19 Javascript
Angularjs实现带查找筛选功能的select下拉框示例代码
Oct 04 Javascript
jQuery实现ToolTip元素定位显示功能示例
Nov 23 Javascript
Bootstrap禁用响应式布局的实现方法
Mar 09 Javascript
angularJS模态框$modal实例代码
May 27 Javascript
javascript实现QQ空间相册展示源码
Dec 12 Javascript
使用 Node.js 开发资讯爬虫流程
Jan 07 Javascript
vue watch监听对象及对应值的变化详解
Feb 24 Javascript
VSCode插件安装完成后的配置(常用配置)
Aug 24 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
PHP4实际应用经验篇(5)
2006/10/09 PHP
php实现的发送带附件邮件类实例
2014/09/22 PHP
php实现替换手机号中间数字为*号及隐藏IP最后几位的方法
2016/11/16 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
2014/10/07 Javascript
javascript动态创建链接的方法
2015/05/13 Javascript
遮罩层点击按钮弹出并且具有拖动和关闭效果(两种方法)
2015/08/20 Javascript
javascript实现查找数组中最大值方法汇总
2016/02/13 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
Node.js+Express+MySql实现用户登录注册功能
2017/07/10 Javascript
Angularjs之如何在跨域请求中传输Cookie的方法
2018/06/01 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
详解js动态获取浏览器或页面等容器的宽高
2019/03/13 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
用Python编写web API的教程
2015/04/30 Python
Python日期的加减等操作的示例
2017/08/15 Python
Python自定义线程类简单示例
2018/03/23 Python
使用Python快速制作可视化报表的方法
2019/02/03 Python
Python3 tkinter 实现文件读取及保存功能
2019/09/12 Python
python 使用cx-freeze打包程序的实现
2020/03/14 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
python 字符串格式化的示例
2020/09/21 Python
css3实现3d旋转动画特效
2015/03/10 HTML / CSS
Linux Interview Questions For software testers
2013/05/17 面试题
秘书行业自我鉴定范文
2013/12/30 职场文书
《忆江南》教学反思
2014/04/07 职场文书
专题组织生活会方案
2014/06/15 职场文书
厨师长岗位职责范本
2014/08/25 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
CentOS7和8下安装Maven3.8.4
2022/04/07 Servers
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS