可以在微信的发现-小程序-搜索,搜索出对应的小程序后,进入小程序的评价列表,可以针对某条评论做举报
小程序后台用户反馈有个别账户一直发辱骂信息?我发现只能被动的将信息移动到垃圾箱,而无法直接屏蔽。 之前有个人因为在我的小程序辱骂别人被我永久禁言后,跑到用户反馈开始辱骂我,辱骂的信息很多是恶毒诅咒和恐吓,搞的我心情很不愉快。 想问下官方会开放拉黑和投诉吗?
2023-11-21如小程序是仅供内部(特定)人员使用的,请整改为: 1、小程序的首页添加明显的标识告知小程序仅供内部(特定)人员使用(如:仅支持**品牌会员使用); 2、使用账号+密码登录,账号可以是手机号,但密码不能是短信验证码 ; 3、输入手机号+验证码登录,但非内部(特定)人员点击发送验证码后需提示:该号码无权限登录访问/或非特定人员无法登入,不支持下发验证码成功; 4、自行开发接口,非内部(特定)人员使用手机号登陆时,页面有文字说明:该号码无权限登录访问; 5、页面需要有《用户协议》+《隐私协议》,且需明确告知用户获取手机号码的必要性、用途; 1+2+5或1+3+5或1+4+5,,三选一,如均未能实现或同时满足,还请整改为开放模式 这是我上次联系到客服,客服给出的修改指引,可以参考下。 修改后的版本审核通过后,建议等一段时间再去申诉。没有申诉入口的话,就只能联系客服处理了。
手机号授权能力被封禁?appid: wxbaa1f34e30d3c3a4 在收到被封禁的通知后,马上修改了小程序版本进行发布。 但是连续申诉了两次都未成功,不知道审核人员有没有点开看过小程序,点开看的时候是否清了缓存? 1、在未登录的情况下(登录页新增了返回首页的按钮),小程序依然可以访问首页,因为是仅供公司内部人员使用的,其他功能需要登录才能操作; 2、在小程序用户隐私保护指引中,有明确声明获取用户手机号的用途。 昨天排队排了一天,都没到我。。。
2023-11-21可以给input 设置 placeholder-style,去修改对应的样式
input的placeholder字体颜色怎么改?<input name="ticketName" type="String" class="input" maxlength="100" placeh [图片]怎么都改不动
2023-11-17[图片] [图片] 实测可以监听到的,bindgetphonenumber回调返回的detail中有对应的errno
官方的隐私授权弹窗,如果点拒绝的话,有回调可以控制吗?官方的隐私授权弹窗,如果点拒绝的话,有回调可以控制吗? [图片] 我们的小程序在这里需要用户授权手机号,如果拒绝的话,想给用户个提示,有回调吗? 诚信请教
2023-11-15你代码里面getLessLimitSizeImage函数是单独声明的,都没有绑定到组件的methods里面,用this.getLessLimitSizeImage肯定会报错呀
TypeError: 'xxxx' is not a function怎么解决?这是我的代码,大神们帮助看看,运行时老是报错,TypeError: _this3.getLessLimitSizeImage is not a function 怎么搞定? Component({ data: { cw: wx.getSystemInfoSync().windowWidth, ITEM_SIZE: 100, // 图片大小 单位px dragImgList: [], // 图片列表 { src: string, key: number, tranX: number, tranY: number }[] imgs: [], // 图片src列表 { src: string, key: number}[] containerRes: {}, // 拖拽容器属性 currentKey: -1, // 正在拖拽图片的key currentIndex: -1, // 正在拖拽图片的index tranX: 0, // 正在拖拽图片移动的x距离 tranY: 0, // 正在拖拽图片移动的y距离 uploadPosition: { // upload上传图标位移距离 tranX: 0, tranY: 0, } }, onLoad: function (options) { wx.getPrivacySetting({ success: res => { // console.log(res) // 返回结果为: res = { needAuthorization: true/false, privacyContractName: '《xxx隐私保护指引》' } if (res.needAuthorization) { // 需要弹出隐私协议 this.setData({ showPrivacy: true }) } else { // 用户已经同意过隐私协议,所以不需要再弹出隐私协议,也能调用已声明过的隐私接口 // wx.getUserProfile() // wx.chooseMedia() // wx.getClipboardData() // wx.startRecord() wx.getSetting({ success(res) { if (!res.authSetting['scope.writePhotosAlbum']) { wx.authorize({ scope: 'scope.writePhotosAlbum', success() { // console.log(res.authSetting) } }) } } }) } } }); }, lifetimes: { ready() { this.createSelectorQuery() .select(".drag-container") .boundingClientRect((res) => { this.data.containerRes = res }).exec(); //*************** 图片压缩 *********** // 判断图片大小是否满足需求 function imageSizeIsLessLimitSize(imagePath, limitSize, lessCallBack, moreCallBack) { wx.getFileSystemManager().getFileInfo({ filePath: imagePath, success(res) { console.log("压缩前图片大小:", res.size / 1024, "kb"); if (res.size > 1024 * limitSize) { moreCallBack(); } else { lessCallBack(); } }, }); } /** * 获取画布图片 */ // 利用cavas进行压缩 function getCanvasImage( canvasId, currentInstance, imagePath, imageW, imageH, getImgsuccess ) { console.info(imageW) console.info(imageH) console.info(canvasId) console.info(currentInstance) wx.createSelectorQuery() .in(currentInstance) .select("#" + canvasId) .node(({ node: canvas }) => { canvas.width = imageW; canvas.height = imageH; const ctx = canvas.getContext("2d"); const bg = canvas.createImage(); bg.src = imagePath; bg.onload = () => { ctx.save(); ctx.translate(canvas.width / 2, canvas.height / 2); ctx.translate(-canvas.width / 2, -canvas.height / 2); ctx.drawImage(bg, 0, 0, imageW, imageH); ctx.restore(); wx.canvasToTempFilePath({ canvas, fileType: "jpg", quality: 1, success: (res) => { getImgsuccess(res.tempFilePath); }, }); }; }) .exec(function (res) { }); } // 主调用方法 /*** 获取小于限制大小的Image */ function getLessLimitSizeImage( canvasId, currentInstance, imagePath, limitSize = 100, drawWidth, callBack ) { imageSizeIsLessLimitSize( imagePath, limitSize, (lessRes) => { callBack(imagePath); }, (moreRes) => { wx.getImageInfo({ src: imagePath, success: function (imageInfo) { var maxSide = Math.max(imageInfo.width, imageInfo.height); var windowW = drawWidth; var scale = 1; if (maxSide > windowW) { scale = windowW / maxSide; } var imageW = Math.trunc(imageInfo.width * scale); var imageH = Math.trunc(imageInfo.height * scale); getCanvasImage( canvasId, currentInstance, imagePath, imageW, imageH, (pressImgPath) => { console.log("callback", pressImgPath); getLessLimitSizeImage( canvasId, currentInstance, pressImgPath, limitSize, drawWidth * 0.95, callBack ); } ); }, }); } ); } function getBase64(img) { return new Promise(function (resolve, reject) { const FSM = wx.getFileSystemManager(); FSM.readFile({ filePath: img, encoding: "base64", success(data) { resolve(data); }, }); }); } }, }, methods: { /*** 长按图片*/ longPress(e) { const index = e.mark.index const { pageX, pageY } = e.touches[0] const { top, left } = this.data.containerRes this.setData({ currentIndex: index, tranX: pageX - 50 - left, tranY: pageY - 50 - top }) }, /*** touchMove*/ touchMove(e) { // 如果currentIndex < 0,说明并没有触发longPress if (this.data.currentIndex < 0) return const { pageX, pageY } = e.touches[0] const { top, left } = this.data.containerRes const tranX = pageX - 50 - left const tranY = pageY - 50 - top this.setData({ tranX, tranY }) // 对比当前移动的key和停放位置的key,如果不一样就修改位置 const currentKey = e.mark.key const moveKey = this.getMoveKey(tranX, tranY) console.log(currentKey, moveKey); if (currentKey === moveKey || this.data.currentKey === currentKey) return this.data.currentKey = currentKey this.insert(currentKey, moveKey) }, /*** 获取移动中的key*/ getMoveKey(tranX, tranY) { const { dragImgList: list, ITEM_SIZE } = this.data const _getPositionNumber = (drag) => { const positionNumber = Math.round(drag / ITEM_SIZE) return positionNumber > 2 ? 2 : positionNumber < 0 ? 0 : positionNumber } const endKey = 3 * _getPositionNumber(tranY) + _getPositionNumber(tranX) return endKey >= list.length ? list.length - 1 : endKey }, /*** 处理移动中key的变化*/ insert(origin, end) { const dragImgList = this.data.dragImgList dragImgList.forEach((item) => { if (origin < end) { if (item.key > origin && item.key <= end) item.key-- else if (item.key === origin) item.key = end } else if (origin > end) { if (item.key >= end && item.key < origin) item.key++ else if (item.key === origin) item.key = end } }) this.getListPosition(dragImgList) }, /*** 修改位置*/ getListPosition(list) { const ITEM_SIZE = this.data.ITEM_SIZE const dragImgList = list.map((item) => { item.tranX = ITEM_SIZE * (item.key % 3); item.tranY = Math.floor(item.key / 3) * ITEM_SIZE; return item }) this.setData({ dragImgList, }) const srcList = [dragImgList].sort((a, b) => a.key - b.key).map((item) => item.src) this.triggerEvent('updateImage', { list: srcList }) }, /*** touchEnd*/ touchEnd() { this.setData({ tranX: 0, tranY: 0, currentIndex: -1, }) this.data.currentKey = -1 }, // 修改上传图标位置 setUploaPosition(listLength) { const ITEM_SIZE = this.data.ITEM_SIZE const uploadPosition = { tranX: listLength % 3 * ITEM_SIZE, tranY: Math.floor(listLength / 3) * ITEM_SIZE, } this.setData({ uploadPosition, }) }, /*** 删除图片*/ deleteImg(e) { const key = e.mark.key const list = this.data.dragImgList.filter((item) => item.key !== key) list.forEach((item) => item.key > key && item.key--) this.getListPosition(list) this.setUploaPosition(list.length) }, /*** 对多张图片进行预览*/ previewImg: function (e) { //获取当前图片的下标 var index = e.currentTarget.dataset.index; //所有图片 var imgs = this.data.imgs; // console.log(imgs); wx.previewImage({ //当前显示图片 current: imgs[index], //所有图片 urls: imgs }) }, /*** 上传图片*/ uploadImage() { let { dragImgList, ITEM_SIZE } = this.data var that = this; var imgs = this.data.imgs; if (imgs.length >= 9) { that.setData({ lenMore: 1 }); setTimeout(function () { that.setData({ lenMore: 0 }); }, 2500); return false; } wx.chooseMedia({ count: 9 - dragImgList.length, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], mediaType: 'image', success: (res) => { // console.log(res.tempFiles) const imgList = res.tempFiles.map((item, index) => ({ tranX: ITEM_SIZE * ((dragImgList.length + index) % 3), tranY: Math.floor((dragImgList.length + index) / 3) * ITEM_SIZE, src: item.tempFilePath, key: dragImgList.length + index })) var tempFilePaths = res.tempFiles; var imgs = that.data.imgs; for (var i = 0; i < tempFilePaths.length; i++) { let canvasId = 'zipCanvas' //注意这里的id和你在页面中写的html代码的canvas的id要一致 let imagePath = tempFilePaths[i].tempFilePath; //原图的路径 // console.log('图片原路径:' + imagePath) let limitSize = 512; //大小限制2048kb let drawWidth = wx.getSystemInfoSync().windowWidth; //初始绘画区域是画布自身的宽度也就是屏幕宽度 wx.showLoading({ title: '图片压缩中...', mask: true }) //不需要你可以删掉 let that = this /* canvasId: 微信canvas 2.0 的id值 currentInstance: 这个很重要, 这就是当前页面组件的实例, 这个就是自定义函数内部用来使用wx.createSelector的api中in(this) 的对象, 不然我们是无法从过query方法去获取当前页面的canvas的。 imagePath: wx.chooseImage API返回的临时图片经验, 也是通过这个图片我们实现再canvas上绘制截图的。 limitSize = 100 这个是对小于100KB的图片不进行压缩限制。 drawWidth: 要压缩到的目标宽度 callBack: 压缩完成后重新拿到的图片回调函数。 */ this.getLessLimitSizeImage(canvasId, that, imagePath, 400, 500); console.log(img, "---"); imgs.push(resPath); wx.setStorage({ key: "imgs_src", data: imgs }) dragImgList = dragImgList.concat(imgList) this.setUploaPosition(dragImgList.length) this.setData({ dragImgList }) } }, fail(err) { // console.log('err', err); } }) }, fail: () => {}, complete: () => {} }, })
2023-11-10已发布之后扫码就会进入正式版。如果还需要测试,可以点详情,在最下面可以添加一些测试链接,扫这些测试码就能进入体验版进行测试
我测试范围选了体验版,点了发布后,扫码就到了线上版本了?[图片]
2023-11-10感觉在疯狂的收割了,地图个性化样式组件收费、手机号授权收费、公众号快速注册复用认证信息也不行了,现在个人小程序也要收费认证了。而且认证过程在第三方,稍微有点信息出入认证就失败,费用还不能退,只有修改或补充资料后重新花钱认证。个人认证感觉也会有很多的坑。
关于个人小程序认证问题,你有什么看法?遇到了哪些坑?要改名?肯定行的啊,你得先充值: [图片] 别人搜索不到?你没法分享?肯定行啊,你得先充值: [图片] 什么?你不服?那请放弃你所有的流量和粉丝,换平台玩吧! 没办法,就是这么人性化。 你猜为什么没有发公告,让大家慢慢适应,因为这次学乖了,一发公告肯定会全网炸开锅(以前改接口、云开发收费、接口改收费顶多就是吐槽一下,毕竟不是必须的,还有其他方案可选。但是这次几乎是强制的 收割,要么乖乖被收割,要么默默选择退出,没得选)
2023-11-09https://developers.weixin.qq.com/miniprogram/dev/framework/performance/api-frequency.html 可以看下是不是调用频率超限了。
wx.login回调success但是没返回code?!急![图片] 调用wx.login的时候,走了success回调函数,但是event里没有code,上面是后端捕捉到的日志,非必现。 之前一直都会有这种情况,但是上周六开始触发得特别频繁,登录失败的情况越来越多。 求官方关注!
2023-11-03https://developers.weixin.qq.com/miniprogram/dev/api/base/update/wx.getUpdateManager.html 可以通过版本更新管理器,来管理小程序更新
小程序版本更新但是打开还是旧版?应该怎么杜绝[图片]只这样够吗?
2023-11-03https://developers.weixin.qq.com/miniprogram/dev/framework/custom-component/events.html 子组件调用triggerEvent 可以传参数和配置, 第二个参数为自定义数据,第三个参数为配置: this.triggerEvent('customevent', {}, { bubbles: true, composed: true }) 父组件监听事件时,可以通过event.detail,获取到子组件传递的参数信息; onCustomEvent(event) { const params = event.detail; }
想封装一个高阶组件,每次曝光时调用打点,怎么传参?[图片] 这个组件只监听曝光,调用父页面的事件,但是在父页面调用的时候发现参数不懂怎么传比较合适 对于这个组件来说,参数应该不需要传进组件再传回父页面 有没有办法直接在父页面的onExposure里直接拿到参数
2023-11-02