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…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
3403. 从盒子中找出字典序最大的字符串 I
3403. 从盒子中找出字典序最大的字符串 I 题目链接:3403. 从盒子中找出字典序最大的字符串 I 代码如下: class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论
路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中(图1): mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...
