当前位置: 首页 > news >正文

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微信静默登录不起效不跳转问题

问题描述&#xff1a; 今天通过ajax调用方式做微信静默登录&#xff0c;发现本地可以跳转&#xff0c;到线上地址死活都不跳转&#xff0c;就像没起作用一般&#xff0c;经许久排查发现&#xff0c;是因为https和http域名的问题&#xff0c;线上只配置了http域名&#xff0…...

参数估计理论

估计理论的主要任务是在某种信号假设下&#xff0c;估算该信号中某个参数&#xff08;比如幅度、相位、达到时间&#xff09;的具体取值。 参数估计&#xff1a;先假定研究的问题具有某种数学模型&#xff0c; 如正态分布&#xff0c;二项分布&#xff0c;再用已知类别的学习样…...

mybatis插入数据运行成功但数据库没有数据,id却在增长,是什么原因??

错误描述&#xff1a; mybatis插入数据运行成功&#xff0c;但是数据库却没有数据&#xff0c;id也在增加 原因&#xff1a;在测试方法上面加了 Transactional 虽然日志显示插入语句执行成功&#xff0c;但可能事务在提交过程中出现了问题。比如在后续的操作中有异常抛出导…...

Hadoop简介及单点伪分布式安装

目录 1. 大数据2. Hadoop简介3. Hadoop伪分布式安装4. Hadoop启动参考 1. 大数据 大数据的定义&#xff1a;一种规模大到在获取、存储、管理、分析方面大大超出传统数据库软件工具能力范围的数据集合。   特征&#xff1a;   1.海量的数据规模   2.快速的数据流转   3.…...

网站架构知识之Ansible模块(day021)

1.Ansible模块 作用:通过ansible模块实现批量管理 2.command模块与shell模块 command模块是ansible默认的模块&#xff0c;适用于执行简单的命令&#xff0c;不支持特殊符号 案列01&#xff0c;批量获取主机名 ansible all -m command -a hostname all表示对主机清单所有组…...

是时候用开源降低AI落地门槛了

过去三十多年&#xff0c;从Linux到KVM&#xff0c;从OpenStack到Kubernetes&#xff0c;IT领域众多关键技术都来自开源。开源技术不仅大幅降低了IT成本&#xff0c;也降低了企业技术创新的门槛。 那么&#xff0c;在生成式AI时代&#xff0c;开源能够为AI带来什么&#xff1f;…...

操作系统学习笔记-5.1-IO设备

文章目录 I/O控制器I/O 控制器的组成I/O 控制器的工作流程I/O 控制器的类型I/O 控制器的主要功能I/O 控制器与操作系统的交互DMA 的工作原理DMA 传输模式DMA 控制器的组成 组成内存映像I/O&#xff0c;寄存器独立编址 IO软件层次用户层 I/O 软件设备独立性软件层设备驱动程序中…...

页面、组件、应用、生命周期(微信小程序)

文章目录 页面生命周期函数组件生命周期函数应用&#xff08;App&#xff09;生命周期函数页面与组件生命周期的执行顺序注意事项 在微信小程序中&#xff0c;生命周期函数是指页面或组件在不同阶段会被自动调用的特定函数。这些函数可以帮助开发者在适当的时机完成特定的初始化…...

书生第四期实训营进阶岛——L2G4000 InternVL 多模态模型部署微调实践

基础任务 体验InternVL 运行demo 效果如下&#xff1a; 使用XTuner对InternVL进行微调 运行demo 效果如下&#xff1a;...

国内 ChatGPT中文版镜像网站整理合集(2024/11/08)

一、GPT中文镜像站 ① yixiaai.com 支持GPT4、4o以及o1&#xff0c;支持MJ绘画 ② chat.lify.vip 支持通用全模型&#xff0c;支持文件读取、插件、绘画、AIPPT ③ AI Chat 支持GPT3.5/4&#xff0c;4o以及MJ绘画 1. 什么是镜像站 镜像站&#xff08;Mirror Site&#xff…...

SpringBoot整合Liquibase对数据库管理和迁移

简介 Liquibase是一个用于用于跟踪、管理和应用数据库变化的开源工具&#xff0c;通过日志文件(changelog)的形式记录数据库的变更(changeset)&#xff0c;然后执行日志文件中的修改&#xff0c;将数据库更新或回滚(rollback)到一致的状态。它的目标是提供一种数据库类型无关的…...

太空旅游:科技能否让星辰大海变为现实?

内容概要 在这个快速变化的时代&#xff0c;太空旅游成为了一个让人热血沸腾的话题。想象一下&#xff0c;坐在一颗漂浮的太空舱里&#xff0c;手中端着饮料&#xff0c;眺望着无尽的星辰大海&#xff0c;简直就像科幻电影中的情节一样。不过&#xff0c;这不仅仅是一个空洞的…...

[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版本&#xff0c;elasticsearch-7.3.0版本来进行安装&#xff0c;记录在安装elasticsearch-7.3.0版本时出现的异常情况&#xff0c;以及elasticsearch-head的安装。 基础环境 本机已…...

LeetCode 每日一题 长度为 K 的子数组的能量值

长度为 K 的子数组的能量值 给你一个长度为 n 的整数数组 nums 和一个正整数 k 。 一个数组的 能量值 定义为&#xff1a; 如果 所有 元素都是依次 连续 且 上升 的&#xff0c;那么能量值为 最大 的元素。 否则为 -1 。 你需要求出 nums 中所有长度为 k 的 子数组 的能量值。 …...

人工智能——小白学习指南

知孤云出岫 目录 1. **智能评测系统**2. **个性化学习路径推荐**3. **虚拟学习助手**4. **学习行为分析**5. **数据驱动的教学决策**6. **自动化课程推荐**7. **数据隐私与安全保护** 人工智能知识点的总结和学习路线&#xff0c;以数据表格形式呈现&#xff0c;并附带在教育行…...

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;/* 多态的前提: 拥有继承关系的类中有相同的函数(返回类型、函数名、形参列表) 多态解决的问题&#xff1a;1、派生类的对象被赋值给基类对象时2、派生类的对象初始化基类的引用时3、基类的指针指向派生…...

块存储、文件存储和对象存储详细介绍

块存储、文件存储和对象存储介绍 块存储&#xff1a;像跑车&#xff0c;因为它们都能提供快速的响应和高性能&#xff0c;适合需要即时数据访问的场景&#xff0c;比如数据库和虚拟化技术。 文件存储&#xff1a;像货车&#xff0c;因为它们都能承载大量货物&#xff08;文件&…...

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (9) - 编译现有的AWTK应用程序

AWTK 应用程序开发完成后&#xff0c;在配置文件中添加 harmonyos 的选项&#xff0c;通过create_project.py脚本即可生成 DevEco Studio的工程。 安装开发环境 DevEco Studio HarmonyOS 的开发工具。 Python 运行环境。 git 源码管理工具。 下载 awtk 和 awtk-harmonyos…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Module Federation 和 Native Federation 的比较

前言 Module Federation 是 Webpack 5 引入的微前端架构方案&#xff0c;允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...