微信小程序 登录实例详解

发布时间 - 2026-01-10 22:33:39    点击率:

微信小程序登录

一. 小程序不支持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);
      }
    })
  },

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# 微信小程序  # 登录  # 登录详解  # 登录实例  # 微信小程序实战之登录页面制作(5)  # 微信小程序用户授权  # 以及判断登录是否过期的方法  # 微信小程序获取手机号授权用户登录功能  # 微信小程序实现授权登录  # 一步步教会你微信小程序的登录鉴权  # 微信小程序 登录的简单实现  # 微信小程序 后台登录(非微信账号)实例详解  # 微信小程序 如何保持登录状态  # 微信小程序静默登录的实现代码  # 一文教会你微信小程序如何实现登录  # 客户端  # 转成  # 希望能  # 不支持  # 点击下载  # 谢谢大家  # 需要用  # 过程中  # 变成了  # 发送给  # Session  # session_db  # weixin_login  # public  # str_replace  # return  # data  # php  # define_str_replace  # nbsp 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel定时任务怎么设置_Laravel Crontab调度器配置  Laravel如何使用.env文件管理环境变量?(最佳实践)  北京网站制作的公司有哪些,北京白云观官方网站?  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  如何在橙子建站中快速调整背景颜色?  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  香港网站服务器数量如何影响SEO优化效果?  如何正确选择百度移动适配建站域名?  Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)  用v-html解决Vue.js渲染中html标签不被解析的问题  如何快速查询网址的建站时间与历史轨迹?  百度浏览器网页无法复制文字怎么办 百度浏览器复制修复  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集  专业商城网站制作公司有哪些,pi商城官网是哪个?  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  如何在万网自助建站平台快速创建网站?  Laravel如何使用Guzzle调用外部接口_Laravel发起HTTP请求与JSON数据解析【详解】  使用Dockerfile构建java web环境  Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  如何在腾讯云服务器上快速搭建个人网站?  laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法  什么是javascript作用域_全局和局部作用域有什么区别?  网站制作壁纸教程视频,电脑壁纸网站?  制作企业网站建设方案,怎样建设一个公司网站?  edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】  如何实现javascript表单验证_正则表达式有哪些实用技巧  Bootstrap整体框架之CSS12栅格系统  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel Facade的原理是什么_深入理解Laravel门面及其工作机制  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  手机软键盘弹出时影响布局的解决方法  如何在IIS中配置站点IP、端口及主机头?  微信小程序 闭包写法详细介绍  浅谈javascript alert和confirm的美化  如何在阿里云高效完成企业建站全流程?  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Python自动化办公教程_ExcelWordPDF批量处理案例  php json中文编码为null的解决办法  Android使用GridView实现日历的简单功能  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】  如何破解联通资金短缺导致的基站建设难题?  微信小程序 wx.uploadFile无法上传解决办法  香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧  Android 常见的图片加载框架详细介绍  如何用西部建站助手快速创建专业网站?  Python并发异常传播_错误处理解析【教程】