ajax微信静默登录不起效不跳转问题
问题描述:
今天通过ajax调用方式做微信静默登录,发现本地可以跳转,到线上地址死活都不跳转,就像没起作用一般,经许久排查发现,是因为https和http域名的问题,线上只配置了http域名,所以导致https访问微信时无法实现跳转。
解决:
1、配置https域名
2、换为http访问
---------------------------------------------------------------------------------------------------------------------------------
附:ajax微信静默登录代码
梳理步骤:
1)静态页面调用
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>测试微信静默登录</title><script src="/static/plugins/jquery-2.1.4.min.js"></script>
</head>
<body><div class="login">这是首页啦~~~
</div>
<script>$(function(){$.ajax({url:"/admin/system.Login/islogin",type:"post",data:[],dataType:"json",success:function (res) {if (res.code == 200) {$('.login').html('登录成功');//alert("登录成功!即将跳转到主页...");window.location.href = "/index";return false;} else {if(res.code == 4000){// $('.login').html('<a href="' + res.data.url + '">跳转2:'+res.data.url +'</a>');$('.login').html('获取成功,即将跳转到授权页...');window.location.href = res.data.url;return false;}$('.login').html('授权失败,即将跳转到登录页...');window.location.href = '/login';return false;}}});});
</script>
</body>
</html>
2)后端代码
第一步:获取微信openid并缓存起来
接口1:首页-判断用户是否已登录接口
public function islogin(){$type = @$_GET['type'];$param['user_id'] = user_id(false);//获取用户登录信息$wx_openid = Cache::get('wx_openid');//第一步: 判断用户是否已经登录if($param['user_id']){return success($param,'用户已登录');}//第二步: 用户未登录 判断是否为微信内登录?if(request()->isWx()) {//手机端微信//第三步 微信内用户静默授权 获取用户openid 1)存在 自动登录 2)不存在 跳转登录页面 去登录绑定if($wx_openid){//获取openid后的操作$model = new UserModel();$userInfo = $model->where('openid', $wx_openid)->find();if ($userInfo) {//已登录//设置登录成功缓存信息$loginInfo = LoginService::setlogin($userInfo);return success($loginInfo, '登录成功');}}else{$url = $this->getWxCode();return error('未登录',['url'=>$url], 4000);}}return error('用户未登录');}
函数1):获取微信code码方法
public function getWxCode(){//生成ticket$ticket = uniqid(); // 生成唯一的ticketCache::set($ticket, '', 300);//微信网页授权url$appId = self::$appId;$redirect_uri = urlencode('https://www.myweb.com/admin/system.Login/saveWeiXinOpenId');$scope = 'snsapi_base';//默认静默登录if($type == 2){$scope = 'snsapi_userinfo';//授权登录}$baseUrl = 'https://open.weixin.qq.com/connect/oauth2/authorize';$param = '?appid=' . $appId . '&redirect_uri=' . $redirect_uri . '&response_type=code&scope='. $scope .'&state=' . $ticket . '#wechat_redirect';$url = $baseUrl . $param;return $url;}
函数2:微信授权后回调页面处理函数
public function saveWeiXinOpenId(){$param = $this->params(['code/s' => '','state/s' => '',]);$code = $param['code'];$ticket = $param['state'];$bool = Cache::has($ticket);if (!$bool) {// return ['code'=>4001,'msg'=>'已过期'];header('location:/login');//跳转去登录页exit;}$info = WxLoginService::getWeiXinOpenId($code);if (isset($info['errcode']) || !$info['openid']) {//授权失败直接跳登录页 再次登录// return ['code'=>4002,'msg'=>'获取微信OpenId错误','data'=>$info];header('location:/login');exit;}Cache::set($ticket, json_encode($info), 300);Cache::set('wx_openid', $info['openid'], 300);// session('wx_openid', $info['openid']); //这个方法不好使,换上面的cache缓存吧,原因暂不明// file_put_contents("openid-save.log", Cache::get('wx_openid')."---".date('Y-m-d H:i:s')."\n", FILE_APPEND);//获取openid后的操作$model = new UserModel();$userInfo = $model->where('openid', $info['openid'])->find();if (empty($userInfo)) {//未绑定过,直接去登录 然后绑定// return ['code'=>4003,'msg'=>'手机号不存在'];header('location:/login');exit;}//已绑定过,直接访问首页header('location:/index');exit;}//获取微信openid方法:WxLoginService::getWeiXinOpenId($code)public static function getWeiXinOpenId($code){$appId = self::$appId;$appSecret = self::$appSecret;$baseUrl = 'https://api.weixin.qq.com/sns/oauth2/access_token';$param = '?appid=' . $appId . '&secret=' . $appSecret . '&code=' . $code . '&grant_type=authorization_code';$url = $baseUrl . $param;$guzzHttp = new Client();$response = $guzzHttp->request('GET', $url, ['verify' => false]);$json = $response->getBody()->getContents();$data = json_decode($json, true);return $data;}
第二步:跳转到登录页面,登录完成后,在登录接口调用bindOpenId()方法,给用户绑定openid
public function bindOpenId($phone='',$openid=''){$model = new UserModel();$userInfo = $model->where('phone', $phone)->find();//这个不需要判断,因为已经登录成功,手机号肯定存在,加强判断if (empty($userInfo)) {return error('手机号不存在');}if(!$openid){$openid = Cache::get('wx_openid');}$model->where('phone', $phone)->update(['openid' => $openid]);return success([], '绑定成功');}
相关文章:
ajax微信静默登录不起效不跳转问题
问题描述: 今天通过ajax调用方式做微信静默登录,发现本地可以跳转,到线上地址死活都不跳转,就像没起作用一般,经许久排查发现,是因为https和http域名的问题,线上只配置了http域名࿰…...
参数估计理论
估计理论的主要任务是在某种信号假设下,估算该信号中某个参数(比如幅度、相位、达到时间)的具体取值。 参数估计:先假定研究的问题具有某种数学模型, 如正态分布,二项分布,再用已知类别的学习样…...
mybatis插入数据运行成功但数据库没有数据,id却在增长,是什么原因??
错误描述: mybatis插入数据运行成功,但是数据库却没有数据,id也在增加 原因:在测试方法上面加了 Transactional 虽然日志显示插入语句执行成功,但可能事务在提交过程中出现了问题。比如在后续的操作中有异常抛出导…...
Hadoop简介及单点伪分布式安装
目录 1. 大数据2. Hadoop简介3. Hadoop伪分布式安装4. Hadoop启动参考 1. 大数据 大数据的定义:一种规模大到在获取、存储、管理、分析方面大大超出传统数据库软件工具能力范围的数据集合。 特征: 1.海量的数据规模 2.快速的数据流转 3.…...
网站架构知识之Ansible模块(day021)
1.Ansible模块 作用:通过ansible模块实现批量管理 2.command模块与shell模块 command模块是ansible默认的模块,适用于执行简单的命令,不支持特殊符号 案列01,批量获取主机名 ansible all -m command -a hostname all表示对主机清单所有组…...
是时候用开源降低AI落地门槛了
过去三十多年,从Linux到KVM,从OpenStack到Kubernetes,IT领域众多关键技术都来自开源。开源技术不仅大幅降低了IT成本,也降低了企业技术创新的门槛。 那么,在生成式AI时代,开源能够为AI带来什么?…...
操作系统学习笔记-5.1-IO设备
文章目录 I/O控制器I/O 控制器的组成I/O 控制器的工作流程I/O 控制器的类型I/O 控制器的主要功能I/O 控制器与操作系统的交互DMA 的工作原理DMA 传输模式DMA 控制器的组成 组成内存映像I/O,寄存器独立编址 IO软件层次用户层 I/O 软件设备独立性软件层设备驱动程序中…...
页面、组件、应用、生命周期(微信小程序)
文章目录 页面生命周期函数组件生命周期函数应用(App)生命周期函数页面与组件生命周期的执行顺序注意事项 在微信小程序中,生命周期函数是指页面或组件在不同阶段会被自动调用的特定函数。这些函数可以帮助开发者在适当的时机完成特定的初始化…...
书生第四期实训营进阶岛——L2G4000 InternVL 多模态模型部署微调实践
基础任务 体验InternVL 运行demo 效果如下: 使用XTuner对InternVL进行微调 运行demo 效果如下:...
国内 ChatGPT中文版镜像网站整理合集(2024/11/08)
一、GPT中文镜像站 ① yixiaai.com 支持GPT4、4o以及o1,支持MJ绘画 ② chat.lify.vip 支持通用全模型,支持文件读取、插件、绘画、AIPPT ③ AI Chat 支持GPT3.5/4,4o以及MJ绘画 1. 什么是镜像站 镜像站(Mirror Siteÿ…...
SpringBoot整合Liquibase对数据库管理和迁移
简介 Liquibase是一个用于用于跟踪、管理和应用数据库变化的开源工具,通过日志文件(changelog)的形式记录数据库的变更(changeset),然后执行日志文件中的修改,将数据库更新或回滚(rollback)到一致的状态。它的目标是提供一种数据库类型无关的…...
太空旅游:科技能否让星辰大海变为现实?
内容概要 在这个快速变化的时代,太空旅游成为了一个让人热血沸腾的话题。想象一下,坐在一颗漂浮的太空舱里,手中端着饮料,眺望着无尽的星辰大海,简直就像科幻电影中的情节一样。不过,这不仅仅是一个空洞的…...
[JAVAEE] 面试题(四) - 多线程下使用ArrayList涉及到的线程安全问题及解决
目录 一. 多线程下使用ArrayList 1.1. 自行判断加锁 1.2 使用Collections.synchronizedList()套壳加锁 1.3 CopyOnWriteArrayList类 二. 总结 一. 多线程下使用ArrayList 多线程下使用ArrayList会涉及到线程安全问题, 例如: public static void main(String[] args) thro…...
Elasticsearch-linux环境部署
本文主要介绍linux下elasticsearch的部署。通过在一台linux服务器中分别对elasticsearch-6.7.2版本,elasticsearch-7.3.0版本来进行安装,记录在安装elasticsearch-7.3.0版本时出现的异常情况,以及elasticsearch-head的安装。 基础环境 本机已…...
LeetCode 每日一题 长度为 K 的子数组的能量值
长度为 K 的子数组的能量值 给你一个长度为 n 的整数数组 nums 和一个正整数 k 。 一个数组的 能量值 定义为: 如果 所有 元素都是依次 连续 且 上升 的,那么能量值为 最大 的元素。 否则为 -1 。 你需要求出 nums 中所有长度为 k 的 子数组 的能量值。 …...
人工智能——小白学习指南
知孤云出岫 目录 1. **智能评测系统**2. **个性化学习路径推荐**3. **虚拟学习助手**4. **学习行为分析**5. **数据驱动的教学决策**6. **自动化课程推荐**7. **数据隐私与安全保护** 人工智能知识点的总结和学习路线,以数据表格形式呈现,并附带在教育行…...
go 集成Gin Web开发框架
引入gin的依赖 下载并安装 gin go get -u github.com/gin-gonic/gin 将 gin 引入到代码中 import "github.com/gin-gonic/gin" 开始 package mainimport "github.com/gin-gonic/gin"func main() {r : gin.Default()r.GET("/ping", func(c …...
c++ 多态性
类的多态 多态概念入门 #include <iostream> using namespace std;/* 多态的前提: 拥有继承关系的类中有相同的函数(返回类型、函数名、形参列表) 多态解决的问题:1、派生类的对象被赋值给基类对象时2、派生类的对象初始化基类的引用时3、基类的指针指向派生…...
块存储、文件存储和对象存储详细介绍
块存储、文件存储和对象存储介绍 块存储:像跑车,因为它们都能提供快速的响应和高性能,适合需要即时数据访问的场景,比如数据库和虚拟化技术。 文件存储:像货车,因为它们都能承载大量货物(文件&…...
移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (9) - 编译现有的AWTK应用程序
AWTK 应用程序开发完成后,在配置文件中添加 harmonyos 的选项,通过create_project.py脚本即可生成 DevEco Studio的工程。 安装开发环境 DevEco Studio HarmonyOS 的开发工具。 Python 运行环境。 git 源码管理工具。 下载 awtk 和 awtk-harmonyos…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
