- 小程序违规以完成整改,请复核?
系统提示:你好,你的小程序未设置过滤违法、违规等不当信息内容的机制行为。请参照 《微信小程序平台运营规范》5.行为规范-5.18内容安全修改内容。 已完成整改,申诉次数已用完,无法再次提起申诉,请客服再次复核,给予解除限制
2022-10-23 - 小程序权限被封禁没法再次申诉?
小程序很久之前朋友圈二维码权限被封禁了,我们一年前就改版了,去掉了二维码也没任何测试内容,但是找不到申诉的入口。一直没法再次申诉,麻烦官方帮小姐姐、小哥哥帮忙看一下,是否可以解除封禁。非常感谢~
2022-10-20 - 已过滤违法、违规等不当信息内容,麻烦官方同学验收并恢复下被封禁的服务?
小程序之前显示违规,但已经整改,接入了微信官方的内容安全检查接口,在10.9号反馈客服提交申诉,但是到现在已经超过7个工作日了, 但是还没有审核结果,麻烦官方审核一下,谢谢!
2022-10-21 - 小程序分享功能被封禁,两次申诉机会未通过,现在已整改完毕,需要多久可以申诉通过?
10.09人工客服帮忙提交申诉,现在已经等待超过7个工作日,请问下大家最长等待了多久申诉通过或者不通过的?现在一直没有消息,咨询客服也都是机器型回答
2022-10-20 - 被投诉涉嫌运营违规风险内容,被搜索功能已被限制,申诉不通过?
我们公众号文章被用户投诉违反《微信公众平台运营规范》3.23条规定,但没有说明【具体是什么原因】违规了,申诉之后也只是说我们违规了,但是就是【不告诉我们哪里违规】,需要怎么修改。麻烦具体指明一下,我们后续也可以做整改,现在是因为不清楚哪个地方不对,所以也不知道怎么处理。 希望官方认真对待用户是否有恶意投诉问题,不要只是【复制场面话回复说违规了】,如果真的有问题可以【直接指明】。 经用户投诉并经平台审核,你的帐号涉嫌运营违规风险内容, 已屏蔽被搜索功能至2022-06-09, 已屏蔽文章被搜索功能至2022-06-09,如果再出现违规行为,限制期限会加长或永久封禁。 违反规范:《微信公众平台运营规范》3.23条规定。 违规内容: 【大型央企招800人,住宿补贴+五险二金+执业津贴6万+特殊津贴2~60万】中国水利水电第一工程局有限公司招聘简章
2022-05-11 - 云函数怎么生成高并发下的唯一订单号?
如题,我看java都是 项目号+时间+序列号redis+机器号,另外我用户表怎么添加个自增序列号
2021-03-09 - 关于微信昵称中Emoji表情乱码问题解决方案
问题描述 我相信每个人在刚接触小程序开发的时候都会遇到这个问题:小程序用户授权的时候,如果微信昵称里面带有Emoji表情的昵称,保存到数据库里,在界面显示的时候就乱码了。 当然微信昵称乱码只是一个最常遇到的场景,在其他包含Emoji表情的地方,该问题都会暴露出来。 如下图所示: 正常文本 [图片] 乱码文本 [图片] 问题解决方案 在本文我会总结两种解决方案,第一种解决方案是我在之前查阅相关文档,亲测实现的,当时在采用第二种解决方案的时候遇到了问题,采用的不得已方案,后面等第二种方案亲测实现后,才发现第二种方案是真香。 第一种解决Emoji表情乱码的方案 将包含该Emoji表情的信息encodeURIComponent编码,在使用的地方,在decodeURIComponent解码,这种方案已在小程序 “垃圾分类黑板报”中亲测,如下图所示: [图片] 这种方案不算好,仅仅是解决了乱码的问题,带来了代码的额外编码解码开支。 第二种解决Emoji表情乱码的方案 按照我采用Mysql数据库,PHP YII2框架来描述 两步走 在数据库连接的时候采用utf8mb4,这一点非常重要,很容易遗漏。 数据库编码和表格编码以及对应的存储字段都应采用utf8mb4编码 关于第一步在代码示例如下 [图片] 该方案在小程序"群黑板报"中,亲测可用。 [图片] 这种方案是最完美的方案,没有带来额外的代码开支,也是目前网上能搜到的推荐使用方案,但是在实操过程中,有时候会因为数据库版本或者个人设置导致不生效,但是该方案确实香。 部分文章推荐 下面推荐几篇文章用来普及下为什么正常情况下Emoji表情存储到数据库里面就会乱码了 关于微信授权获取昵称含Emoji表情引发的乱码问题总结 https://developers.weixin.qq.com/community/develop/article/doc/000c84d49d4058d35e99bbaef5b013
2019-12-11 - 如何提升你的云函数性能
在使用云开发一段时间后,你一定会遇见一个问题:虽然云函数非常的方便,但我的云函数似乎性能不够好,为什么我的云函数每次加载都需 2 ~ 3 秒种,时间太长了!。 这篇文章,就来告诉你,应该如何提升你的云函数性能。 如何了解云函数运行情况? 在了解如何优化云函数的运行情况之前, 我们需要先了解,如何查看当前的云函数运行情况,这样才能有个对比。 [图片] 打开小程序开发者工具,并打开你的项目 进入到你要调试的页面,打开调试器 调用云函数,并在调试器中切换到 Network 页面,找到你的请求。 点击你的请求,然后切换到 Timing 页面,查看具体的情况。 在这个页面中,你可以理解其中的 Waiting(TTFB) 是你发起请求到你接收到返回结果的第一个字节的时间,简单的来说,就是服务器计算结果需要花费的时间。而下方的 Content Download 则是下载内容所需的时间,你可以理解是表现出网络速度快慢的数据。 总结来说,就是如果 Waiting TTFB 的值比较大,你就去优化云函数性能。如果 Content Download 的数值毕竟大,你就需要优化网络情况 优化 Waiting TTFB 云函数的运行机制 Waiting TTFB 的优化是云函数性能端的优化,那么在优化之前,我们就需要先来了解一下云函数的运行机制,以便帮助我们了解应该如何去进行性能优化。 [图片] 在蕴含运行时,具体的顺序是这样的 用户发起请求,请求发送到云开发的后台 云开发后台的调度器将请求分发给下方的执行的 worker 、容器 容器创建环境、下载代码 执行代码 在这个过程中,发起请求到云开发、调度器调度速度、调度器传递信息到容器、函数调用等,都是可以优化的,但是我们在具体的使用过程中。这些大都需要由云开发的工作人员来完成,对于我们自己来说,只能去尽可能的优化容器内部到代码层面的东西。 接下来,我们可以看看更细致的调用逻辑。 [图片] 在云开发中,我们可以将调用分为三种类型: 冷启动:图中的红色阶段,需要重新创建容器、下载代码,耗时最长 温启动:图中的黄色阶段,需要下载代码,耗时较长 热启动:图中的蓝色阶段,不需要下载代码,耗时最短 我们可以看到,最快的,是热启动,函数不需要创建容器,不需要启动函数就可以完成执行,显然比要创建容器或要下载代码的温启动和冷启动速度更快。这样,我们就得到了优化云函数性能的第一个方法 1. 让你的云函数每次调用都走热启动 当我们可以让我们的云函数的每一次调用都走热启动,少了容器的创建和函数的部署,请求的速度理所当然的要比冷启动和温启动更快。 我们可以测试一下,我设置每秒调用一次云函数,看看 TTFB 的变化。 [代码]setInterval(()=>{wx.cloud.callFunction({name:'profile'})},1000) [代码] 函数内代码是默认创建的云函数代码。 则对应的执行效果如下 [图片] 可以看到,函数的执行时间从第一次的 1.2s 降低到了 200ms左右,性能提升了 80%,我们仅仅是简单的提升了函数的调用频次,就可以实现提升函数的调用性能,这就是热启动带给我们的价值。 实施方案 如果你需要足够高的性能,不妨借助云开发的定时器,定期唤起你的容器,从而为你的容器保活,确保你的函数时刻被热启动。 2. 缩小你的函数大小 在前面我们曾介绍过,云函数在启动过程中,会创建容器和下载代码。创建容器的过程对于开发者来说不可控,不过我们可以使用一些方法,缩小我们的代码,提升代码的下载速度,比如说,缩小我们的函数代码。 这里我们可以做个测试,这里我创建了两个函数,两个函数的代码完全一致,不同的是,在实验组的函数中,我加入了一个 temp 变量的声明,这个变量的值是一个非常长的字符串,从而使得两个函数的大小分别是 68K 和 4K。 接下来,我们看看二者的执行时间。 [图片] 我们会发现,几乎没有差距的代码,因为加入了变量声明的因素,在性能上会略慢几毫秒,后续随着容器的不断复用,函数的之间的差距也越来越小,几乎可以忽视。 实施方案 对于你的代码,要尽可能的精炼,减少无用的代码,减少代码下载所需时间。 3. 削减不需要的 Package 除了下载代码以外,还需要下载 Node 环境运行所需的依赖包,虽然云开发可能针对 Node Modules 已经做了缓存,但依然存在下载的时间差区别,这里我也做了一个实验。 空包:什么都没装,把 wx-server-sdk 都卸载掉了。 复杂包:装了 Mongoose、sequelize、sails 等依赖的包。 函数逻辑上也相差无几,都是返回 Event ,则结果如下 [图片] 我们发现,前三次可能是因为涉及到依赖包的下载问题,所以前三次的时长大小对比特别的明显,而从第四次开始,二者的区别就不大了,可能是因为依赖已经完成了缓存,所以可以直接使用缓存来完成函数的执行。 实施方案 你可以选择看看你的 package.json ,看看其中是否有你不需要的依赖,将其删除,仅保留有需要的依赖,可以有效提升你的代码执行速度。 优化 Content Download 如果你想要优化 Content Download ,核心需要优化的是两个点: 手机到服务端的节点的距离和速度 内容的大小 前者一般来说,你可以通过切换不同的网络环境来实现优化,比如从 3G 切换到 4G ,从 4G 升级到 5G,这些都可以提升你的手机到服务端节点之间的速度。 此外,还可以借助内容分发网络 CDN 能力来完成缩小你到服务端节点之间的距离,不过对于云函数来说,因为你不可控,无法控制,所以这一点不再谈。 这里补充一句,云开发的文件存储都是有 CDN 的,因此,你通过云存储下载的文件才会比别人更快。 后者则一般通过调整代码来完成,比如只返回必须的资源,对于不需要的内容,不再返回,或压缩返回。 总结 最后,我们回顾一下这篇文章中介绍的优化云函数的方法: 函数下载性能优化 保持函数容器的热启动,提升函数启动性能 缩小函数大小,提升代码下载速度 削减不必要的包,减少依赖大小 网络优化 使用更好的网络,比如 Wi-Fi 云函数中仅返回所需要的内容,减少下载时间。 以上这些方法,你都在你的函数中试过么?有没有其他的优化方法?欢迎你与我分享。
2019-12-08 - 定时发送模板消息功能实现(云开发实现)。
在准备开发这个功能之前,请确保你已经阅读过云开发文档和以下相关官方文档。 模板消息 获取AccessToken 发送模板消息 云函数定时触发器 我们来设定一个需求场景。以小程序【抽奖助手】为例,用户参与抽奖后,需要在开奖时间发送给用户开奖结果通知。这个通知采用模板消息形式下发。 先整理一下思路,实现这个功能我们需要哪些模块? 定时任务执行器。根据任务类型调用相应任务处理程序。 开奖任务处理程序,开奖后发送模板消息,通知用户结果。 云函数中调用 sendTemplateMessage 后端接口,发送模板消息。 周期获取AccessToken。请求后端接口需要用AccessToken,周期更新AccessToken,放入数据库中,随用随取。 模块实现 1.定时任务执行器 以云数据库形式实现。添加一个定时任务就是在该集合增加一条记录,移除同理。 记录字段设计: [代码]timeingTask{ _id: taskType: //任务类型,决定如何处理这个任务 execTime: // 触发时间。到达这个时间开始执行。 data:{} // 必要数据 } [代码] 然后设置云函数周期执行。每分钟查询一次该定时任务数据库,是否有任务到达执行时间。如果有则根据类型进行处理,并在数据库中移除该任务。 [代码]const cloud = require('wx-server-sdk') cloud.init({ env: '你的云环境ID' }) const db = cloud.database() exports.main = async(event, context) => { const execTasks = []; // 待执行任务栈 // 1.查询是否有定时任务。(timeingTask)集合是否有数据。 let taskRes = await db.collection('timeingTask').limit(100).get() let tasks = taskRes.data; // 2.定时任务是否到达触发时间。只触发一次。 let now = new Date(); try { for (let i = 0; i < tasks.length; i++) { if (tasks[i].execTime <= now) { // 时间到 execTasks.push(tasks[i]); // 存入待执行任务栈 // 定时任务数据库中删除该任务 await db.collection('timeingTask').doc(tasks[i]._id).remove() } } } catch (e) { console.error(e) } // 3.处理待执行任务 for (let i = 0; i < execTasks.length; i++) { let task = execTasks[i]; if (task.taskType == 1) { // 定时开奖任务 const kaiJinag = require('kaiJiang.js') try { await kaiJinag.kai(task.data.activity_id) } catch(e) { console.error(e) } } } } [代码] 使云函数每分钟执行的触发器代码: [代码]{ "triggers": [ { "name": "timeingTaskExecutor", "type": "timer", "config": "0 */1 * * * * *" } ] } [代码] 2.开奖任务处理程序 [代码]kaijiang.js[代码] [代码] const cloud = require('wx-server-sdk') const templateMessage = require('templateMessage.js') const COLL_FIELD_NAME = 'publicField'; const FIELD_NAME = 'ACCESS_TOKEN' const MSGID = '你的模板消息ID'; cloud.init({ env: '你的云环境ID' }) const db = cloud.database() const kai = async activity_id => { // 根据活动id,获取参与用户信息,获取到用户的 openid 和 formid. // 开奖程序省略 // 从数据库中获取AccessToken let tokenRes = await db.collection(COLL_FIELD_NAME).doc(FIELD_NAME).get(); let token = tokenRes.data.token; // access_token let page = '点击模板消息,想要打开的小程序页面'; let msgData = { "keyword1": { "value": activity.prizeName }, "keyword2": { "value": "你参与的抽奖活动正在开奖,点击查看中奖名单" }, }; let openid = '用户openid'; let formid = '用户formid'; await templateMessage.sendTemplateMsg(token, MSGID, msgData, openid, formid, page); } module.exports = { kai: kai, } [代码] 3.发送模板消息 [代码]templateMessage.js[代码] 封装在一个 js 文件里,传入必要参数调用即可。 [代码]const rp = require('request-promise'); const sendTemplateMsg = async (token, msgid, msgData, openid, formid, page) => { await rp({ json: true, method: 'POST', uri: 'https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=' + token, body: { touser: openid, template_id: msgid, page: page, form_id: formid, data: msgData } }).then(res => { }).catch(err => { console.error(err) }) } module.exports = { sendTemplateMsg: sendTemplateMsg, } [代码] 4.周期获取AccessToken 使用云函数触发器,使云函数每小时请求一次AccessToken,并将AccessToken存入云数据库中。 [代码]const cloud = require('wx-server-sdk') const rq = require('request-promise') const APPID = '你的APPID'; const APPSECRET = '你的APPSECRET'; const COLLNAME = 'publicField'; const FIELDNAME = 'ACCESS_TOKEN' cloud.init({ env: '你的云环境ID' }) const db = cloud.database() exports.main = async(event, context) => { try { let res = await rq({ method: 'GET', uri: "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + APPID + "&secret=" + APPSECRET, }); res = JSON.parse(res) let resUpdate = await db.collection(COLLNAME).doc(FIELDNAME).update({ data: { token: res.access_token } }) } catch (e) { console.error(e) } } [代码] 使云函数一小时执行一次的触发器代码: [代码]{ "triggers": [ { "name": "pollGetAccessToken", "type": "timer", "config": "0 0 */1 * * * *" } ] } [代码] 这是我做的产品册小程序中的部分代码,目前项目还没有发布,发布后会开源出来。项目中用到了挺多开源组件,给我很大的帮助,希望我的分享也可以帮助到一些人。 有问题可以在公众号后台联系我,我看到都会回复的。 [图片]
2019-03-15 - 云开发,获得的日期怎么能成为北京时间的日期?
获得日期的代码如下: [图片] 但获得的日期差了一天,应该是东八区8小时时差造成的,怎么消除这种差异? [图片]
2019-09-25 - 查询条件能用变量吗?我的用变量查询就查询不出来
[图片]
2019-07-21