首页
留言
导航
统计
Search
1
追番推荐!免费看动漫的网站 - 支持在线观看和磁力下载
3,932 阅读
2
推荐31个docker应用,每一个都很实用
1,624 阅读
3
PVE自动启动 虚拟机 | 容器 顺序设置及参数说明
1,119 阅读
4
一条命令,永久激活!Office 2024!
705 阅读
5
优选 Cloudflare 官方 / 中转 IP
569 阅读
默认分类
服务器
宝塔
VPS
Docker
OpenWRT
Nginx
群晖
前端编程
Vue
React
Angular
NodeJS
uni-app
后端编程
Java
Python
SpringBoot
SpringCloud
流程引擎
检索引擎
Linux
CentOS
Ubuntu
Debian
数据库
Redis
MySQL
Oracle
虚拟机
VMware
VirtualBox
PVE
Hyper-V
计算机
网络技术
网站源码
主题模板
登录
Search
标签搜索
Java
小程序
Redis
SpringBoot
docker
Typecho
Cloudflare
uni-app
docker部署
虚拟机
WordPress
群晖
CentOS
Vue
Java类库
计算机网络
Linux命令
防火墙配置
Mysql
脚本
微醺
累计撰写
267
篇文章
累计收到
11
条评论
首页
栏目
默认分类
服务器
宝塔
VPS
Docker
OpenWRT
Nginx
群晖
前端编程
Vue
React
Angular
NodeJS
uni-app
后端编程
Java
Python
SpringBoot
SpringCloud
流程引擎
检索引擎
Linux
CentOS
Ubuntu
Debian
数据库
Redis
MySQL
Oracle
虚拟机
VMware
VirtualBox
PVE
Hyper-V
计算机
网络技术
网站源码
主题模板
页面
留言
导航
统计
搜索到
5
篇与
的结果
2026-03-26
UniApp 微信无感登录实战:小程序 + 公众号 H5 静默授权全通关
做微信生态开发的同学,大概率都被这两个问题折磨过:一弹授权框就流失用户;小程序和公众号 H5 登录逻辑混用,BUG 越改越多;想实现用户打开就自动识别身份,却总踩各种配置坑、接口坑、安全坑……,今天这篇实战文章,把 UniApp 适配 微信小程序 + 公众号 H5 的静默登录拆透,全程无弹窗、用户零感知,附可直接复制的源码 + 高频避坑指南,看完就能落地!一、先搞懂:静默登录到底在解决什么?简单说:不弹框、不打扰,悄悄拿到用户 openid,实现自动登录。openid 就是微信用户在当前 小程序 / 公众号 下的唯一 ID,拿到它,就能精准识别用户、同步数据、无感登录。微信两大生态,静默逻辑完全不同,千万别混用:平台实现方式核心 API用户体验微信小程序直接调用登录接口uni.login完全无感知公众号 H5OAuth2.0 静默跳转snsapi_base页面快闪一次,无感知下面分场景手把手实现。二、场景 1:微信小程序静默登录(零弹窗)核心结论 uni.login 本身就是静默的,不会弹出任何授权框!前端只拿 code,openid 必须由后端换取,这是铁律。完整可运行代码import { onLoad } from'@dcloudio/uni-app' onLoad(() => { // 1. 先查本地是否已缓存openid const openid = uni.getStorageSync('openid') if (openid) { console.log('老用户,openid:', openid) return } // 2. 静默获取code uni.login({ provider: 'weixin', success: (loginRes) => { console.log('临时code:', loginRes.code) // 3. 传给后端换openid uni.request({ url: 'https://your-server.com/api/wx/login', data: { code: loginRes.code }, success: (res) => { // 4. 缓存openid,下次直接用 uni.setStorageSync('openid', res.data.openid) } }) } }) })执行流程(闭眼记) 用户打开小程序 → uni.login 静默拿 code → 后端用 code+AppSecret 换 openid → 前端缓存 → 全程无弹窗⚠️ 小程序必踩 4 大坑前端直接拿 openiduni.login 只返回 code,openid 必须后端请求微信jscode2session接口换取。AppSecret 写在前端等同于泄露账号权限,绝对禁止出现在客户端代码。iOS App 打包后弹授权非小程序环境,需配置manifest.json的universalLinks,属于微信开放平台登录逻辑。多小程序 openid 串号缓存 key 建议用openid_${小程序appid},避免共用 storage 冲突。三、场景 2:公众号 H5 静默登录(快闪无感知核心结论 H5 没有 uni.login,靠OAuth2.0 静默跳转,微信自动带 code 返回页面,用户仅感觉页面闪一下。完整可运行代码(App.vue)export default { async onLaunch(e) { const appid = '你的公众号AppID' // 回调域名必须在公众号后台配置,且编码 const redirect_uri = encodeURIComponent('https://你的域名.com/') // 1. 本地有openid直接跳过 const openid = uni.getStorageSync('openid') if (openid) { console.log('已登录,openid:', openid) return } // 2. URL带回code,直接换openid if (e.query.code) { const res = await uni.request({ url: 'https://你的服务器.com/api/wx/h5-login', data: { code: e.query.code } }) uni.setStorageSync('openid', res.data.openid) return } // 3. 无openid无code,跳转微信静默授权 const authUrl = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${appid}&redirect_uri=${redirect_uri}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect` window.location.replace(authUrl) } }执行流程 访问 H5 → 无 openid → 跳微信静默授权 → 秒回页面带 code → 后端换 openid → 缓存完成登录⚠️ H5 专坑 3 个redirect_uri 报错后台必须配置网页授权域名,代码中必须用encodeURIComponent编码。跳回白屏 / 页面栈错乱跳转前存历史长度,返回时用history.go回退。H5 里用 uni.login直接报错is not a function,H5 只能用 OAuth2.0 跳转。四、经典翻车案例(90% 人中招)有学员把小程序登录代码直接搬到公众号 H5:onLoad() { uni.login({ // ❌ 致命错误:H5无此API provider: 'weixin' }) }结果控制台直接报错,排查半小时才发现 ——API 用错场景!记住一句口诀:✅ 小程序静默 → uni.login✅ H5 静默 → OAuth2.0 跳转❌ 混用 → 必报错五、开发自查清单(上线前逐条核对)小程序端只传 code 给后端,前端不解析 openidAppSecret 从未出现在前端代码openid 缓存 key 带 appid 防串号做缓存判断,避免重复登录H5 端网页授权域名已配置redirect_uri 已编码用 snsapi_base 静默而非 snsapi_userinfo 弹窗处理跳转回退,避免白屏坚决不用 uni.login六、最后总结静默登录的本质,就是前端拿临时 code,后端换用户唯一标识 openid。小程序是 “悄悄递码”,H5 是 “快速跳转递码”,核心都是让用户无感完成身份识别。
2026年03月26日
19 阅读
0 评论
0 点赞
2024-07-31
还学鸿蒙原生?vue3 + uniapp 可以直接开发鸿蒙啦!
前言7月20号,uniapp 官网 “悄咪咪” 的上线了 uniapp 开发鸿蒙应用 的文档,算是正式开启了 Vue3 + uniapp 开发鸿蒙应用 的时代。开发鸿蒙的前置准备想要使用 uniapp 开发鸿蒙,我们需要具备三个条件:DevEco-Studio 5.0.3.400 以上(下载地址:https://developer.huawei.com/consumer/cn/deveco-studio/)鸿蒙系统版本 API 12 以上 (DevEco-Studio有内置鸿蒙模拟器)HBuilderX-alpha-4.22 以上PS: 这里不得不吐槽一下,一个 DevEco-Studio 竟然有 10 个 G......[安装好之后,我们就可以通过 开发工具 运行 示例代码]运行时,需要用到 鸿蒙真机或者模拟器。但是这里需要 注意: Windows系统需要经过特殊配置才可以启动,mac 系统最好保证系统版本在 mac os 12 以上windows 系统配置方式(非 windows 用户可跳过): 打开控制面板 - 程序与功能 - 开启以下功能Hyper-VWindows 虚拟机监控程序平台虚拟机平台注意: 需要win10专业版或win11专业版才能开启以上功能,家庭版需先升级成专业版或企业版启动鸿蒙模拟器整个过程分为三步(中间会涉及到鸿蒙开发者申请):下载 uni-app 鸿蒙离线SDK template-1.3.4.tgz (下载地址:https://web-ext-storage.dcloud.net.cn/uni-app/harmony/zip/template-1.3.4.tgz)解压刚下载的压缩包,将解压后的模板工程在 DevEco-Studio 中打开等待 Sync 结束,再 启动鸿蒙模拟器 或 连接鸿蒙真机(如无权限,则需要申请(一般 3 个工作日),申请地址:https://developer.huawei.com/consumer/cn/activity/201714466699051861/signup)配置 HBuilderX 吊起 DevEco-Studio打开HBuilderX,点击上方菜单 - 工具 - 设置,在出现的弹窗右侧窗体新增如下配置[注意:值填你自己的 DevEco-Studio 启动路径]"harmony.devTools.path" : "/Applications/DevEco-Studio.app"创建 uni-app 工程BuilderX 新建一个空白的 uniapp 项目,选vue3在 manifest.json 文件中配置鸿蒙离线SDK路径(SDK 路径可在 DevEco-Studio -> Preferences(设置) z中获取)编辑 manifest.json 文件,新增如下配置:然后点击 运行到鸿蒙即可最后这样我们就有了一个初始的鸿蒙项目,并且可以在鸿蒙模拟器上运行。关于更多 uniapp 开发鸿蒙的 API,大家可以直接参考 uniapp 官方文档:https://zh.uniapp.dcloud.io/tutorial/harmony/dev.html#nativeapi
2024年07月31日
52 阅读
0 评论
0 点赞
2023-06-25
最新版云喵圈子兴趣社区交友小程序源码全开源版本
云喵圈子小程序系统 定位为移动端兴趣社区圈子系统,功能分为四大模块,分别为圈子、话题、帖子、商城,基于四大板块衍生出其他功能模块,前后端源码完全开源,完美支持二次开发,可学习可商用兴趣社区圈子论坛程序,后台服务端基于thinkphp6开发,是一套兴趣社区论坛+电商的系统1、php版本 >=8.02、uniapp端下载后在根目录:utils/config.js中配置站点域名,运行到小程序源码地址隐藏内容,请前往内页查看详情
2023年06月25日
24 阅读
0 评论
0 点赞
2023-06-25
全开源的基础商城销售功能的RF微商城多端源码
RF微商城多端源码 全开源的基础商城销售功能的开源微商城。前端基于 uni-app ,一端发布多端通用。目前已经适配 H5、微信小程序、QQ小程序、Ios App、Android App 源码地址隐藏内容,请前往内页查看详情
2023年06月25日
28 阅读
0 评论
0 点赞
2023-02-11
uni-app中的版本更新
主要是拿本地的版本号和后端返回的版本号做对比(在每次修改完代码以后,要打个更新包或者整包给后端喔) <template> <view> <sxPopup ref="appUpdate" @closeMaks="closeMaks"> <view class="update-main"> <image src="/static/images/update_close.png" class="update-close" @tap="hide"></image> <view class="update-content"> 最新安装包已准备就绪恭请主人体验尝 </view> <view class="update-btn btn-solid" @tap="updateApp"> 立即体验 </view> </view> </sxPopup> </view> </template> 在data中定义 version:"", // 当前版本 serverVersion:"", // 服务器版本 clientType:'', // 客户端类型 updateInfo:{}, // 更新信息 curDownSize:0, // 当前下载大小 在props中 autoChangeUpdate:{ // 是否自动检测更新 type:Boolean, default:false } mounted() { _this = this; this.changeUpdate() }, 在methods中 show(){ //显示更新弹窗 this.$refs.appUpdate.open() }, hide(){ //隐藏更新弹窗 uni.showTabBar(); this.$refs.appUpdate.close() }, changeUpdate(){ // 检测更新 //如果父组件选择自动更新 if(this.autoChangeUpdate){ this.getServerVersion() } }, isUpdate(curVersion,serVersion){ // 判断是否需要更新 let [serArray,curArray] = [serVersion.split("."),curVersion.split(".")] if(parseInt(serArray[0]) > parseInt(curArray[0])){ return true }else if(parseInt(serArray[1]) > parseInt(curArray[1])){ return true }else if(parseInt(serArray[1]) >= parseInt(curArray[1]) && parseInt(serArray[2]) > parseInt(curArray[2])){ return true }else{ return false } }, computedVersion(version){ // 计算版本 let array = version.split("."); let sum = 0; sum += array[0]*10 sum += array[1]+array[2] return sum; }, getServerVersion(){ // 获取服务器版本 if(!this.autoChangeUpdate){ uni.showLoading({ title:"检测更新" }) } this.$ajax("index/apiUpdateVersion",{}).then(res=>{ uni.hideLoading() if(res.code == 200){ this.updateInfo = res.data plus.runtime.getProperty(plus.runtime.appid, function(wgtinfo) { // 获取当前app版本 _this.version = wgtinfo.version; console.log(uni.getSystemInfoSync().platform) // 判断手机类型 switch (uni.getSystemInfoSync().platform) { case 'android': if (_this.isUpdate(_this.version,res.data.android_version)) { _this.serverVersion = res.data.android_version; _this.clientType = 'android' _this.show() uni.hideTabBar(); }else{ if(!_this.autoChangeUpdate){ _this.$toast("当前已是最新版本") } } break; case 'ios': if (_this.isUpdate(_this.version,res.data.ios_version)) { _this.serverVersion = res.data.ios_version; _this.clientType = 'ios' _this.show() uni.hideTabBar(); }else{ if(!_this.autoChangeUpdate){ _this.$toast("当前已是最新版本") } } break; } // _this.$emit('isUpdata',false) }); }else{ this.$toast(res.data.msg) } }) }, updateApp(){ // 更新app let version = this.version.split('.'); let updateVersion = this.serverVersion.split('.'); this.hide() // 大更新 if (parseInt(updateVersion[0]) > parseInt(version[0])) { if(_this.clientType == 'android'){ console.log(_this.clientType) console.log(this.updateInfo.android_url) this.downApp(this.updateInfo.android_url,'bigUpdate'); }else{ plus.runtime.openURL(this.updateInfo.ios_url) } } else if (parseInt(updateVersion.join('.').replace(/\./g, '')) > parseInt(version.join('.').replace(/\./g, ''))) { //小更新 // 热更新 this.downApp(this.updateInfo.hot_update,'thermalRenewal'); } }, downApp(url,updateType){ // 文件大小 let fileSize = ''; if(updateType == 'bigUpdate'){ fileSize = this.updateInfo.android_url_file_size; }else{ fileSize = this.updateInfo.hot_update_file_size; } fileSize = parseFloat(fileSize) * 1024 * 1024 console.log(fileSize) let waiting = plus.nativeUI.showWaiting('下载中...'); // 创建下载任务 let dtask = plus.downloader.createDownload(url,{ filename: '_doc/update/' // 文件下载保存路径 },function(d, status) { console.log(status,5555) if (status == 200) { console.log(status,'.............') waiting.setTitle('安装中...'); // 下载成功 plus.runtime.install(d.filename, {}, function() { plus.nativeUI.closeWaiting(); plus.nativeUI.alert('更新完成!', function() { uni.showTabBar(); // 清除所有下载的包 plus.downloader.clear(-1); // 热更新自动安装 if(updateType == 'thermalRenewal'){ plus.runtime.restart(); } }); }, function(e) { plus.nativeUI.closeWaiting(); plus.nativeUI.alert('安装失败[' + e.code + ']:' + e.message); }); } else { //下载失败 plus.nativeUI.alert('下载失败!'); setTimeout(()=>{ plus.nativeUI.closeWaiting(); },1000) if(updateType == 'bigUpdate'){ plus.runtime.openURL(url) //打开网页手动下载 } } }) // 监听下载状态 // dtask.addEventListener("statechanged", function(download, status) { // // console.log(`监听:下载状态${status}`) // if (status == 200) { // let i = download.downloadedSize // i *= 100 / fileSize; // console.log(`监听:下载大小${i}`) // if(!isNaN(i)){ // i = parseInt(i) // waiting.setTitle('已下载 ' + i + "%"); // // waiting.setTitle(i); // } // }else if(status == 404){ // plus.nativeUI.closeWaiting(); // plus.runtime.toast("下载地址错误") // } // }, true); dtask.start(); }
2023年02月11日
64 阅读
0 评论
0 点赞