- 两个云开发的微信小程序是否可以共用数据?
同一个主体,用云开发方法开发两个小程序,是否可以共用数据?一个小程序专注产品开发设计,另一个专注产品的用户体验,有一部分数据要在两个小程序之间传递。
2022-08-24 - 微信认证费用申请开具纸质发票相关问题
1、开具发票的类型及注意事项 微信认证时,您可以勾选“增值税专票”或“电子发票”,选择发票类型并根据页面提示填写相应资料后,腾讯公司则会开具发票,邮费由腾讯公司承担。 温馨提示: 1)认证审核完成后,腾讯会在30个工作日内开具并寄出纸质发票; 2)增值税专票抬头使用用户填写的企业全称或组织全称; 3)若填写错误造成开具/发票寄送错误,无法再重新开具发票; 4)发票的公章为:深圳市腾讯计算机系统有限公司; 5)微信认证发票内容:增值税专票内显示为“微信认证服务费??”,增值税普票内显示为“服务费”; 6)微信认证发票是国税发票; 7)300元增值税专用发票仅抵扣进项税16.9元; 8)发票邮寄方式:约投挂号(类似于挂号信); 9)目前还不支持先邮寄发票再支付费用的模式,建议您支付费用提交认证资料后,后续再留意下发票邮寄情况; 10)若认证审核失败,发票也是可以开具的。 2、发票类型选择“电子发票”填写 电子发票,填写页面如下,请根据以下页面提示相关资料: [图片] 3、发票类型选择“专用发票”填写 增值税专用发票,填写页面如下,请根据以下页面提示相关资料: “三证(多证)合一”的企业更换新营业执照的情况: 纳税识别号处:请输入纳税识别号或统一社会信用代码; 《税务登记证副本》或《一般纳税人资格证书》扫描件处:请上传最新的营业执照; 温馨提示:因三证合一问题导致税号变更的,请确认需要报账的税号再填写,否则发票开具信息错误将无法重新开具。
2019-11-20 - 出事了,出事了,我的抽奖助手小程序被人举报了
小程序故事记 ~ 这个故事发生在我本人身上,还记得去年红包封面刚出来的时候,当时的红包封面带动了抽奖小程序的行情,看群里伙伴们做的火热,我也跟进,在某平台上,花大钱买了一套抽奖助手小程序的源代码, 一年过去了,又到了今年年底,不温不火的这么就过去了,没想到,突然来了一些流量, 我着实也没有放心上去维护,但是有不少发布者用了起来, 这本来是件好事情,但是呢,问题就出在这里, 有发布者A在这个抽奖平台上发布了一些极高吸引力的奖项,比如说某苹果13香 用户Z在这个平台抽到中奖了,而且抽到了二次,但是到了兑奖环节,发布者缺玩起了躲猫猫的游戏 你说气不气人 [图片] 所谓跑了和尚跑不了庙嘛,用户Z就找到平台,跟属地的公安报案了,举报平台的不作为行为 我呢,作为平台的实际运营者,这层关系我是跑不掉的, 这不,今天就接到某某0的电话,你是某尚尚嘛?接到电话,我心里咯噔一下,我遵纪守法也没做什么出格的事儿呀,除了在群里吹水, 聊了几句,我就清楚是怎么回事了 ~ 一路小跑来到目的地取回了下面这张纸 好奇宝宝们直接看图吧 [图片] ~ 我就复述下 用户在平台参与抽奖,中了2次,苹果蓝牙耳机,大概呢市场价在4000块 但是发布这个活动的人联系不上,用户兑奖五门,找到了平台,我最后成为冤大头 ~ 平心而论呢, 我确实有不作为的地方,作为抽奖平台运营者我没有尽到审核的义务,但是这4000确实也不是一笔小数目了,社区有没有高人指点下的,在线等 ~~ 虽说我作为流量主的收益者,但是就这么怂了,实属不甘心呢? [图片] ~ 出事了,出事了,我的抽奖助手小程序被人举报了
2022-01-25 - 如何每天24点清零全局变量?
小弟我最近在做一个项目,其中有一个功能就是:让用户每天只能进行10次的阅读,如果阅读数超过10次,则弹出窗口提示次数已超。 在如何判断用户阅读量的时候,小弟用了全局变量,每次阅读的时候,用户阅读数+1,但在每天定时清理全局变量的时候,遇到问题:如何在每天24点的时候,将全局变量 变为 0呢? 因为不想在后端增加服务器压力,所以考虑在小程序前端进行判断。
2020-07-03 - 小程序登录、用户信息相关接口调整说明
公告更新时间:2021年04月15日考虑到近期开发者对小程序登录、用户信息相关接口调整的相关反馈,为优化开发者调整接口的体验,回收wx.getUserInfo接口可获取用户授权的个人信息能力的截止时间由2021年4月13日调整至2021年4月28日24时。为优化用户的使用体验,平台将进行以下调整: 2021年2月23日起,若小程序已在微信开放平台进行绑定,则通过wx.login接口获取的登录凭证可直接换取unionID2021年4月28日24时后发布的小程序新版本,无法通过wx.getUserInfo与<button open-type="getUserInfo"/>获取用户个人信息(头像、昵称、性别与地区),将直接获取匿名数据(包括userInfo与encryptedData中的用户个人信息),获取加密后的openID与unionID数据的能力不做调整。此前发布的小程序版本不受影响,但如果要进行版本更新则需要进行适配。新增getUserProfile接口(基础库2.10.4版本开始支持),可获取用户头像、昵称、性别及地区信息,开发者每次通过该接口获取用户个人信息均需用户确认。具体接口文档:《getUserProfile接口文档》由于getUserProfile接口从2.10.4版本基础库开始支持(覆盖微信7.0.9以上版本),考虑到开发者在低版本中有获取用户头像昵称的诉求,对于未支持getUserProfile的情况下,开发者可继续使用getUserInfo能力。开发者可参考getUserProfile接口文档中的示例代码进行适配。请使用了wx.getUserInfo接口或<button open-type="getUserInfo"/>的开发者尽快适配。开发者工具1.05.2103022版本开始支持getUserProfile接口调试,开发者可下载该版本进行改造。 小游戏不受本次调整影响。 一、调整背景很多开发者在打开小程序时就通过组件方式唤起getUserInfo弹窗,如果用户点击拒绝,无法使用小程序,这种做法打断了用户正常使用小程序的流程,同时也不利于小程序获取新用户。 二、调整说明通过wx.login接口获取的登录凭证可直接换取unionID 若小程序已在微信开放平台进行绑定,原wx.login接口获取的登录凭证若需换取unionID需满足以下条件: 如果开发者帐号下存在同主体的公众号,并且该用户已经关注了该公众号如果开发者帐号下存在同主体的公众号或移动应用,并且该用户已经授权登录过该公众号或移动应用2月23日后,开发者调用wx.login获取的登录凭证可以直接换取unionID,无需满足以上条件。 回收wx.getUserInfo接口可获取用户个人信息能力 4月28日24时后发布的新版本小程序,开发者调用wx.getUserInfo或<button open-type="getUserInfo"/>将不再弹出弹窗,直接返回匿名的用户个人信息,获取加密后的openID、unionID数据的能力不做调整。 具体变化如下表: [图片] 即wx.getUserInfo接口的返回参数不变,但开发者获取的userInfo为匿名信息。 [图片] 此外,针对scope.userInfo将做如下调整: 若开发者调用wx.authorize接口请求scope.userInfo授权,用户侧不会触发授权弹框,直接返回授权成功若开发者调用wx.getSetting接口请求用户的授权状态,会直接读取到scope.userInfo为true新增getUserProfile接口 若开发者需要获取用户的个人信息(头像、昵称、性别与地区),可以通过wx.getUserProfile接口进行获取,该接口从基础库2.10.4版本开始支持,该接口只返回用户个人信息,不包含用户身份标识符。该接口中desc属性(声明获取用户个人信息后的用途)后续会展示在弹窗中,请开发者谨慎填写。开发者每次通过该接口获取用户个人信息均需用户确认,请开发者妥善保管用户快速填写的头像昵称,避免重复弹窗。 插件用户信息功能页 插件申请获取用户头像昵称与用户身份标识符仍保留功能页的形式,不作调整。用户在用户信息功能页中授权之后,插件就可以直接调用 wx.login 和 wx.getUserInfo 。 三、最佳实践调整后,开发者如需获取用户身份标识符只需要调用wx.login接口即可。 开发者若需要在界面中展示用户的头像昵称信息,可以通过<open-data>组件进行渲染,该组件无需用户确认,可以在界面中直接展示。 在部分场景(如社交类小程序)中,开发者需要在获取用户的头像昵称信息,可调用wx.getUserProfile接口,开发者每次通过该接口均需用户确认,请开发者妥善处理调用接口的时机,避免过度弹出弹窗骚扰用户。 微信团队 2021年4月15日
2021-04-15 - 如何使用云函数随机获取数据库的一条数据并显示在页面?
[图片][图片]这是10条数据,我想实现随机获取一个句子并显示,也就是每日一句的推荐。
2021-03-27 - 登录接口又双叕变了,三行代码挑战全网最少修改工作量
小程序登录、用户信息样关接口又双叕变了。 https://developers.weixin.qq.com/community/develop/doc/000cacfa20ce88df04cb468bc52801 几家悲伤几家愁。。。 微信的一小步,人猿的一大步。。。 没办法,改吧。。。 翻出以前小程序这部分的代码,惊喜地发现,只需要三行代码,就能平滑过渡; 感谢我以前看似丑陋却很省事的登录代码逻辑!!! 登录逻辑如下: 1、判断库里有用户的信息没有,没有,则wx.navigateTo一个专门的授权页面:auth 2、授权成功后获得userInfo,保存到库里; auth页代码修改如下: auth.wxml: 修改一行代码 <button style='margin:15px;font-size:16px' type='primary' size="mini" bindtap='getUserProfile'>授权微信头像和昵称</button> auth.js: 修改两行代码 //原wx.getUserInfo接口 getUserInfo: function (e) { let userInfo = e.detail.userInfo if (userInfo) this.onSaveUserInfo(userInfo) }, //新增wx.getUserProfile接口 getUserProfile: function (e) { wx.getUserProfile({ desc: '业务需要', success: res => this.onSaveUserInfo(res.userInfo) }) }, //保存userInfo到DB onSaveUserInfo:function(userInfo){ console.log(app.globalData.userInfo = userInfo) db.collection('user') .where({ _id: this.openid }) .count() .then(res => { if (res.total > 0) { //doc.update db.collection('user').doc(this.openid).update({ data: userInfo }).then(res => console.log(res)) } else { //doc.add db.collection('user').doc(this.openid).add({ data: userInfo }).then(res => console.log(res)) } }) wx.navigateBack() }, 以下是判断用户信息是否存在的代码: xxxx.js: onSubmit:async function () { if (await app.hasUserInfo()) { } else return //其他代码 }, app.js: hasUserInfo: async function () { if (this.globalData.userInfo && this.globalData.userInfo.nickName && this.globalData.userInfo.avatarUrl) return true let res = await wx.cloud.database().collection('user').doc(this.openid).get().catch(err => console.log(err)) if (res && res.data && res.data.nickName && res.data.avatarUrl) { this.globalData.userInfo = res.data return true } else { wx.navigateTo({ url: '/base/auth/auth' }) return false } }, 关于用户信息自动更新: 我们一直以来的方法如下: 1、留给用户手动授权的入口,用户更换头像后,发现自己的头像不显示,则需要手动授权刷新userInfo; 2、一般会在这个页面:我的--个人信息--授权微信头像和昵称,用户点击后,wx.navigateTo到授权页。 笔者团队认为:用户信息自动更新其实是个伪需求。理由如下: 假设某用户修改了头像: 1、用户自己打开小程序,发现头像和昵称怎么没有改过来,那么手动更新一下。用户体验没毛病,没必要非要自动更新; 2、用户如果后来不再进入小程序,别人看到的都是一张碎的头像,那么此时,自动更新也毫无作用,因为该用户都不打开小程序。 3、微信团队肯定考虑过自动更新这种要求,但他们宁愿千夫所指,也依然坚持推出新的登录接口,那就肯定是已经经过了中国最牛逼团队的全面考衡了。 补充: 登录和授权其实是两码事,可以毫无关系这么说,以上的内容主要都是关于授权微信用户信息的,下面补充一下登录的内容: 登录其实就是获取用户的openid,我们一直采用云函数来获取openid。方案如下: 在每个页面:page.js: onLoad: async function (options) { this.openid = await app.getOpenid() }, 在app.js: getOpenid: async function () { if (this.openid) return this.openid let res = await this.globalData.cloud.callFunction({ name: 'login' }) console.log(res) return this.openid = res.result.FROM_OPENID||res.result.OPENID },
2021-04-07 - 如何解决云开发数据库导出csv文件打开中文乱码问题
如何解决云开发数据库导出csv文件打开中文乱码问题 关键时候还是我知乎厉害,亲测可行 以下是mac系统的解决办法,不用输代码,不用下载额外app,只要excel就可以了~ 1. 打开一个新的excel表格,选择File--->Import[图片] 2. 选择从manager里export出来的csv文件 [图片] 会跳出来一个叫做“text import wizard”的三步骤设置面板;在step1中的file origin选项里,选择Unicode(UTF-8) [图片] 跳过step 2 & 3(不用做任何修改),然后点finish导入csv文件: [图片] 这时候就可以看到没有乱码出现的excel sheet啦! 3. 接下来,选择 File--->Save as [图片] 4. 将file format 选择为CSV UTF-8 (Comma delimited),改好文件名后点save [图片] 5. 打开新保存的csv文件,乱码消失! [图片] 作者:艾米午安 链接:https://www.zhihu.com/question/21869078/answer/428936970 来源:知乎
2020-05-04 - windows电脑csv乱码问题解决方案
背景: 通过云开发控制台导出的csv文件,在电脑用excel打开经常会出现乱码 [图片] 方案: 1)window系统,下载个notepad++软件 https://notepad-plus-plus.org/ 2)选中csv文件,鼠标右击,选中用上面下载的这个软件打开 [图片] 3)按下图设置下编码“转为UTF-8编码” [图片] 4)按下图点击保存 5)上面设置好编程以后,再用Excel打开csv文件就可以了。 [图片] 总结 该方案亲测可行 其他相关文章 mac笔记本wps打开csv乱码解决方案? - 微信开放社区 https://developers.weixin.qq.com/community/develop/article/doc/0000e2a5514978a88b6a582735f413
2020-06-16 - 云开发·云调用生成小程序码
云开发·云调用生成小程序码 小程序云开发已经支持云调用,开放了很多接口,一直想要的获取小程序码也支持了。这下轻量的小程序也可以有自定义小程序码的功能。 1. 需求 获得一个带参数的小程序码,传播出去以后,用户扫码进入指定页面,根据参数做不同的处理。本文只讲小程序码生成、存储、展示部分。参数处理不多介绍,可以查看 项目代码 了解更多。 2. 开通云开发 新建小程序可以从开发工具的云开发模板初始化项目,根据云开发操作指引新建项目即可。 但是这里有个问题,已发布小程序的页面才能生成小程序码。如果现有的小程序没有开通云开发,需要做以下几步: 开发工具开通云开发,设定云开发的环境; 将原来的代码(除了[代码]project.config.json[代码]以外的所有文件)放到新建的 [代码]miniprogram[代码] 目录; 新增 [代码]cloudfunctions[代码] 目录; [代码]app.json[代码] 新增配置 [代码]"cloud": true[代码]; [代码]project.config.json[代码] 配置 [代码]"miniprogramRoot":"miniprogram/"[代码] 和 [代码]"cloudfunctionRoot":"cloudfunctions/"[代码]; 修改小程序基础库版本,最低要 2.3.0 [代码]"libVersion": "2.3.0"[代码]。 3. 生成小程序码 下面可以开始写代码开发了,开始之前,建议先看完官方教程。特别是开发工具的使用步骤,开发和调试时如果遇到奇怪的问题,可以尝试重启开发工具、重装开发工具,也可以去微信开放社区发帖。(重启和重装都是我在社区中发现的答案,能解决各种不应该存在的问题)。 3.1 准备文件 在 [代码]cloudfunctions[代码]目录右键新建Node.js云函数 [代码]getqr[代码]。 生成小程序码需要单独指定权限。在 [代码]getqr[代码] 目录新建 [代码]config.json[代码] ,里面写以下内容: [代码]{ "permissions": { "openapi": [ "wxacode.getUnlimited" ] } } [代码] 小程序码的获取方式有三种,这里只用到了接口 getUnlimited,选择这个接口的原因是漂亮的圆形小程序码,数量无限制。具体区别可以去 获取小程序码官方文档查看详情。 正常情况下,这个时候云函数可以部署测试了。如果遇到部署不成功、各种权限问题,可以尝试本地部署上传所有文件、重启试试。 3.2 生成小程序码 生成小程序码的代码如下,可以指定页面和页面参数 [代码]scene[代码],还有小程序码的尺寸。 注意这里的 [代码]scene[代码] 有限制: 最大32个可见字符; 只支持数字,大小写英文以及部分特殊字符:[代码]!#$&'()*+,/:;=?@-._~[代码]; 注意参数格式:下面实例代码生成小程序码后,扫码获得 [代码]pages/demo/demo?scene=id%3D6[代码] 。 [代码]try { const result = await cloud.openapi.wxacode.getUnlimited({ page: 'pages/demo/demo', scene: 'id=6', width: 240, }) console.log(result) return result } catch (err) { console.log(err) return err } [代码] 直接调用,比服务端调用少了 access_token 参数。 3.3 上传到云存储 返回值中的 buffer 就是图片内容,直接上传到云存储: [代码]const uploadResult = await cloud.uploadFile({ cloudPath: 'shareqr/' + qr_name_hash + '.jpg', fileContent: result.buffer, }); [代码] 我在云存储新建了 [代码]shareqr[代码] 目录保存小程序码; 图片名根据参数取md5摘要; [代码]getUnlimited[代码] 返回的图像是 [代码]jpeg[代码] 格式,后缀硬编码写 [代码].jpg[代码]。 3.4 获取图片临时路径 直接上代码 [代码]getURLReault = await cloud.getTempFileURL({ fileList: [uploadResult.fileID] }); fileObj = getURLReault.fileList[0] return fileObj [代码] 3.5 直接从存云存储获取 生成过以后图片已经保存在云存储,用同样的参数第二次调用没必要再生成一次,去掉一次网络请求,可以节省不少时间。 前面说到文件名使用请求参数摘要,知道了目录和文件名,再加上文件bucket前缀就可以拼出来 [代码]fileID[代码],用[代码]fileID[代码] 可以查询云存储的文件。 比如我刚刚生成的 fileID 是 [代码]cloud://dev-xxxx.8888-dev-xxxx/qr/44ea42f05091c3bec771123e6e8cd4c2.jpg[代码], 前缀就是 [代码]cloud://dev-xxxx.8888-dev-xxxx/[代码]。再拼上目录、文件名、后缀就是 [代码]fileID[代码]。 注:此处的 [代码]fileID[代码]拼接方法并不是来自官方文档,只是在使用中发现这个前缀不会变。还需要官方解释说明[代码]fileID[代码]规则。 如果会改变,就需要再用云数据库存储[代码]fileID[代码],更麻烦一些。 3.6 云函数完整代码 [代码]// 云函数入口文件 const cloud = require('wx-server-sdk'); const crypto = require('crypto'); const bucketPrefix = 'cloud://dev-xxxx.8888-idc-4d11a4-1257831628/qr/'; // env: 'dev-xxxx' // 云函数入口函数 exports.main = async (event, context) => { const full_path = event.page + '?' + event.scene; const qr_name_hash = crypto.createHash('md5').update(full_path).digest('hex'); const temp_id = bucketPrefix + qr_name_hash + '.jpg'; // return { // full_path, // qr_name_hash, // temp_id // } try { // 先尝试获取文件,存在就直接返回临时路径 let getURLReault = await cloud.getTempFileURL({ fileList: [temp_id] }); // return getURLReault; let fileObj = getURLReault.fileList[0]; if (fileObj.tempFileURL != '') { fileObj.fromCache = true; return fileObj; } // 生成小程序码 const wxacodeResult = await cloud.openapi.wxacode.getUnlimited({ scene: event.scene, page: event.page, width: 280 //二维码的宽度,单位 px,最小 280px,最大 1280px }) // return wxacodeResult; if (wxacodeResult.errCode != 0) { // 生成二维码失败,返回错误信息 return wxacodeResult; } // 上传到云存储 const uploadResult = await cloud.uploadFile({ cloudPath: 'qr/' + qr_name_hash + '.jpg', fileContent: wxacodeResult.buffer, }); // return uploadResult; if (!uploadResult.fileID) { //上传失败,返回错误信息 return uploadResult; } // 获取图片临时路径 getURLReault = await cloud.getTempFileURL({ fileList: [uploadResult.fileID] }); fileObj = getURLReault.fileList[0]; fileObj.fromCache = false; // 上传成功,获取文件临时url,返回临时路径的查询结果 return fileObj; } catch (err) { return err } } [代码] 4. 小程序页面调用 调用页面就比较简单了,在小程序新建一个 [代码]pages/share/share[代码] 在 [代码]onLoad[代码] 函数调用云函数。 [代码]// 使用前记得先初始化云函数,一版放到 app.js onLaunch() 中 // wx.cloud.init({env: 'dev-8888'}) wx.cloud.callFunction({ name: 'getqr', data: { page: 'pages/demo/demo', scene: 'id=6', } }).then(res => { console.log(res.result); if (res.result.status == 0) { _this.setData({ qr_url: res.result.tempFileURL }) }else{ wx.showToast({ icon: 'none', title: '调用失败', }) } }).catch(err => { console.error(err); wx.showToast({ icon: 'none', title: '调用失败', }) }) [代码] 至此完整的调用过程已经全部完成,详细代码可以到 项目代码 查看。 代码中还对入口页面和share页面的参数做了包装,云函数可以直接使用,小程序可以稍做修改适应自己业务。 写在最后 小程序云开发已经开放了很多功能,除了这次提到的生成小程序码,云调用还可以发送模板消息。有需要的开发者又一个理由可以快速上线新功能了。 云开发还开放了[代码]HTTP API[代码],也就是用自己的服务器调用云函数。以前看完云开发介绍文章最大的疑问就是,你说的都很好,可是后台数据怎么管理呢?不能跟自己的服务器结合,只能放一些轻量的小程序。有了 [代码]HTTP API[代码] 以后就可以用自己的服务器做管理后台了。这时候你要问,都用上服务器了,还需要云开发做什么。首先,云开发免费;其次,免费功能已经够强,就差不能做Web管理后台了;最后,获取access_token(小程序及小游戏调用不要求IP地址在白名单内。)
2020-07-10 - 如何创建自己的小程序账号
创建自己的小程序账号在开发自己的微信小程序之前,首先需要注册小程序账号,接下来我们一步一步做详细说明。 打开浏览器,输入:mp.weixin.qq.com。 [图片] 因为是第一次使用,所以选择画面右上角的“立即注册”。 [图片] 选择左下角的“小程序”方框。 [图片] 输入邮箱、密码、确认密码、验证码,之后选择同意协议和条款。当然这里的密码不是邮箱的密码,而是正在申请的小程序账号的密码。 最后按下“注册”按钮。 [图片] 点击“登录邮箱”按钮。打开相应的软件后,应该可以收到下面的邮件。如果没收到的话,建议看一下垃圾邮件,没准儿那里有。 [图片] 单击下半部一大片绿色的部分,就可以回到注册界面继续剩下的工作。 [图片] 选择主题类型为“个人”,然后输入管理员的姓名,身份证号码。 输入手机号码并单击“获取验证码”,将手机接收到的验证码输入到短信验证码栏中。 完成上述步骤,画面下部会出现一个二维码,需要用已经绑定银行卡的微信的扫一扫功能扫描该二维码进行实名认证。 如果认证成功,画面会变成下面这个样子。 [图片] 点击“继续”按钮。 [图片] 意思就是现在后悔还来得及,如果不后悔今后就没法后悔了。我们按下“确定”按钮。 [图片] 大功告成! 小程序管理平台账号申请成功之后,就可以登录“微信公众平台 | 小程序”了。在目前这个时间点虽然并不需要马上做什么。本文接下来将对其中重要的菜单功能做简单介绍。 首页 [图片] 内容比较简单,主要是表示小程序的实时访问次数和系统公告。 开发管理 [图片] 用户在使用小程序的时候,需要扫描二维码进入。而这个二维码需要开发者将小程序上传到腾讯服务器之后从腾讯取得。上传过程便在该页面上完成。 过程也不复杂,一共分为三步:上传代码,提交审核和发布小程序。 用户身份 [图片] 这个画面用来指定小程序项目的管理员和项目成员。其中项目成员又包括开发者和体验者。 数据分析 [图片] 这个画面可以统计小程序的访问数量,对用户来源、性别、年龄分布等进行分析。 模板消息 [图片] 这个画面可以定制微信小程序向客户发送的消息。 客服消息 [图片] 通过这个画面可以指定小程序的客服人员,从而实现小程序的在线客服功能。 附近的小程序 [图片] 当小程序的主体为企业、政府、媒体及其他组织时可以开通此功能。此功能有效时,小程序指定地点以后,用户可以通过微信的“附近的小程序”界面发现该小程序。 运维中心 [图片] 一共有两个页面,分别用于查询小程序的错误日志和对客户端进行监控。 推广 [图片] 用来自定义小程序推广关键字。 设置 设置分类中一共有五个页面,这里只介绍前两个。 基本设置 [图片] 顾名思义,这里主要是用来设置小程序的基本信息。内容包括: 设定小程序名称,小程序头像;取得小程序码;取得认证;设定主题信息;其他省略。开发设置 [图片] 这个页面主要负责和小程序开发相关的设定信息,内容包括: 取得小程序 ID。每一个发布的小程序都需要唯一的 ID。生成小程序秘钥。指定服务器域名。小程序可以访问外部网站,可以上传和下载文件。但是对象服务器不是任意的,需要在这里指定。其他省略。其他 在画面的右上角,有两个链接“文档”和“社区”分别可以进入小程序开发文档和社区。在实际的学习过程中可以积极利用。 安装开发工具小程序账号申请成功之后的工作就是准备开发环境。 早期的版本在首页分类中有开发工具的下载链接,最近不知道为什么变成了访问次数统计画面。但是没有关系,可以直接点击这里,便可打开下面的下载地址页面。 [图片] 根据操作系统选择合适的下载链接。 [图片] 下载完成后打开安装程序,首先是开始画面。 [图片] 按下“下一步”按钮。 [图片] 按下“我接受”按钮。 [图片] 指定适当的安装目录后按下“安装”按钮。 [图片] 安装中…… [图片] 完成! 接下来就可以开始微信小程序的开发之旅啦!
2020-08-28 - 灵犀外卖之使用微信小程序云开发
#摘要 在官方的微信小店全开放前开源一波 效果演示 [图片] [图片] [图片] 集成云开发 旧项目是非基于云开发的,建立cloud文件夹,并在package文件中配置,建立用户登录的云函数并上传到微信小程序云中 建立云函数文件夹,并在package.config.json配置为云函数目录 文档详见:[https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions/getting-started.html ](https://developers.weixin.qq.com/miniprogram/dev/wxcloud/guide/functions/getting-started.html ) 建立页面文件夹,miniprogram,将旧小程序项目的pages文件夹一并移入该文件夹中,并配置在package.config.json中,{…“miniprogramRoot”: “miniprogram/”…} 开通云开发 [图片] [图片] 创建数据表 分别创建 店铺表Seller、分类表Category、商品表Food、订单表Order、地址表Address、用户表_User [图片] 怎么建立用户表 用户表是不是需要自己创建,不存在类似于Bmob、LeanCloud这些云存储那样默认存在_User表 数据表的特征 当数据是从小程序端创建数据的,天然就带有_openid字段 添加数据必须保证数据表已经存在,不存在就创建集合这跟之前用过的Bmob、LeanCloud一类的云存储不同,后者遇到引用不存在集合是会自动创建集合的 创建云函数 写完云函数本地调试完毕后,要将远程的也更新一下 上传增量更新 [图片] 本地调试 [图片] 如果没有安装依赖的,要切换到云函数目录,运行[代码]npm install[代码]安装它 [图片] 表数据的权限问题 假如没权限,.get请求数据,得到的数据是空白的,而不是报错无权限 那么就是权限没有,默认是仅创建人可读可写 修改文档也是一样,打算修改店铺资料,但从返回信息看是修改成功,实则数据未改成功过,这是就自定义权限,read/write都设置为true了。 修改权限可以按如下方式修改 [图片] 数据的增删改查 引入[代码]const db = wx.cloud.database()[代码]后,就是一系列关键字,get/doc/add/update/remove这些了 看下面这个分类表的操作 [代码]/* * * 关注订阅号【huangxiujie85】,第一时间收到教程推送 * * @author 黄秀杰 */ const db = wx.cloud.database() const { showModal } = require('../../utils/utils') Page({ onLoad: function(options) { // 管理员认证 getApp().auth() if (options.objectId) { // 缓存数据 this.setData({ isEdit: true, objectId: options.objectId }) // 请求待编辑的分类对象 db.collection('Category') .doc(options.objectId) .get() .then(res => { this.setData({ category: res.data }) }) } }, add: function(e) { var form = e.detail.value if (form.title == '') { wx.showModal({ title: '请填写分类名称', showCancel: false }) return } form.priority = Number.parseInt(form.priority) // 添加或者修改分类 // 修改模式 if (this.data.isEdit) { const category = this.data.category db.collection('Category') .doc(category._id) .update({ data: form }) .then(res => { console.log(res) showModal() }) } else { db.collection('Category') .add({ data: form }) .then(res => { console.log(res) showModal() }) } }, showModal() { // 操作成功提示并返回上一页 wx.showModal({ title: this.data.isEdit ? '修改成功' : '添加成功', showCancel: false, success: () => { wx.navigateBack() } }) }, delete: function() { // 确认删除对话框 wx.showModal({ title: '确认删除', success: res => { if (res.confirm) { const category = this.data.category db.collection('Category') .doc(category._id) .remove() .then(res => { console.log(res) wx.showToast({ title: '删除成功' }) wx.navigateBack() }) } } }) } }) [代码] 表关联 商品表关联分类表 lookup做联表查询时,报错 errCode: -502003 database permission denied | errMsg: Permission denied Error: errCode: -502003 database permission denied | errMsg: Permission denied [图片] 版本要求:wx-server-sdk 1.3.0 或以上 不支持在小程序端使用 好坑,提示是权限问题,发现是本来就不支持,联表查询下,还要在云上写 老老实实地写云函数吧 [代码]// 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() const db = cloud.database() // 云函数入口函数 exports.main = async (event, context) => { const result = await db.collection('Food') .aggregate() .lookup({ from: 'Category', localField: 'category', foreignField: '_id', as: 'categories' }) .end() // .orderBy('priority', 'asc') // .get() console.log(result) return result.list } [代码] 这样就能使用.aggregate().lookup作联表查询了 图片上传 图片上传重点是取出fileID,它可以直接赋值给<image />的src属性就是渲染到页面上了,微信一家就是这么好说话 [代码]chooseImage() { wx.chooseImage({ count: 1, // 默认9 sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有 sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 success: res => { const tempFilePaths = res.tempFilePaths const file = tempFilePaths[0] const name = utils.random_filename(file) //上传的图片的别名,建议可以用日期命名 console.log(name) wx.cloud.uploadFile({ cloudPath: name, filePath: file, // 文件路径 }).then(res => { console.log(res) const fileId = res.fileID // 将文件id保存到数据库表中 db.collection('Seller').doc(this.data.seller._id) .update({ data: { logo_url: fileId } }).then(() => { wx.showToast({ title: '上传成功' }) // 渲染本地头像 this.setData({ new_logo: fileId }) }, err => { console.log(err) wx.showToast({ title: '上传失败' }) }) }) } }) } [代码] 微信支付 优点,都不用开启后端服务,有点要调试发现后端都还没怎么就跑起来了,这种感觉之前没有的,很不习惯 调用简单 不用提供小程序的appid 支付的32位key,这些都在开发工具设置中绑定好了的,唯一提供的是商户的mchId就可以 因为本地没法得到微信支付的通知回调,在以前魔改路由,配花生壳域名,远程到服务器写代码,这都经历过,为的就是让回调被通知到微信支付的消息。 subMchId 子商户号,不知道从何而来,我这里就是传的自己申请到的商户号 传统写支付要用的mchid key为什么这里不需要,只要绑定就好 绑定微信支付商户 如下图先添加商户号添加 [图片] 添加后微信会发来通知 [图片] 按提示开通就好 [图片] 如果不绑定,将报“理关系不存在”的错误 [图片] 配置成功后,云函数中发起统一下单 [代码]// 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) // 云函数入口函数 exports.main = async (event, context) => { console.log('请求中') console.log(cloud.getWXContext().ENV) let { orderId, amount, body } = event const wxContext = cloud.getWXContext() const res = await cloud.cloudPay.unifiedOrder({ body: body, outTradeNo: orderId, spbillCreateIp: '127.0.0.1', subMchId: '1447716902', totalFee: amount, envId: 'dinner-cloud', functionName: 'pay_cb' }) return res.payment } [代码] 这里functionName: 'pay_cb’指的就是支付成功后,微信支付那侧给我的回调信息,后面我们就用它来更新我们的订单状态 正常返回支付要用的参数了 [图片] 上面的payment对象里的就是小程序端调用支付requestPayment时要用到的参数 配合以下小程序端的代码,就能唤起支付让用户付款了 [代码]const { result: payData } = res wx.requestPayment({ timeStamp: payData.timeStamp, nonceStr: payData.nonceStr, package: payData.package, signType: 'MD5', paySign: payData.paySign, success: res => { console.log('支付成功', res) wx.showModal({ title: '支付成功', showCancel: false, success: () => { // 跳转订单详情页 wx.navigateTo({ url: '/order/detail/detail?objectId=' + order._id }) } }) }, ... [代码] 微信支付回调 微信统一下单里一个pay_cb回调函数,它是一个云函数,也就用到了云函数调用云函数了 接下来就实现这个回调函数 [代码]// 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init({ // API 调用都保持和云函数当前所在环境一致 env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database() // 云函数入口函数 exports.main = async (event, context) => { console.log('支付回调') console.log(event) console.log(cloud.getWXContext().ENV) const orderId = event.outTradeNo const resultCode = event.resultCode if (resultCode === 'SUCCESS') { const res = await db .collection('Order') .doc(orderId) .update({ data: { status: 1 } }) console.log(res) return { errcode: 0 } } } [代码] 为了更好地调试微信支付给我的回调信息,可以进入云函数面板,日志标签页,那里给把我们云函数console.log()打印结果显示出来,如下图 [图片] 使用第三方库tenpay实现 这个是通用解决方案,不用原生的云开发微信支付,自己写node.js后端就是这么干的 [代码]//云开发实现支付 const cloud = require('wx-server-sdk') cloud.init() //1,引入支付的三方依赖 const tenpay = require('tenpay') //2,配置支付信息 const config = { appid: 'wx6f3d36xxxb1678f', // mchid: '1447716902', // partnerKey: '21f0ce9b272exxxxx3994c438f39', // notify_url: 'https://mp.weixin.qq.com', //支付回调网址,这里可以先随意填一个网址 spbill_create_ip: '127.0.0.1' } exports.main = async (event, context) => { const wxContext = cloud.getWXContext() let { orderId, amount, body } = event //3,初始化支付 const api = tenpay.init(config) let result = await api.getPayParams({ out_trade_no: orderId, body: body, total_fee: amount, //订单金额(分), openid: wxContext.OPENID //付款用户的openid }) return result } [代码] 缺点是无法回调通知支付结果notify_url: ‘’,因为我们没有自己的后端服务器,也就没法提示这个url了,最多就是在前端轮询订单就支付状态进而改自己的订单的状态了。 总结 云开发体验下来,优点自不必多说,微信登录与支付原生支持,调用与调试都很方便,特别是不用启本地服务开发,真的好用;最大的不足就是小程序端不支持联表查询,必须写云函数被小程序调用,期待早日能像Bmob、LeanCloud一类的云存储那样得到支持。 源码下载 [https://gitee.com/laeser/dinner-cloud ](https://gitee.com/laeser/dinner-cloud ) 或者关注公众号huangxiujie85回复116 [图片]
2020-07-16 - 24小时内开发一款优质的在线答题小程序
本文背景本文将复盘24小时内如何开发一款答题小程序,目前该代码托管在码云 [图片] 本文内容本文主要介绍答题小程序,该小程序从7月11号9点开始开发,在12号凌晨1点已完成,目前未发现已知BUG 该小程序主要功能有 (1)用户注册,主要用于收集用户的姓名、部门等信息,跟openid进行绑定; (2)用户登录,我觉得这个登录时多余的,但是没有办法,需求存在这个功能点 (3)考试模块,可重复考试,考试成绩后面覆盖前面; (4)练习模块,可展示当前题目的正确率,每天可以参加三次答题; (5)排行榜模块,包括考试的排行榜和练习的排行榜; (6)文章列表、文章详情,主要用于提供企业内部制度学习用; (7)考试规则介绍模块,主要用于公布考试的时间信息; (8)错题排行榜,主要按照题库中错题的顺序进行排序展示,方便大家复习用。 技术架构本文采用小程序云开发,未采用任何第三方框架, 知识点播开发过程中用到以下新知识点 (1)富文本展示 (2)左滑动系统公告栏 (3)关于考试开始、结束日期的判断逻辑有了新的办法,相较于我以往的判断方法 (4) 界面截图f [图片] f [图片] f [图片] f [图片] f [图片] f [图片] f [图片] f [图片] f 本文总结目前该小程序已经通过加急送审的模式,审核通过,并且发布上线,在后续,我会监控该小程序的运行情况,有更新也会第一时间同步到社区。 [图片] f
2020-07-12 - 小程序开发实战
高校大赛系列课程之“小程序开发实战”,是由清华大学和微信团队共制作的小程序学习教程。通过需求分析、原型设计、小程序前端实现、后台接口开发、小程序对接接口,逐步教大家如何“从无到有”完成小程序项目
2021-11-25 - 发现开源项目之美一,博客类小程序
从今天开始会找一些优秀的开源小程序项目,每一个开源项目,我都会通过我本人主体小程序进行发布,将个人主体不允许的功能砍掉,审核通过后,才写文章,有一点时间,计划每周出一篇 发现开源小程序之美一,个人博客小程序 https://developers.weixin.qq.com/community/develop/article/doc/000a40e13ec550274e2a9addd56413发现开源小程序之美二,微慕WordPress小程序 https://developers.weixin.qq.com/community/develop/article/doc/000c44945dc728ab9c2aff2a55b013 发现开源小程序之美三,维修上报小程序发现开源小程序之美四,在线答题小程序发现开源小程序之美五,营销组件库 https://developers.weixin.qq.com/community/develop/article/doc/000c4235c98740a1dc2a1a6045b013 第一个开源小程序为个人博客类小程序, 该小程序实现的功能很多,但是我觉得几个核心出彩功能有 1、富文本展示 2、海报生成 3、留言之后自动推送订阅消息 4、留言已经做过内容安全检查 5、版本更新机制,这个功能还是第一次体验到,虽然官方文档有介绍,但是这时第一次体验到这种热更新方式 [图片] 2 [图片] 3 [图片] 4 [图片] 4 特色 该小程序有一点非常棒,就是可以同步公众号文章,通过公众号提供的素材api,可以将公众号的文章定时拉取到小程序云开发数据库 从功能上讲,已经非常完善,从技术角度,涉及到了海报生成、富文本展示、订阅消息、云函数 项目开源地址: https://github.com/CavinCao/mini-blog 具体数据库集合如下所示 [图片] [图片] 这样,为方便大家看数据库的结构,我把这个项目在码云传了一份,数据库文件在data目录里面,这里面仅仅是包含了有数据的集合,没有数据的集合不在,总共有这么11个集合 1、//缓存小程序or公众号的accessToken access_token //小程序文章集合 2、mini_posts //小程序评论内容集合 3、mini_comments //小程序用户操作文章关联(收藏、点赞) 4、mini_posts_related //小程序博客相关配置集合 5、mini_config //小程序博客相关操作日志 6、mini_logs //小程序博客用户FormID(用于模板消息推送)[已经废弃] 7、mini_formids //会员信息表 8、mini_member //签到明细表 9、mini_sign_detail //积分明细表 10、mini_point_detail //订阅消息记录表 11、mini_subcribute 正式一些的话,应该是绑定公众好,通过云函数把公众号的图文数据拉下来,如果不做,可以用我data目录的数据集合,展示的时候也有数据。 上面是数据库,下面我截图下云函数 [图片] 环境变量配置 [图片] 具体通过syncService云函数来同步公众号文章到小程序,直接点击云端测试就可以。 [图片] 部署过程中会遇到各种问题,我应该是花了两个晚上调通了,具体问题我大致回忆下 1、公众号素材拉取的时候要设置白名单 2、有几个云函数要设置环境变量 3、在我的模块有个后台管理,是通过环境变量来配置openid来展示的 4、海报生成要安装npm第三方组件,这个不清楚的,规矩要琢磨半天 5、海报生成模块,必须要等小程序上线之后才可以的 6、留言需要配置订阅消息,订阅消息id记得要变更下 大致记着这么多 为了方便大家部署,我在码云重新创建了下,里面有个data目录,存放着云开发数据库有数据的集合json文件,如果集合中的没有数据,是导不出json文件的,所以建议先手工把集合都创建下,然后,将有数据的集合json导入进去,并改下数据库权限,就能正常跑起来了 如果部署过程中还遇到其他问题,或者遇到问题过不去,都欢迎通过社区私信跟我联系,由于社区运营规范要求,微信联系方式暂不方便在社区发布。 https://gitee.com/xiaofeiyang3369/blog 解决的问题: 2018年之后申请的公众号都不会开放留言功能,通过这个方式,可以将公众号文章通过公众号开放的api,整体拉取下来,到云开发的数据库,然后通过这种方式留言, 注意留言一定要做内容安全检查 从规则来说,除了留言这里有风险之外,技术层面是通的。 2020-04-19更新 新增集合 mini_point_detail 用于积分模块
2020-06-08 - 小程序微信登录能力调整
为了优化用户的使用体验,平台将回收“使用 wx.getUserInfo 接口直接弹出授权框”以及“使用 wx.authorize 接口直接申请提前授权用户信息”的能力,开发者需要使用组件方式唤起登录授权弹窗。 2018年10月10日后发布新版本的小程序,将无法在线上版本中使用接口直接弹出授权框。开发者可结合平台设计建议,提前做好兼容,合理使用微信登录能力。 能力调整背景 怎么合理使用微信登录能力 小程序登录流程设计建议 01 能力调整背景 推出微信登录能力的初衷是希望:当用户使用小程序时,可以便捷地使用微信身份登录小程序。但在实际使用场景中,我们发现:很多开发者在打开小程序时直接弹出授权框,如果用户点击拒绝授权,无法使用小程序。 在用户无法获知当前小程序服务内容的情况下,很多用户就会选择拒绝授权并离开当前小程序。所以“一进入小程序就要求用户授权”的做法打断了用户正常使用小程序的流程,同时也不利于小程序获取新用户。 所以平台调整登录接口,回收“使用 wx.getUserInfo 接口直接弹出授权框”以及“使用 wx.authorize 接口直接申请提前授权用户信息”的能力,并鼓励开发者参照以下指引合理改造小程序内的登录流程。 02 怎么合理使用微信登录能力 平台分别提供多种方式实现微信登录: 1. 调用wx.login接口,静默获取openid 适用场景:无需使用用户头像、昵称、Unionid信息 2. 使用 open-data (小程序)或者开放数据域(小游戏)的方式展示用户信息(无需用户授权) 适用场景:需要在前端“展示”用户头像、昵称信息,但不需要获取Unionid 3.使用button(小程序)或UserInfoButton(小游戏)组件,用户点击后弹窗请求用户授权 适用场景:需要获取用户头像、昵称、Unionid等基本信息 开发建议 第一步:获取openID 当用户访问小程序时,先通过wx.login,获取用户openID 。这时无需弹框授权,开发者拿到 openID 可以建立自身的帐号 ID。 第二步: 使用open-data方式或开放数据域方式展示头像昵称 如需要在前端展示用户头像、昵称信息, 使用open-data 方式或者开放数据域的方式展示用户信息 第三步:根据实际使用场景,使用组件,引导用户登录 在关键操作中,如必须获取用户头像、昵称、UnionID信息,可根据第一步获取的openID判断是新用户还是旧用户: 如果是旧用户,可以直接登录,也可定期使用wx.getUserInfo更新用户的信息; 如果是新用户,使用button(小程序)或UserInfoButton(小游戏)组件,在用户点击后弹窗请求获取用户基本信息。 03 小程序登录流程设计建议 a. 在必须用到登录信息的环节引导用户登录 在用户必须登录时才引导用户登录(如:购买前需要获取会员信息,用于同步积分数据),而不是用户一进入小程序就弹窗要求用户授权。如只需要在前端展示用户头像、昵称,无需要求用户授权,可直接展示。 [图片] b.清晰、准确地引导用户登录 在登录页面中,清晰、准确地告知用户当前操作是登录,说明获取登录信息的目的(如:用于同步会员积分数据等) [图片] c. 不强制用户必须登录后才能使用小程序服务 提供游客模式,不强制用户必须登录后才能进入小程序。如要求必须授权头像昵称等信息才能继续使用小程序,会导致某些用户放弃使用该小程序。 [图片]
2018-12-29 - 云支付,更新都是这么低调的吗?
终于,云开发支付出来了,怎么官方就不发个更新通告的呢? 还是已经发了,我没看到? 一般都在哪看更新通告的? https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-sdk-api/open/pay/Cloud.CloudPay.html
2020-05-12 - 云控制台数据库导入csv格式数据,中文数据出现乱码,如何解决?
云控制台数据库导入csv格式数据,中文数据出现乱码,如何解决?
2018-09-16 - 开源的基于云开发的在线答题小程序
原标题:历时一周,终于把小程序从自建服务器迁移到云开发上来了 现标题:开源的在线答题小程序 修改日期:2020-04-13 昨天是腊月二十三,传统意义上的小年,对我而言高兴的是,终于放寒假了,从回到家开始马不停蹄的把小程序收尾下,今天送审了两次,现在小程序已迁移完成。 [图片] 现在基于云开发的在线答题小程序已具有的功能有: 1、选择考试类型 2、选择科目 3、选择答题模式,单题模式还是列表模式 4、答题结果页 5、答案解析模块 6、答题历史记录 7、错题查看模块 在代码的历史文档里面里面都有记录 从功能上来讲,作为一个在线答题小程序,已经完成了,但是从运营角度讲,这远远不够,后续还要加入更多好玩的、有趣的东西才像一个拿得出手的作品 本开发目前已体验云开发的数据库、云函数对于云存储和云调用目前还没有涉及 小程序界面截图 xx [图片] [图片] [图片] [图片] [图片] [图片] [图片] [图片] [图片] 数据库设计 本设计冗余部分信息,请知悉 考试类型集合exam [图片] 科目集合subject [图片] 问题题库表question [图片] 答题历史记录集合history [图片] 错题记录集合record [图片] 代码链接 基于云开发的在线答题小程序 https://gitee.com/xiaofeiyang3369/cloudapp 自建服务器的在线答题小程序 https://gitee.com/xiaofeiyang3369/myexamapp 扫码体验 扫小程序码进行体验,左边为基于云开发的小程序,右边为基于自建服务器开发的小程序,两边UI是完全一致的。 [图片][图片] 现存问题 目前还有几个问题没有想好怎么解决 1、在错题历史记录模块,错题是被重复记录的 2、错题模块的入口页面,科目信息也是重复记录的, [图片] 3、路由整体还比较混乱,特别是在答题的过程中 ①考试页->②科目页->③模式页->④答题页->⑤结果页->⑥答案页 所以如果从中途开始回退的话,路由太深了 总结 对于个人小程序起步阶段,云开发是一个最好的尝试。
2020-06-08 - 数据量过大查询也会报错吗?
{"errCode":-602001,"errMsg":"collection.get:fail -602001 response size exceeded 1MB."} [图片]
2020-05-03 - 云开发数据库导出csv,用wps打开,中文乱码如何解决?
云开发数据库导出csv,用wps打开,中文乱码如何解决? 当然用文本文件打开是正常的,但是我要发给运营人员,他们不可能用文本文件的。 [图片]
2020-05-04 - (12)微信同声传译插件
我 微信界的同传扛把子! 识别你的语音? Of course! 我就是你的知己! 翻译你的中文? No problem! 我的英语好着呢! 听懂她的英文? So easy! 你想听我就敢译! What’s more! 我还能读给你听! 如何快速实现语音转文字、文本翻译、语音合成等等能力? 不用着急,让微信同声传译插件来帮你! 今天我们的小故事想和大家分享微信同声传译插件的故事。 1 应用场景 大家好,我叫“微信同声传译”插件,是由微信智聆语音团队、微信翻译团队与公众平台联合推出的同传开放接口,可通过语音转文字、文本翻译、语音合成接口,为开发者赋能。下面介绍我的应用场景: 场景1: 英语口语、听力双管齐下,没有外教也能学好英语! 把我放在小程序里,我既可以将口语转为文字,也可以帮助用户判断发音是否标准纯正,是最佳听众和英语学习道路上的良师益友; 场景2: 出国旅游,英语蹩脚怎么办? 这时我可以应用到翻译小程序里,说中文,译英文,再也不怕出国交流难。 场景3: 看剧时想要吐槽!可是手里有零食,打字不方便怎么办? 只要在小程序里有我,用户就可以按住按钮说话,语音转文字,帮你发送弹幕! [图片] 微信同声传译插件目前开放了以下三个接口——语音识别接口、语音合成接口、文本翻译接口。 通过这个插件,插件使用者可以轻松实现语音读取识别、文本转语音和中英文文本转换,避免这类需求的重复开发工作。 [图片] 2 如何使用插件? 插件接入流程 >>> 开发者在小程序插件中搜索“同声传译”、“语音识别”可以搜索到微信同声传译,添加使用后按使用文档接入使用,同时小程序开发者还可通过 https://github.com/Tencent/Face2FaceTranslator 查看我们开源的插件使用案例。 [图片] 1 登录小程序后台管理,进入“设置”; [图片] 2 点击第三方服务; [图片] 3 点击添加插件; [图片] 4 输入“同声传译”或者“语音识别”、“翻译”等搜索关键字搜索插件并添加,同时可以点击“查看详情”,获取插件的详细介绍、接入说明和开发文档。 [图片] 3 插件简介 1 插件名称 微信同声传译 2 插件AppID wx069ba97219f66d99 3 插件使用指南 微信同声传译插件设计之初,采用和小程序官方流式录音API、网络请求API类似的javascript调用接口,小程序开发者可以快速接入使用此插件。小程序“面对面翻译”使用了这些接口,并且已经开源 [开源地址],便于开发者快速开发。 [图片] (面对面翻译小程序) 具体使用接口可以查看微信同声传译插件使用文档。
2018-08-17 - 关于小程序恶意对抗平台规则的违规行为公告
小程序平台对开发者提交的小程序服务会进行名称、类目、代码等方面的审核,并在开发者发布小程序后,对其提供的在线服务进行持续性的监管,全流程保障用户的使用体验和权益。 平台在审核及监管过程中,如果发现小程序有违规,会反馈引导开发者进行修改,内容合规后即可正常提审及申诉解封。但近期,我们发现有部分开发者为了能够通过审核以及躲避监管,在代码审核、类目审核、线上监管等过程中通过一些方式进行了恶意对抗,包括但不限于以下行为: 1、代码审核内容绕过 小程序提交审核的版本应与小程序实际发布、上线运营的版本一致。部分开发者在代码提审环节,通过技术手段将不符合当前类目规则或违规的内容进行隐藏,使得审核侧看到的内容与小程序实际发布后的运营内容无关,以期通过代码审核。如下是代码审核内容绕过的一个例子,该小程序不具备外卖平台资质,在版本提审时展示了无关内容,但实际运营过程中提供了外卖平台服务: [图片] [图片] 提审时展示的内容 实际运营内容 2、类目审核资质造假 开发者应根据小程序的实际经营业务内容选择合适的类目并提交对应的资质许可进行类目申请。部分开发者通过伪造资质,如伪造金融资质、ICP证、食品经营许可证等,以期通过类目审核。如下是伪造ICP证的例子,经公开渠道查询确认,该公司并没有申请ICP证: [图片] 伪造ICP证 3、线上监管绕过 小程序官方投诉入口是平台用以收集用户对小程序违规内容反馈的一个途径。部分开发者在小程序上线后,通过采用虚假、仿冒官方投诉入口或在截屏时闪退等方式拦截用户投诉来躲避平台的线上监管,或在申诉解封时通过技术手段隐藏违规内容,在申诉审核通过后继续违规。如下是仿冒官方投诉页面躲避监管的例子: [图片] [图片] 虚假投诉页面 官方投诉页面 上述对抗行为属于严重违反《微信小程序平台运营规范》的恶意行为,在开发者与平台之间形成了对抗关系,并且对用户体验造成了严重的损害。平台视此类对抗行为为最恶意的失信行为,开发者一旦存在此类对抗欺骗平台及用户的行为,将对其(同主体或关联的开发者)后续的代码提审、申诉解封、帐号注册等流程带来持续的影响。请开发者及时了解和学习平台的规则,避免做出错误的判断和选择。 部分服务商为小程序开发者提供服务时,会选择低成本的开发方式(如上述恶意对抗行为),一经发现,平台会限制该等服务商的小程序注册、提审等能力,并对该等服务商已提交上线的小程序进行能力限制或下架等处罚。与此同时,我们发现有外部开发者发布小程序审核包过、加速审核等宣传广告,这其中可能存在以故意隐藏代码或内容、或伪造资质文书等方式绕过或规避平台审核监管,请开发者不要上当受骗,以免自己的小程序受到牵连处罚。最后,平台对恶意对抗行为保留法律追究权利,请各位开发者对自身的行为负责,避免触犯法律底线。 相关信息:近期,平台对存在上述对抗行为的开发者进行了起诉,经调查取证,杭州互联网法院宣判被告的行为构成不正当竞争,应承担停止侵权、消除影响、赔偿损失65万元的民事责任,具体细节可参看《判赔65万 | 首例恶意公众号/小程序不正当竞争案宣判》。
2019-08-27 - 小程序审核注意事项与部分技巧
[转载] 创建一个小程序最尴尬的场景是:好不容易开发完了,却在代码提交给官方审核时被卡住了。小程序的审核风格跟苹果的App Store很像,审核非常严格,而且时间有时快有时慢,特别是一样会有一些让人哭笑不得的拒绝理由。为了让大家摆脱这些坑,今天,程序猫就整理了10种常见的被拒理由,大家仔细阅读,避免在小程序提交审核时掉进坑里。 1、类目不完善或者是类目选择不当这是目前最普遍、也是最容易出现的坑。小程序服务类目所对应的页面中的核心内容必须与该类目一致,并且跳转不要超过2次。例如,如果你做的是,小程序里却搞起了电商。千万不能搞一些挂羊头卖狗肉的小程序,这是肯定要禁止的。建议大家提交审核前一定要仔细看区分,可以了解下竞品使用的是什么类目。 2、功能不完善/功能不完整出现这个问题,一般是审核人员不会用,误以为你的小程序没开发完整,如果你确定没问题的话可以多提交一次试试。反正程序猫遇到很多非常奇怪的现象,当一个小程序未通过审核时,程序猫没做任何改动,再次提交竟发现神奇的通过了。当然,大家不要学程序猫,如果你有的是时间,倒是可以试试。如果急着要用,那就把小程序的功能完善好再提交审核。 3、产品的某个功能有bug 如果审核人员在体验小程序时,找到了Bug,那也是不能通过审核的。审核人员还能帮忙找BUG……也真是贴心。但是能不能说清楚一点:到底BUG在哪里?! 4、小程序简介没有介绍小程序功能很多人刚开始开发的时候,随便填写了一下简介,开发结束后忘记补充完整就直接提交了。将简介补充完整,重新上传就可以了。这种低级失误还是少犯才好,来回折腾很浪费时间的。 5、含有声音视频类目,请补充对应类目音频和视频文件不好管理,容易出现风险,所以微信官方审核特别严格。一定要慎之又慎! 6、图片被压缩体验不好这是饱汉不知饿汉饥,被压缩就是体验不好吗?那不压缩用户访问速度慢,体验岂不是更不好?再说服务器资源很贵的哟! 7、不得展示和推荐第三方小程序。不能做小程序导航、小程序排行榜之类的产品或功能,真是太不合理了。其实有很多做小程序的客户都在问:我的小程序在哪展示才能获得更多流量?哪怕微信官方做一个小程序商店也好啊! 8、不能含有诱导分享的内容这一条可谓教训惨痛!此前,仅 5 小时就产生了1700万PV(访问量)的「匿名聊聊」小程序,因为涉嫌诱导分享直接被封号;随后重新上线的「走心聊聊」不到一个星期,也被封号;被称为小程序版阅后即焚的「闪照」也因诱导分享被暂停服务。 9、不能包含赌博、竞猜和抽奖等内容很好奇,无码科技发布的小程序「抽奖助手」是怎么通过审核的? 10、慎用「附近的小程序」功能「附近的小程序」是小程序最主要的流量入口之一,特别是对于线下连锁门店而言,简直是曝光神器。不过,近期「附近的小程序」审核比较严格,一个经营资质只能添加一个地点,一个地点只能展现一个小程序,并且,一个小程序最多能开启10个附近展示的地址,每个地址都需要主体、资质证件号、地址等。如果用非常规手段实现了小程序的多地分身,也有可能会被微信永久性封禁「附近的小程序」功能。比如有些商家在「附近的小程序」中设置跨区多定位,如明明是南宁的门店,却定位到广州,而且还不是旗下分店,被用户举报后,将有可能会被微信官方永久性封禁「附近的小程序」功能。
2019-08-23 - 云开发付费终于来啦!大吐槽
经过多次跳票,云开发付费终于来了, 更新到 开发工具(Nightly 1.02.1907242),在云控制台就可以看到本次控制台更新,(看不见更新的多重启几次开发工具 看下最重要的收费价格表 [图片] 更详细的计费文档等看这里 emmmmm… 果然,与半年前发的 预测云开发价格,相差不多,就是按月收费了 最主要的问题仍然存在,大吐槽 每个套餐额度间,跨度约 10倍 太过粗糙 不支持按量付费 套餐额度超出直接限制使用,不支持超出部分按量付费 按套餐定价,小程序主无法对所有套餐指标使用的淋漓尽致。 假如我仅使用云函数功能,那数据库、CDN等其实是收费又浪费的存在,并且,如云函数调用一旦稍微超过额度限制,就必须选择价格为 10倍左右的下一阶段套餐 云开发是腾讯云的产品,那我们从腾讯云官网看看,对应类似产品的定价 腾讯云 - 云函数: [图片] 腾讯云 - 云存储(每月文件预计占用 标准存储容量1.5TB,产生 CDN 回源流量500GB,读请求500万次、写请求20万次 案例): [图片] 腾讯云 - CDN: [图片] 可以看到对应云产品价格其实是并不高的,最重要的是支持按量、按带宽、按月等,灵活定制收费。 腾讯云产品集成到了小程序中,定价更高了,灵活收费模式也没有了。 这样的定价策略,云开发怎么成为小程序的基础设施。 不说了,我看知晓云开发文档去了 #2020/03/04 更新# 云开发已支持按需付费,大爱
2020-03-04 - 征文大学篇 - 云开发·后端鉴权思路分享
[图片] 使用场景介绍 微信小程序的进入形式决定了它更适合充当一种“工具”的角色,适合在用户想起它、要用它的时候主动启动。基于此想法,中大猫谱小程序主要服务于猫猫信息记录、搜索的功能,旨在帮助改善校园流浪猫的生存状况、帮助大众了解猫猫及救助知识,同时帮助动保组织管理猫猫资料、募集救助(绝育、治疗)流浪猫所需的资金,为生态环境保护献一份力。 (— 广告时间结束 —) 如我们所知,微信小程序对于所有用户来说,入口都是统一的。目前,官方还没有提供配置管理员id的操作。那么,如果要将一些管理页面整合到小程序中,鉴权操作是非常必要的。例如,在中大猫谱中,普通用户和管理员用户看到的页面元素、能进入的页面是不同的: [图片] 基于这种需求,本文将分享一种在微信·云开发环境下,实现简单、安全的后台鉴权的思路。 云函数实现 在描述方法前,我们先简单介绍一下微信·云开发的三大部件,分别是做啥用的: 云函数:后端的自定义的业务逻辑函数,自带Node.js环境。可以被小程序端调用,通常用于操作云存储和云数据库。拥有微信私有协议天然鉴权(后文重点使用)。 存储:类似云盘,存文件用的,自带CDN(流量不多)。它提供的[代码]cloud://[代码]协议文件链接可以直接用于部分小程序端tag上,比如image的src,但也就不会被缓存。 数据库:一个文档型数据库,可以被小程序端直接使用。权限设置比较迷(为了安全),大部分修改、删除操作要经过云函数来调用。 我们重点关注云函数。开通云开发后,新建一个云函数,我们会得到一个初始模板: [代码]// 云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() // 云函数入口函数 exports.main = async (event, context) => { const wxContext = cloud.getWXContext() return { event, openid: wxContext.OPENID, // 调用者的openid,与每个微信号一一对应,用于鉴权 appid: wxContext.APPID, unionid: wxContext.UNIONID, } } [代码] 其中,云函数接受两个参数,[代码]event[代码]是用户调用时提供的data(可理解为形参),[代码]context[代码]是此处调用的调用信息和运行状态。幸运的是,这两个东西我们暂时都用不到,不理解也没有关系。 我们关注函数体的第一句[代码]cloud.getWXContext()[代码],它正是前文提到的微信私有协议天然鉴权。换人话说,这个函数返回的所有资料,都是有微信背书的、可信的。那么,最简单的鉴权方式,就是把管理员的openid硬编码到云函数中,对比一下就完成了: [代码]// isManager云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() // 硬编码管理员的openid const MANAGERS = ['aaaaaaa', 'bbbbbbb', 'cccccccc']; // 云函数入口函数 exports.main = async (event, context) => { const wxContext = cloud.getWXContext(); const openid = wxContext.OPENID; // 取得当前用户openid return MANAGERS.includes(openid); // 完成鉴权 } [代码] 灵活一些 假如说我们的管理员常年不变,那上面那种鉴权方式完全够用了。但如果我们的管理员经常增删,那就利用云存储功能,建立一个[代码]manager[代码]集合(collection),把管理员的openid存放到文档中(听不明白请看下图)。那么上面硬编码的部分,就改为数据库查询: [代码]// isManager云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() // 初始化数据库链接 const db = cloud.database(); const _ = db.command; // 云函数入口函数 exports.main = async (event, context) => { const wxContext = cloud.getWXContext(); const openid = wxContext.OPENID; // 查询条件 const filter = { openid: openid }; // 等待数据库查询 const count = (await db.collection('manager').where(filter).count()).total; // 检查是不是管理员 return (count === 1); } [代码] 现在管理管理员的方式(没打错字)更灵活了,可以直接打开小程序云开发控制台来添加/删除一个管理员。 [图片] 小程序端调用 在小程序端,我们可以简单包装一个鉴权函数,用callback的方式灵活地用在各种需要鉴权的地方: [代码]function checkManager(callback) { // 这里的callback将接受一个参数res, // 为bool类型,当前用户为manager时为true, // 否则为false // 调用云函数 wx.cloud.callFunction({ name: 'isManager', // 指明云函数的名字,没有形参 }).then(res => { // res是云函数的返回值,形如: // {errMsg: "cloud.callFunction:ok", result: true, requestID: "44b0xxxx-8xxx-xxxx-xxxx-xxxx0068xxxx"} // 其中的result字段是我们所需要的鉴权结果 callback(res.result); }); } [代码] 给定不同的回调函数,就可以简单地完成各种权限控制任务。例如,在某个Page的[代码]onLoad[代码]中控制元素显示: [代码]const that = this; checkManager(res => { if (res) { that.setData({ showBtns: true }); } }) [代码] 上面的鉴权操作,对非管理员用户的影响几乎没有。假如普通用户确实“闯进”了不该进入的页面,也可以简单地在上面加个else分支显示提示。 安全性分析 有了云函数的啥啥啥背书(微信私有协议天然鉴权),我们不用担心用户伪造openid的问题。但是,如果有中间人篡改了服务器发来的消息(说的就是你Mallory),小程序端获得的鉴权结果已经被修改了,那这种鉴权也不太可靠。因此,在一些关键的操作(例如数据库修改)上,鉴权和实际操作都应该放在后端云函数中,一条龙完成。 幸运的是,我们上面实现的[代码]isManager[代码]云函数仍可发光发热,被其他云函数调用。但是,间接调用的云函数无法获取调用者的OPENID(因为调用者不是一个微信用户,而是另一个云函数),我们要对上面的[代码]isManager[代码]函数进行一点点修改: [代码]// isManager云函数入口文件 const cloud = require('wx-server-sdk') cloud.init() // 初始化数据库链接 const db = cloud.database(); const _ = db.command; // 云函数入口函数 exports.main = async (event, context) => { const wxContext = cloud.getWXContext(); const openid = wxContext.OPENID || event.openid; // !! 只修改了这里:如果不能获取openid,就从参数event里取 // 查询条件 const filter = { openid: openid }; // 等待数据库查询 const count = (await db.collection('manager').where(filter).count()).total; // 检查是不是管理员 return (count === 1); } [代码] 其中修改只有一行:[代码]const openid = wxContext.OPENID || event.openid;[代码],这意味着如果[代码]cloud.getWXContext()[代码]函数返回的结果里不包含openid,那就从调用时给的参数[代码]event[代码]里取(说明当前调用是由其他云函数发起的)。 稍做修改后,在其他云函数中,只需在函数体最前面,增加以下几行,即可完成后端的安全鉴权: [代码]////// 省略一些初始化代码 ////// // 其他需要后端验证的云函数入口 exports.main = async (event, context) => { // 获取调用者的openid const wxContext = cloud.getWXContext(); const openid = wxContext.OPENID; // 用data参数的形式,把openid传给isManager云函数 const isManager = (await cloud.callFunction({ name: 'isManager', data: { openid: openid }})); // 如果不是管理员,直接886 if (!isManager.result) { return { msg: 'not a manager', result: isManager }; } ////// 下面放这个云函数要做的业务逻辑 ////// } [代码] 小总结 本文介绍了在微信小程序云开发环境下,利用云函数中微信背书的openid进行用户鉴权的一种思路。有了管理员鉴权接口、小程序端可以控制页面元素展示、路由访问、接口调用等情况,保护数据安全。目前小程序云开发的资料较少,本文也只是一种简单鉴权的实现思路,肯定还存在许多不足,希望大家多多交流、多多指正! 广告时间 今年上半年,中山大学四校区合拍的中大猫谱小程序正式开机,我们将与你一起继续扮演云吸猫爱好者、校园猫猫摄影大师、环境保护热心人士,希望大家多多关注,多多支持! 小程序演示视频请戳:https://v.qq.com/x/page/u0882tecle7.html [图片]
2019-06-28 - 永远对微信小程序保持尊重——小程序心得体会和开发经验
开篇 我第一次接触小程序时,还清楚的记得是在2017年的春节期间。当我升级最新版的微信后,开始摸索着新的功能变化。在发现页有一个叫小程序的入口,点进去有一列的“应用”。当我打开一个叫“亲戚关系计算器”的小程序后,简单的使用,然后退出,再去寻找其他的小程序,猫眼电影,自选股,滴滴出行…… 当我尝试着去探索更多小程序的过程中,我突然发现,微信正在发展为一个超级的应用流量入口。而微信中的小程序也可以轻松的坐拥10亿的可用用户人群。 那时候过年,我做的唯一一件事情就是细细的读了小程序的开发文档,心想他可以具有多大的活力与动力,能够引发多大的改变。而我能不能适应他,去随着他的发展,带动自己的腾飞。 很遗憾,当时的小程序并不对个人开发者开放,没有办法注册一个小程序,只能在开发者工具上写一些小的应用,去熟悉小程序的开发。 3月27日,小程序重要更新,其中之一就是支持个人开发者注册小程序。那时候的我,在学校上大一,用一个运营公众号的微信号注册了第一个小程序,并做了一些实验性的开发,并上线。 从这个过程中,我开始细细的体会小程序的优势以及不足,小程序适用于那些领域,小程序适合怎么推广。小程序适合那些行业领域的应用。现在看来,其实从小程序提供的能力,就可以依稀端详出小程序所致力的场景与应用领域。 2018年1月,在我历经半年多的思考和衡量下,做出第一款真正属于自己的小程序——GS比赛计分。去尝试探索线上小程序和线下场景的交融,在这过程中有顾虑,有大胆创新,但都为我更深层次理解小程序有很大的帮助。 目前,自己已经做过10余款小程序,除了GS比赛计分开发时间很长,其他的小程序都是一个月左右的时间完工。比如2019年2月的高校课程助手;2019年3月的数据查询助手;2019年4月的数据汇总助手。 我接下来会从小程序的需求分析与应用设计,小程序的开发,小程序的运营3篇来讲述我对于微信小程序的独自见解与经验。希望能为更多的学生开发者有所启发和借鉴。 需求分析与应用设计 要清楚的认识到小程序对自己需求的最大赋能,需要从最初去理解小程序的定位,微信团队对于小程序的定义是这样的: 微信小程序是一种全新的连接用户与服务的方式,它可以在微信内被便捷地获取和传播,同时具有出色的使用体验。 通过对小程序提供能力的分析,不难看出。小程序相对于APP来说,在降低开发门槛的同时能够满足最普遍的应用需求,适合生活服务类线下商铺以及非刚需低频应用领域。使得微信通过小程序作为生态的建立者和维护者,赋能商家和应用者。以一种生态触角的状态来迅速的捕捉最大化生态红利。 当清楚的理解小程序的定位后,那么就需要合理的筛选需求并进行应用的功能设计。我将会使用【GS比赛计分】作为例子进行分析说明。 1.用实质的问题引出明确需求,并确定解决问题的功能边界 首先思考的是,自己需要做的功能都有哪些,使用人群是谁?使用场景是什么?需要数据的实时性吗? 一开始设计【GS比赛计分】的时候,目的是为了解决现在的中小型比赛使用人工计分的失效性差,出错率高,人工和时间成本昂贵的问题。程序的目的是将比赛计分的相关人员用互联网工具联系起来,以提升计分效率。 [图片] 当明晰了产品目标后,开始考虑使用人群。一般来看,大多数的比赛计分都是由两种角色构成的,一个是评委(分数确定者),另一个是工作人员(分数汇总者)。 传统的计分过程是通过现场工作人员将评委的分数以纸质的形式送达计分人员。在这一过程中就有大量的成本浪费了(一个是人力成本,另一个是时间成本)。另外,计分人员以Excel或计算器和笔记的形式进行比分汇总,在这一过程中又存在大量的成本浪费(人力成本和时间成本甚至还有错误风险)。 [图片] 所以横观所有的主观评分的线下比赛,无一例外都存在比赛结束后有长时间的节目或视频热场环节,其实这都是在为人工计分的缓慢争取时间。 所以,【GS比赛计分】的使用人群和使用场景就确定下来了,与传统人工计分的过程类似,只不过需要互联网赋能,解决时间和人力成本。需要数据的实时交互。 【GS比赛计分】作为解决现象问题的工具,首先需要做的就是不要违背现象中事件的发生次序。所以功能完全参照比赛计分过程来设计。具体功能如下,提交成绩,撤回成绩,弃权处理,实时的选手分数,实时的选手名次,清楚评委数据,解绑评委,重启比赛,结束比赛,比赛内置会话。 2.对程序平台进行横向比对,明确小程序的优势和劣势 当程序的功能确定好后,不要着急着手界面设计,功能模块的组合,交互设计这些过程。当你在进行这些过程之前,需要认真的去考虑你的应用是不是适合在小程序上开发。 小程序的火爆,注定有许多人盲目的进入这一领域,但不是所有的应用都适合小程序的推广模式,也不是所有应用都能吃得起小程序的运行效率的。所以在确定开发小程序之前,正确的认识的合适与不合适,避免让自己的成本白白的付出。 如何确定适不适合用小程序来做呢?我们可以让小程序作为一个互联网平台,把应用带入到互联网的每一个平台中去,进行横向的对比,去找出各自的优点与不足,当做出客观的判断后,应用在小程序上相比于其他平台有没有优势就很明显了。 还是以【GS比赛计分】举例。我所横向对比平台包括PC、原生APP、Web平台、轻应用、小程序。首先从满足功能来说,比赛计分需要很稳定的实时性,所以我将Web平台排除(因为复杂的比赛环境,不同的设备浏览器难免会有问题)。 然后将剩下的平台做分析。PC平台使用可能性太小(原因:比赛现场成本太高昂,租借笔记本可能都不是现实的);原生APP不适合(原因:评委评分前需要下载APP,比赛结束后没什么用了,需要把这个APP卸载。而且IOS和安卓两大平台增加了研发成本);轻应用有阻碍(原因:百度轻应用由于装机量小,覆盖人群不多。支付宝小程序没有社交关系链,无法有效的推送给需要的人。产业联盟轻应用,苹果用户怎么考虑?) [图片] 经过一系列的对比,很明显。对于【GS比赛计分】来讲,微信小程序是最好的应用平台。同时微信小程序仍然可以和不同的平台进行联系,所以可扩展性,功能延展性都是最佳的。 3.应用设计要满足即用即走的理念 当确定小程序是最理想的应用平台时,我们需要对小程序进行便利化的设计。这就需要抛弃一部分原生应用开发或Web开发的一些设计理念。追求“极致、简约”的风格设计。 在【GS比赛计分】的详细设计时,我考虑到,以个人账户的形式去下发比赛的流程是行不通的,既然服务于比赛,那么就以比赛为最基本的账户组成单元,明确一个比赛ID。而同一个比赛的不同角色,以不同的IK进行区别,而角色的设置包含在比赛设计中,由比赛创建者在创建比赛时自行创建。 那么小程序的使用场景就出来了。以比赛现场的告知或者微信聊天的分享,告知比赛参与角色其ID和IK,就可以让角色快速的进入绑定角色并使用程序。免去注册的一系列烦恼。 同时在微信用户面前,这个账户体系是平权的,任何用户在得知ID和IK的情况下都可以进入(账户绑定情况下不可以进入),一定程度上免除密码和忘记密码,注销账户这一系列的麻烦。 当完成比赛后,程序已经完成了自己所有的任务时,使用者可以直接退出程序,不需要注销比赛等操作。真正做到即走。 在使用过程中,要清楚的考虑用户的使用过程,从而做一些保险机制。微信小程序运行在微信上,微信是社交工具,就免不了用户会退出小程序甚至微信去做一些其他的事情。所以【GS比赛计分】在设计时要保证用户回来要用到自己想要的,在程序设计中有中间状态界面能够保证用户可以迅速进入使用状态。 4.对于很大的系统,要把最适合小程序部分拿出来,而不是全部 现在的【GS比赛计分】其实是一个大的生态系统,结合有线下的网络接口,展示接口,线上小程序,web平台。每一个部分都承载着自己独特的应用价值。 比如Web平台就承载比赛管理的任务,创建比赛,上传比赛文件,选手图片,设置选手(名称、介绍、手机号、图片、出场顺序),设置评分项(名称、权值、预置分数),设置评委(名称、权值,IK)。从实际的分析来看,比赛管理最适合在PC端进行,不管是文件还是图片,公认都是PC上传比较容易。 在最初设计的时候,我错误的把系统分成了多个小程序进行系统搭建,在实际使用过程中造成了重大的缺陷和用户流失。最大的表现是,我开发了【GS比赛创建】小程序,作为比赛的入口程序。从而造成比赛数量增速缓慢,大的使用场景无法突破,老用户意见上升等一系列问题。不得不注销了【GS比赛创建】小程序,并进行很大的架构调整。【GS比赛计分】暂停使用,造成大量的用户流失。 [图片] 所以,当设计多场景,前后联动性很强的应用时,需要将功能进行使用划分,每一个划分需要找最适合的平台。最适合小程序的部分,就做好与其他平台的无缝结合。 5.小程序的应用场景和机会 目前来看,小程序的应用场景主要包括支付场景,比如扫码支付、快消餐饮、移动购物、交通出行等等,工具类小程序能更碎片化、垂直化地满足细分的应用场景需求。 根据微信的最近更新变化来看,公众号和小程序的协同作用将越发明显,公众号的作用也将进一步放大,因此未来发展的机会可能在这几方面。 内容营销,小程序能通过更完善更精准的服务进而提高用户黏性。具体来看包括各大知识付费的小程序以及在教育风口上的小程序。当然,这些小程序也可同时开发APP(按微信对小程序的开发步骤来看)从而实现用户沉淀。 具有支付场景的各类商家。包括传统的已有一定客户群的商家提供更方便的服务或者实现线上线下联动以及新零售。 工具类小程序。包括共享经济领域,这类小程序即用即走,轻量化,便捷化。 天生具有社交属性的小程序。比如抽奖、互赠礼品、拼团减价、社交性的小游戏以及帮拿快递等。 小程序的开发经验 1. 微信小程序开发文档是最好的学习文档 很多同学喜欢看视频教程,或者买一本小程序开发书来学习。觉得这么学会加深理解更加容易上手,而官方文档干巴巴不好学。现在的微信小程序能力更新速度很快,当一个教程或书出来的时候,其实已经过时了。建议同学去微信公开课中学习微信小程序的入门教程,开发入门后,根据自己的开发需要,自行阅读官方文档来学习。 [图片] 2. 必须了解小程序的运行原理 微信小程序是运行在微信中的,所以运行速度并不能和原生媲美。但是在开发小程序的过程中,可以用良好的编程思路来追求程序的高效运行水平。但前提是,你需要对小程序的运行环境有所理解,需要知道在开发环境和真实环境(IOS和Android)下的运行差别。大部分的开发坑都是因为不同运行环境造成的。 官方的声明:微信小程序运行在三端:iOS、Android 和 用于调试的开发者工具;在 iOS 上,小程序的 javascript代码是运行在JavaScriptCore中;在Android上,小程序的javascript代码是通过 X5 内核来解析;在开发工具上,小程序的javascript代码是运行在nwjs(chrome内核)中。 微信小程序的运行环境类似 ReactNative ,而不是纯 Html5。两者最大的不同在于,ReactNative 的界面是由原生控件渲染出来的,而 Html5 的界面是由浏览器内核渲染出来的。两者在性能上有较大的差异,从而表现出来微信小程序要比h5页面好很多。 3.安利小程序云开发 云开发为开发者提供完整的云端支持,弱化后端和运维概念,无需搭建服务器,使用平台提供的 API 进行核心业务开发,即可实现快速上线和迭代,同时这一能力,同开发者已经使用的云服务相互兼容,并不互斥。目前提供三大基础能力支持: 云函数:在云端运行的代码,微信私有协议天然鉴权,开发者只需编写自身业务逻辑代码 数据库:一个既可在小程序前端操作,也能在云函数中读写的 JSON 数据库 存储:在小程序前端直接上传/下载云端文件,在云开发控制台可视化管理 云开发使得小程序开发门槛进一步降低,甚至偏前端的开发人员也可以独立开发小程序了。另外,云开发中云函数支持去请求第三方服务接口。所以云开发最大程度上提供了小程序所需基本API的构建,另外可以通过第三方服务请求能力扩展API能力。 [图片] 而且云开发的数据库和存储完全可以与云函数构建一个小型的后端平台。并发能力中等,适合大部分的小程序业务API的构建。 4. 养成良好的小程序代码习惯 微信小程序的代码文件分为4种,WXML、WXSS、JS、JSON。 JSON文件是小程序的配置文件,APP.JSON是小程序全局配置,另外每个页面也会有配置文件。建议页面中的JSON文件只填写页面需要配置的(比如页面标题),而不变化的不要写到里面(比如标题风格,背景颜色等等)。 JS主要是javascript语法,建议以模块的形式对通用的方法进行封装,尽可能的利用好代码,不要有大量重复的方法语句。如果多个页面需要,可以单独建立js文件,在需要的页面进行引入。 WXSS是样式文件,遵从css的编写规则,尽可能的少些样式表,多多利用已经写过的样式,如果多个页面需要,可以单独建立wxss或者写到app.wxss中 WXML是页面结构文件。如果多个页面中有相同的结构,可以单独封装为模块,而模块中的逻辑方面也尽可能遵从代码最大效益化。 总之,开发代码简洁,会使得编译后的小程序包很小,使加载速度更加快速。 5. 小程序填坑总结: 首先,微信开发者社区是好的小程序开发交流平台,从中可以获得大多数问题的解决方法: https://developers.weixin.qq.com/community/develop/question 另外,许多人常用搜索引擎来直接搜索问题的解决方法,一般大部分的错误或者问题都会在开发文档上写的很清楚,只不过很少有人去注意到,推荐几个小程序填坑的集合文章: https://blog.csdn.net/weixin_42448956/article/details/82414225 https://www.cnblogs.com/shaoting/p/6051261.html https://www.imooc.com/article/36148 https://www.cnblogs.com/wangking/p/6946438.html https://www.jianshu.com/p/4362e52f5c49 小程序的运营 小程序运营属于软件产品运营的一种类别。从产品生命期来看,小程序运营分别为研发期、种子期、成长期、成熟期、衰退期。另外由于小程序在运行模式和定位的不同,表现在推广形式上与平常的软件产品有很大的差别。接下来,我会用【GS比赛计分】【数据查询助手】小程序为例子佐证分享小程序的运营经验。 1. 小程序研发期,搞清楚产品的定位以及目标用户 当你不是运营小程序的产品策划者,你需要首先要搞清楚产品的定位以及目标用户。(这也是多数互联网公司将产品策划和运营作为一个岗位的原因)。在整个产品的研发期,需要跟进产品的每一个细微功能点,要明晰产品的使用用户;还要时刻去观察产品的领域有没有竞品的出现,用户习惯有什么改变;要时刻去衡量产品的竞争优势,为之后的发布运营做好准备。 【数据查询助手】是提供自定义信息查询服务的小程序。任何微信用户均可以上传自定义的数据(报表,成绩单等任何表格数据)建立查询。 [图片] 当在产品研发的一个月,我不断的探索小程序领域,APP领域,Web领域有没有相同的功能产品或服务。甚至将问卷系统(腾讯问卷、问卷星、问卷网)作为潜在的竞争对手。 另外我还制作了web版和原生APP的Demo去体验他们与小程序体验的不同。去确定微信小程序是很好的适应平台。从而为之后的运营做足了准备,提升了自己的信心。 2. 小程序种子期,要充分利用体验版过程 小程序体验版相当于其他应用平台的内测版。体验版可以更高层次的模仿真实的用户环境。在这一阶段更容易发现用户间连接要求高的应用缺陷。同时可以在安全的范围内去聆听用户的真是使用反馈。 【GS比赛计分】开展了长达1个月的体验版。邀请了20个核心用户去体验。由于应用需要与服务端建立实时连接。用户不同的设备,不同网络环境对程序的稳定性做出了很大的考验。在这一阶段修复了不少场景不同导致的错误或者效率低下问题。 另外一开始推出的小程序界面设计只遵从了功能设计,没有很好的考虑真实的使用场景。所以在这一阶段,我最大程度上听取体验用户的建议,对整个界面进行改版,使交互更加的亲近用户。 3. 小程序成长期,明晰获取用户的手段和推广手段,最大化的成长: 当小程序功能稳定后,到了成长阶段,用户使用是最核心的任务。获取用户的时候,必须先让对方了解自己的产品,建立认知,将产品介绍给用户,让用户进入小程序之后,想方设法让产品与用户产生交互,让用户不断体验产品,让活动始终覆盖用户,让用户对产品认可,要完成产品与用户的关系构建。 从现在许多小程序的运营手段来看,基本上都围绕着社交裂变和线下推广的方式来提升小程序的获客表现。而小程序由于较低的开发成本,较快的更新速度,以及较低的试错成本,使得多数很强势的小程序都采用功能矩阵发展模式,快速实现功能及迭代。 小程序获取用户的手段主要由下: 朋友圈分享(包括图片二维码、广告直接进入); 聊天好友推荐转发; 线下二维码(包含商家推广、广告推广); 微信搜索(一般由其他社交平台或者用户需求引起); 线上识别二维码(线上推广,文章推广,或其他社交平台的推广); 其他小程序的跳转(互相推荐) 公众号跳转(公众号运营推广) APP跳转(一般是APP延展的简洁功能推广,或者轻量级触达用户形式的推广) 小程序发掘社交推广的手段主要由下: 社交立减金,实现社交裂变; 社交比拼玩法,引导社交裂变; 互动加入分享按钮,提醒用户转发; 设计同伴环境,鼓励社群传播; 设计任务玩法,领取奖励; 设计福利,鼓励好友助力; 聚焦核心功能,促进口碑传播; 【数据查询助手】从产品定位上就自带社交裂变的元素,当查询创建者创建了一个查询后,他可以根据要分享的人群情况选择多种分享方法。如果是企业微信或者微信工作群,那么可以直接分享小程序到聊天窗口。其他的用户可以直接进入小程序进行查询。如果是线下的查询(推广会,现场发布等),可以通过小程序二维码的方式进入查询界面查询。对于其他社交平台来讲,可以用二维码来做分享,如果是常用用户(添加到我饿小程序或者桌面作为常用工具的用户),可以直接通过复制文字(含查询码)然后进入应用的方式快速开始查询。 同时每一个查询者,都可能是潜在的查询创建者和程序推广者。所以要在这一阶段不断的优化体验流程,尽可能做更多事情覆盖多场景的查询(比如微信搜一搜直接搜索查询码,直接查询),去吸引用户,留住用户。 由于小程序用完即走的理念,导致许多工具类小程序(不含深度融合线下和社交的)用户的留存普遍较低。既然工具类就是服务用户,那么就把小程序慢慢的做成一种用户习惯,从习惯的养成变为行业应用的转化。从转化中寻找切入点,进而挖掘可以创造价值的功能产品。 所以,做小程序不要过分贪图大规模的使用率,大批量的用户。他本身是一种服务理念的触达和养成,你需要在用户心里养成使用习惯,而不要上来糖衣炮弹把用户打蒙,甚至反感。这样小程序的生态就被搞乱了。 4. 小程序成熟期,稳定期最重要的就是小版本的迭代更新: 刚才讲到,小程序有较低的开发成本,较快的更新速度,以及较低的试错成本。所以在小程序成熟期需要根据用户数据不断的去更正调整功能,去保持较高的运营分数。在产品功能中,适时的进行用户付费转化。 付费转化一方面可以拉开用户层次,对小程序的用户是一种活水作用,提升用户的使用粘性,容易过滤最核心的用户,提供更加好的产品服务。如果在成长期很好的进行用户习惯的养成,这个过程会更加自然。反之,应用将会更快的进入衰退期。 付费转化的方式主要由几类: 电商类:主要靠活动、优惠刺激(现实抢购、秒杀、预约、限时满减、显示商品库存和抢购人数); 游戏类:游戏道具(向朋友求助、每日签到、社区活动等方式免费获得,但数量有限,且都是一些级别较低的道具)高价值道具付费、皮肤售卖、游戏币购买; 内容类:付费文章、阅读币购买、付费课程; 5.小程序衰退期:适时舍弃,进行新产品开始推出 小程序开发周期短,很多时候应用分析不够透彻,更多的是一些商业或推广试错。导致许多小程序还没有进入成长期就进入晚期了。这一类小程序直接舍弃就好,不需要什么转化了,这也不算小程序的衰退期(没有盛何来衰)。 对于经历过成熟期的产品主要有几个原因导致进入衰退期: 市场中有新的创新型产品,导致冲击衰退。 自身功能设计有缺陷,导致用户流失。 对用户了解不透彻,付费转化失败,用户迁移到同类产品。 产品质量下降,不能适应用户行为的变化。 由于运营组织的原因,产品运营出现危机。 在这一阶段,运营已经无能为力。那么就进行产品的复盘,积极的去投入到新产品或者新领域的探究上面去。小程序的开发成本较低,所以可以有很多机会去重新塑造一个好的产品。 6.总结,谈谈自己的想法: 现在多种多样的互联网产品不断产生,产品竞争异常激烈。互联网产品的运营手段也是推陈出新,花样繁多。在这里我不给大家分享一些运营花样,因为每个小程序都是独特的,应该有自己独特的运营手段,具体是什么,希望产品者和运营者本身用热爱小程序的心去发现和实践。 永远保持对产品的尊重,对用户的尊敬是每个产品人最重要的事情。如果对应用足够热爱,你会厌恶他被污染,他被别人嫌弃;你会尽自己的可能让他变得更加本真,你会合理的去运营突破,去帮助产品走向更高的位置。 如果你没有爱你的产品,再出色的产品也只是昙花一现而已,并不能给你带来任何长远的意义。 这是最好的小程序运营指南:https://developers.weixin.qq.com/miniprogram/product。 [图片]
2019-06-23