uniapp小程序限制微信群访问(图文教程)

  1. 我有一个微信小程序 “程序员实用资源”

  2. 我现在只想让我的微信群可以访问这个小程序的所有功能

  3. 所以我必须对我小程序的来源进行限制,让部分功能在正常访问的时候提示没有加群,不可访问,只有从群内点击进入小程序的时候才可以访问这部分功能

  4. 不用看,官网的微信小程序demo有bug,所以雪狼觉得有必要写篇博文,帮大家闭坑。

  5. 截止 2024年6月18日,你应该百度不到任何解决方案!因为问题,小程序限制微信群这个限制没什么人去搞。所以,收藏个,我怕你以后遇到了这个bug,没地方找到本文。

  6. 这个教程是我试通了我的小程序后回过来回忆写的,如果你搞不定,或者卡到哪个点,评论区留个言,雪狼有时间看到会回你。(37岁了,你问的时候最好雪狼还做前端。不做前端的话,就爱莫能助了。)

先看效果

直接点小程序进入是这样的

从群分享的卡片进入小程序是这样的

注意,你测试的时候,记得如果先直接点的小程序,在从群里点小程序,你要多清几次缓存,不然小程序被缓存住页面不会变

PART 教程

1、首先,限制群访问,肯定是要从小程序的访问来源入手

那么他首先要可!分!享!到群里,所有要在你要分享到群的那个test.vue页面(你自己建的测试页面)加下面这2个生命周期(雪狼是uniapp开发,原生的小伙伴自行去查分享群的方法)

onShareAppMessage(res) {//positionreturn {title: "test",path:url,//换成你自己页面的路由地址比如我是imageUrl:"/static/echarts.png"}
​
},//分享到朋友圈onShareTimeline(res) {let m=this;return {title: "test",type: 0,query: {},summary: "",imageUrl: "/static/logo.png"}},

2、别着急,假设你真从群里跳到了你自己的小程序的我假设是test.vue这个页面,你是要知道知道从!哪!里!跳过来的

所以我们在test.vue这个页面要加来源判断

onLoad(option) {let m=this;m.roldFun()  
},
roldFun(){let m =this;var ly=uni.getLaunchOptionsSync()
​console.log(ly)switch(ly.scene){case 1008://群聊会话中的小程序信息case 1044://群卡片case 1158://群工具case 1185://群公告case 1022://聊天置顶//m.quliao();//为了防止你复制完报错,我先注释掉,break;default://m.userRoldYZ();//break;}
},

附上getlaunchoptionssync的文档api大家自己可以前往查看https://uniapp.dcloud.net.cn/api/getLaunchOptionsSync.html#getlaunchoptionssync

下面是一些说明:方便你理解,你赶时间就直接跳过说明,直接跳到第3步骤

default 里雪狼是做了一个openid的验证,你们不用去管这个,其实就是被记录openid的用户可以不进过群聊可以查看所有数据

上面这部其实就是把群聊进入小程序的场景都放进去了case,我提醒下小伙伴,你其他场景可以在开发者工具里面找到对饮的code

好m.quliao() 里,就是你自己写在methods里的自己的方法,这里就看你的悟性了,我理下大概流程,

你可以新建一个test.vue页面,然后页面本来没东西,如果从群聊进入小程序会进quliao()的方法,你可以在<template> 里放一个{{ss}} data定义一个ss:"",然后进入quliao给他赋值 this.ss=1,这样就可以验证你的这个逻辑是不是对的了

关于限制制定哪些群聊去访问小程序才显示ss=1,你就要进行判断,

是的,后端要录入你 允许访问小程序的每个群聊的key了

雪狼试过,获取到的key不管用雪狼大号还是小号微信登录都是唯一的!!!!

3、test.vue通过getGroupEnterInfo获取某个群聊详情(前面说过了,不管通过哪个账号访问这个群聊,这个群聊key都是唯一的)

附上getGroupEnterInfo的文档api  =》》https://developers.weixin.qq.com/miniprogram/dev/api/open-api/group/wx.getGroupEnterInfo.html

getGroupEnterInfo可以获取到encryptedData,iv,然后你是要配合uni.login获取到的code去解密encryptedData的

wx.getGroupEnterInfo({success(res){uni.login({provider: "weixin",// #ifdef MP-ALIPAYscopes: 'auth_user', //支付宝小程序需设置授权类型// #endifsuccess: (res1) => {//下面这个就是ajax请求后端的接口!!!你自己的请求,//要传的参数就是data里面encryptedData、iv、code//就是// uniCloud.callFunction({//   name: 'user',//   data: {//   action:"pcDecryptData",//   encryptedData:res.encryptedData,//   iv:res.iv,//   code:res1.code,//   }// }).then((res2) => {//   // 这里就是返回true或false了// })},fail: (err) => {}});}
})

这里提一嘴uni.login是不需要用户去主动按钮才能获取的!因为我们只是获取登录的code不是获取用户信息,

所以不需要像下面这样的按钮!!!!!

<button class="loginBtn" open-type="getUserInfo"  @getuserinfo="wxGetUserInfo()">授权登陆</button>

我说的是不需要!!!!,你别直接就贴你代码里面去了!!!

来,接下去就是后端的活了!别赖给前端!!!只能从后端发起!!!!

雪狼用的是unicloud开发的,所有我贴下雪狼的代码,

async pcDecryptData(params){//这个是引入解密算法const WXBizDataCrypt = require('./RdWXBizDataCrypt.js');let m=this;//params 就是接收到前段发来的data的参数了,let url ="https://api.weixin.qq.com/sns/jscode2session?appid={你小程序的}appid&secret={你小程序的secret}&js_code=" +params.code + "&grant_type=authorization_code"//下面喝个是请求微信那边 获得session_key 来解密群const res = await uniCloud.httpclient.request(url, {method: 'GET',dataType: 'json' // 此处指定为json表示将此请求的返回值解析为json})var pc = new WXBizDataCrypt("{你的appid}",res.data.session_key)var data = pc.decryptData(params.encryptedData, params.iv) return data.opengid;},

你记得把{}这个尖括号给去掉!!!!!

雪狼是unicloud,如果你是php,java等你下官网的demo来看,https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/signature.html

别急,你代码贴下去后是不能运行的,你先下下来,除了unicloud的小伙伴,其他后端小伙伴直接跳过下面这些看重点我画红线的地方开始看

如果你是unicloud,别问为什么先npm install  cryptojs@2.5.3  ,别cnpm!!!!!!

重点,因为官方给的WXBizDataCrypt.js是不能用的

node语言的小伙伴用下面这个代码

你直接用雪狼改的这个RdWXBizDataCrypt.js (在说一遍,记得npm install  cryptojs@2.5.3)

RdWXBizDataCrypt.js如下

/*** Created by rd on 2017/5/4.*/
// 引入CryptoJS
var Crypto = require('cryptojs/cryptojs.js').Crypto;
function RdWXBizDataCrypt(appId, sessionKey) {this.appId = appIdthis.sessionKey = sessionKey
}
​
RdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv,type) {// base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码var encryptedData = Crypto.util.base64ToBytes(encryptedData)var key = Crypto.util.base64ToBytes(this.sessionKey);var iv = Crypto.util.base64ToBytes(iv);
​// 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);
​try {// 解密var bytes = Crypto.AES.decrypt(encryptedData, key, {asBpytes:true,iv: iv,mode: mode});
​var decryptResult = JSON.parse(bytes);
​} catch (err) {if(!type){console.log(err) }}
​if (decryptResult.watermark&& decryptResult.watermark.appid !== this.appId) {console.log(err)}return decryptResult
}
​
module.exports = RdWXBizDataCrypt

非node语言的小伙伴,我提供思路

你最好在他的解密算法代码一个一个断点,decryptResult.watermark这段因为微信给到我们的数据结构已经变了,所以你会发现例如decryptResult.watermark.appid  这段时报错的。

所以你最好先判断decryptResult.watermark 再改decryptResult.watermark.appid

为什么呢?他原本算法解密后会返回群名称、群id、群appid、群简介那些,现在只返回群opengid,也就是群id唯一标识。

这时候你直接pc.decryptData(params.encryptedData, params.iv) 这一步就会报错,所以你得改WXBizDataCrypt.js的判断和返回

你可以看到我是直接返回return decryptResult 这个结果。可以了,

重点我都说了,这时候你前端uniapp请求后端unicloud就返回来opengid 就是群的唯一标识了,如果你要限制某个群可以访问 可以把opengid  存在后端服务器,然后前端传这些个参数给后端解密完顺便可以让后端去数据库判断是不是有这个群id,以此来判断是不是该返回给前端true.前端接收到true后,就可以把那些限制访问的内容v-if改成true,这样就实现了群聊访问小程序全部功能的功能

如果你卡到问题,可以在微信公众号搜:“程序员野区” 输入加群 找到我

PART 其他文章推荐

技术类:

  • 常用的19个正则-表单验证

  • 报错状态码 200 300 400 500

  • 禁debugger调试网页,禁F12(完整教程)

  • 用node开发微信群聊机器人第①章

  • 我把微信群聊机器人项目开源

职场类:

  • 我拿你当同事,你拿我当傻子(27)

  • 程序员就不能不喝酒吗

  • 贵人长啥样(24)

  • 我对他那么好,为什么他还是要走(23)

  • 第十八话:我为什么要走你不知道吗

  • 程序员,爱情开始的地方(29)

关于雪狼:

===》开发者介绍《===

PART 公众号合集

#程序员干货  #前端回忆录  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

目标检测顶会新成果!20个突破性方法,更高性能,更强理解与分析能力!

【目标检测】在近年来的深度学习领域中备受关注&#xff0c;它通过识别和定位图像中的目标对象&#xff0c;提升了模型在图像理解和分析方面的能力。目标检测技术在自动驾驶、安防监控和医疗影像分析等任务中取得了显著成果。其独特的方法和卓越的表现使其成为研究热点之一。 为…

ESP32蓝牙串口通讯

文章目录 一、前言二、代码三、运行 一、前言 ESP32支持经典蓝牙和低功耗蓝牙&#xff08;BLE&#xff09;,经典蓝牙可在计算机上模拟出一个串口&#xff0c;使得ESP32可以以串口的方式和计算机通信。 二、代码 #include "BluetoothSerial.h"String device_name …

2025计算机毕业设计选题题目推荐-毕设题目汇总大全

选题在于精&#xff0c;以下是推荐的容易答辩的选题&#xff1a; SpringBoot Vue选题: 基于SpringBoot Vue家政服务系统 基于SpringBoot Vue非物质文化遗产数字化传承 基于SpringBoot Vue兽医站管理系统 基于SpringBoot Vue毕业设计选题管理系统 基于SpringBoot Vue灾害应急救援…

软考中级证在手里,感觉白躺家里了?

软考中级&#xff0c;最适合考的专业是《系统集成项目管理工程师》&#xff0c;特别适合零基础的人&#xff01; 2022年中级职称的报名条件和要求非常宽松&#xff0c;即使没有学历、零基础和相关工作经验也可以考试&#xff01;&#xff01;&#xff01; 一、职称的含金量 …

docker 中 File Sharing 和Volumes 的区别

在 Docker 中&#xff0c;File Sharing 和 Volumes 都涉及到将文件和目录从主机系统映射到容器中&#xff0c;但它们的用途和实现方式有一些重要的区别&#xff1a; 一、简介 File Sharing 是 Docker Desktop 在 Windows 和 macOS 上的一项功能&#xff0c;允许你将主机文件系…

中国最厉害的改名大师颜廷利:食物的真正人生意义是识悟

在探索人生意义的深邃征途中&#xff0c;我们本应以“识悟”为航标&#xff0c;不断扬帆远航&#xff0c;以实现自我的升华。然而&#xff0c;当回望人世繁华&#xff0c;古往今来&#xff0c;无论男女老少&#xff0c;似乎都在“食物”的陪伴下&#xff0c;徘徊往复&#xff0…

计算机网络复习

2024年whut 概述 1.计算机网络的目标&#xff1a;信息传输和资源共享 2.网络协议的要素&#xff08;必考&#xff09;&#xff1a; 语法&#xff1a;数据信息和控制信息的结构或格式 语义&#xff1a;要发出何种控制信息&#xff0c;完成何种动作&#xff0c;做出何种响应 同…

safari浏览器无法连接到服务器

问题&#xff1a;MacBook pro&#xff0c;网络连接正常&#xff0c;可以使用各种软件上网&#xff0c;唯独safari浏览器打不开网页&#xff0c;报错说Safari无法连接到服务器&#xff1b; 原因&#xff1a;使用了VPN&#xff0c;VPN自动更改了网络设置&#xff0c;导致Safari浏…

监控局域网电脑屏幕的办法,最简单的三种方法,好用!

在现代企业管理和家庭教育环境中&#xff0c;对局域网内电脑屏幕进行有效监控成为了保障信息安全、提升工作效率和监督行为规范的重要手段。 监控局域网电脑屏幕不仅可以帮助管理者了解员工的工作状态&#xff0c;确保资源的合理使用&#xff0c;还能在一定程度上预防潜在的网…

银行卡归属地查询-银行卡归属地接口-银行卡归属地API

接口简介&#xff1a;通过银行卡号查询国内外银行名称、银行卡卡种、卡品牌以及银行卡发卡省份和城市&#xff0c;支持借记卡和部分贷记卡的发卡省市查询。 若银行卡是农村信用社&#xff0c;归属地无法区分到城市&#xff0c;只能到省份 接口地址&#xff1a;https://www.wapi…

CentOS 7 安装MySQL以及常见问题解决

访问网站&#xff1a;http://repo.mysql.com 找到适配CentOS 7版本的MySQL 的YUM仓库包rpm文件&#xff0c;如下图 下载后&#xff0c;找到安装包的位置 空白处右键&#xff0c;选择在终端打开 查看当前目录下文件 # 安装MySQL 5.7的YUM仓库包rpm -ivh mysql57-community-rele…

中科数安 | 加密管理系统

中科数安提供的加密管理系统是一套全面而高效的数据安全解决方案&#xff0c;旨在保护企业核心文件资料的安全。该系统结合了多种先进的技术手段和管理策略&#xff0c;确保企业数据在存储、传输和使用过程中都得到严格的保护。 www.weaem.com 以下是中科数安加密管理系统的主要…

固定式土壤墒情监测仪—土壤状况进行长期跟踪和分析

TH-TS600 固定式土壤墒情监测仪是一种专门用于长期、连续、自动监测土壤墒情的设备。能够实时监测土壤的水分、温度、湿度等关键参数&#xff0c;确保农民和管理者能即时获取土壤状况信息&#xff0c;便于及时做出农业决策。由于是自动监测&#xff0c;数据采集的准确性和可靠性…

[答疑]订单、预约单的流水号是冗余属性吗

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 陈磊 2024-6-12 20:40 老师好&#xff01;我学习了软件方法的类图内容&#xff0c;也已经认真做题了&#xff0c;现有一个问题想请老师解惑。 像订单、预约单这样的单据生成的时候&a…

铁砧帝国延迟高?铁砧帝国延迟严重这样解决

铁砧帝国是一款少见的多人在线游戏&#xff0c;游戏能支持上千名玩家建立帝国并互相作战。而且这款游戏在细节方面也做足准备&#xff0c;设计了攻城梯和攻城锤等设备&#xff0c;以攻破坚固的城墙和要塞&#xff0c;不过具体获取方法就需要玩家自己摸索。因为最近开放了测试申…

【免费API推荐】:满足您的开发需求,加速项目上线

免费API助力项目开发&#xff0c;为开发者们提供了强大的支持和工具。这些API提供了各种功能和服务&#xff0c;能够帮助项目开发者们快速构建出高质量的应用。无论是地理位置服务、支付接口、社交媒体集成还是图像识别&#xff0c;这些免费API为项目开发者们提供了丰富的功能和…

Cortex-A510——Cache

Cortex-A510——Cache 小狼http://blog.csdn.net/xiaolangyangyang 1、Cortex-A510 Cache组织结构 以cache-size为32k&#xff0c;cache-line为32Byte为例&#xff1a; 组相连&#xff08;常用结构&#xff09;&#xff1a;4-way&#xff0c;256-set直接映射&#xff1a;相当于…

supOS浅度集成

一、浅度集成介绍 浅度集成是根据项目或者演示要求而做的集成工作&#xff0c;通过接入supOS的单点登录&#xff0c;UI调整&#xff0c;菜单栏的集成&#xff0c;从而达到客户使用supOS平台来使用各个应用的能力。 二、浅度集成的作用 通过较少的研发投入使APP应用浅度融入到…

uniapp 自定义页面顶部导航栏

效果图 1.移除原生导航栏 {"path": "pages/common/homePage/homePage","style": {"navigationBarTitleText": "","navigationStyle": "custom"} } 2.获取不同手机顶部自带 电量高度、信号、时间导航栏…

课程设计——基于FPGA的交通红绿灯控制系统(源代码)

摘要&#xff1a; 本课程设计旨在设计一个基于FPGA&#xff08;现场可编程门阵列&#xff09;的交通红绿灯控制系统。该系统模拟了实际道路交叉口的红绿灯工作场景&#xff0c;通过硬件描述语言&#xff08;如Verilog或VHDL&#xff09;编写源代码实现。系统包含三个主要部分&a…