- 小程序相同name属性的input输入框怎么取值呢?
类似php页面很多个<input name="user_name[]">,获取到一个user_name的数组
2017-05-08 - 实战分享: 小程序云开发玩转订阅消息(二)
[图片]这是实战分享: 小程序云开发玩转订阅消息的第二部分 第一部分链接 《实战分享: 小程序云开发玩转订阅消息(一)》 将订阅消息存入云开发数据库接下来我们创建一个云函数 [代码]subscribe[代码] ,这个云函数的作用是将用户的订阅信息存入云开发数据库的集合 [代码]messages[代码] 中,等待将来需要通知用户时进行调用。 在微信开发者工具的云开发面板中创建数据库集合 [代码]messages[代码] [图片]微信开发者工具新增数据库集合 创建一个 [代码]subscribe[代码] 云函数,在云函数中我们将小程序端发送过来的课程订阅信息,存储在云开发数据库集合中,开发完成后,在微信开发者工具中右键上传并部署云函数。 cloudfunctions/subscribe/index.js [代码]const cloud = require('wx-server-sdk'); cloud.init(); const db = cloud.database(); exports.main = async (event, context) => { try { const {OPENID} = cloud.getWXContext(); // 在云开发数据库中存储用户订阅的课程 const result = await db.collection('messages').add({ data: { touser: OPENID, // 订阅者的openid page: 'index', // 订阅消息卡片点击后会打开小程序的哪个页面 data: event.data, // 订阅消息的数据 templateId: event.templateId, // 订阅消息模板ID done: false, // 消息发送状态设置为 false }, }); return result; } catch (err) { console.log(err); return err; } }; [代码]利用定时触发器来定期发送订阅消息接下来我们需要实现一个定时执行的云函数[代码]send[代码],来检查数据库中是否有需要发送给用户的订阅消息。如果有需要发送的订阅消息,会通过云调用 [代码]cloud.openapi.subscribeMessage.send[代码] 将订阅消息发送给用户。 创建一个名叫 [代码]send[代码] 的云函数,首先要配置云函数,在 [代码]config.json[代码] 的 [代码]permissions[代码] 中新增 [代码]subscribeMessage.send[代码]的云调用权限,然后新增一个 [代码]sendMessagerTimer[代码] 的定时触发器,定时触发器的语法和 [代码]linux[代码] 的 [代码]crontab[代码] 类似,比如,我们配置的 [代码]"0 * * * * * *"[代码] 代表每分钟执行一次云函数。 cloudfunctions/send/config.json [代码]{ "permissions": { "openapi": ["subscribeMessage.send"] }, "triggers": [ { "name": "sendMessagerTimer", "type": "timer", "config": "0 * * * * * *" } ] } [代码]接下来是实现发送订阅消息的云函数,这个云函数会从云开发数据库集合[代码]messages[代码]中查询等待发送的消息列表,检查数据库中是否有需要发送给用户的订阅消息,发送条件可以根据自己的业务实现,比如开课提醒可以根据课程开课日期来检查是否需要发送订阅消息,在我们下面的代码示例里做了简化,筛选条件只检查了状态为未发送。 查询到待发送的消息列表之后,我们会循环消息列表,依次发送每条订阅消息,发送成功后将数据库中消息的状态改为已发送。 cloudfunctions/send/index.js [代码]const cloud = require('wx-server-sdk'); exports.main = async (event, context) => { cloud.init(); const db = cloud.database(); try { // 从云开发数据库中查询等待发送的消息列表 const messages = await db .collection('messages') // 查询条件这里做了简化,只查找了状态为未发送的消息 // 在真正的生产环境,可以根据开课日期等条件筛选应该发送哪些消息 .where({ done: false, }) .get(); // 循环消息列表 const sendPromises = messages.data.map(async message => { try { // 发送订阅消息 await cloud.openapi.subscribeMessage.send({ touser: message.touser, page: message.page, data: message.data, templateId: message.templateId, }); // 发送成功后将消息的状态改为已发送 return db .collection('messages') .doc(message._id) .update({ data: { done: true, }, }); } catch (e) { return e; } }); return Promise.all(sendPromises); } catch (err) { console.log(err); return err; } }; [代码]最终效果 [图片]开课提醒订阅消息截图 源代码https://github.com/binggg/tcb-subscribe-demo[3] 参考资料 [1]注册小程序帐号: https://tencentcloudbase.github.io/2019-09-03-wx-dev-guide-register/ [2]开通云开发服务: https://tencentcloudbase.github.io/2019-09-03-wx-dev-guide-service/ [3]https://github.com/binggg/tcb-subscribe-demo: https://github.com/binggg/tcb-subscribe-demo
2019-10-23 - 从文档出发,来聊一聊小程序的服务端开发
前面两篇内容分别介绍了云函数的开发与测试。原本这篇文章想介绍云数据库的开发,然而发现云数据库的开发,并没有什么特别的内容,大抵就是学会几个 API 的使用,看看文档就行了。 说到云开发的文档,就想再叨叨几句,其实文档写得很不错了,但是对于没有全栈开发经验的新手来说,还是难免有点迷糊。例如下图,其实是同一个东西,整出三份文档,而且很多内容都是重复的。 [图片] 这只是文档呈现的问题,并不是文档本身的问题,反而,我觉得这样的呈现方式挺好。分门别类,你是哪种开发场景,直接进入对应的文档目录查看就行了,其他两份根本就不用看。 关键是,很多初学者,并不知道自己是哪种开发场景。这篇文章就来介绍一下这三类文档的差别。(嗯,有点意思,介绍文档的文档) 小程序端 API 文档 小程序端,顾名思义,就是在小程序端调用,准确的说,是在小程序页面的逻辑层中调用。注意:虽然云函数目录似乎和小程序的目录在一块,但一定要区别对待。其实,我更喜欢下面这样的目录结构。(原谅我一开始没有讲,循序渐进比较好) [图片] 云函数一个单独目录,小程序一个单独目录,通过 [代码]project.config.json[代码] 文件关联起来,关联的两个设置项如下: [代码]"miniprogramRoot": "miniprogram/", "cloudfunctionRoot": "cloudfunctions/", [代码] 如果你是在小程序的逻辑层(也就是每个页面的 js 文件)中调用,就看「小程序端 API 文档」,在使用 API 之前,需要进行初始化,放在小程序的启动事件函数 [代码]onLanuch[代码] 中就行了,示例代码如下: [代码]wx.cloud.init({ env: 'test-x1dzi' }) [代码] 其他,就是调用云函数,调用存储,调用数据库,参照文档学会 API 的使用就可以了。 服务端 API 文档 服务端,顾名思义就是在服务端调用,这里其实指的就是在云函数中调用。 在云函数中调用,需要借助 [代码]wx-server-sdk[代码] npm 包,毕竟云函数也是运行在**非小程序官方(腾讯云)**的第三方 Node 服务下,它初始化的方式有一些不同,至少要引入 [代码]wx-server-sdk[代码],示例代码如下: [代码]const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event) => { const { ENV, OPENID, APPID } = cloud.getWXContext() // 更新默认配置,将默认访问环境设为当前云函数所在环境 cloud.updateConfig({ env: ENV }) // ... return { ENV, OPENID, APPID, } } [代码] 从这段代码,可以看出它有一些天然的优势,也就是小程序官方宣称的那样: 开发者可以在云函数内使用 wx-server-sdk 提供的 getWXContext 方法获取到每次调用的上下文(appid、openid 等),无需维护复杂的鉴权机制,即可获取天然可信任的用户登录态(openid)。 除了这个,从文档中看出,还有一些特殊的开放能力,例如:[代码]getVoIPSign[代码] 获取实时语音签名。 HTTP API 文档 HTTP API,顾名思义是使用 HTTP 来调用。换句话说,就是第三方服务通过 https 请求的方式调用。 这块的 API 应该都是早期 H5 产品使用的,那会还没有小程序。每一个 API 就是一个 https 协议的 URL,例如云函数的调用: [代码]POST https://api.weixin.qq.com/tcb/invokecloudfunction?access_token=ACCESS_TOKEN&env=ENV&name=FUNCTION_NAME [代码] 通过 POST 方法,请求后面的 URL 就可以了。这种方式都要首先获取授权,也就是 [代码]access_token[代码],这个相对云函数来说,确实要麻烦不少。现在做小程序的开发,应该很少使用这种调用方式了。 还有另外一种情况,假如我的小程序配合有一个后台管理系统,而这个后台管理系统是使用 Java 语言开发的,那么,就需要使用「HTTP API」了。例如,提供商城小程序的有赞,以及知识付费小程序的小鹅通,它们在给商家提供小程序,都会配有后台管理系统,其后台管理系统的开发,就避免不了要使用这种调用方式。 对于小团队或是个人开发者,直接使用云函数开发就可以了,「HTTP API 文档」可以忽略不看。 总结 讲了这么多,应该大概知道,云开发文档为什么要整成三份了吧。如果我再把文档目录这样给你对比一下,是不是更加清晰了呢? [图片] 可以看出,「服务端 API 文档」多出来的部分,就是它的独特优势。看到这里,你大概知道自己是哪种开发场景了,知道去哪个部分查看文档了。 问题来了:开发过程中,你会发现,很多功能的实现,即可以在小程序端调用,又可以在云函数中调用,到底该怎么选择? 嗯,这是个问题。我的建议是:尽量在小程序端调用。如何尽量?具体问题具体分析;为什么?因为毕竟少一次调用就能获得结果,谁又愿意整到云函数上呢。 更多文章:https://github.com/pengloo53/miniprogram-articles
2019-09-13 - 【项目备注】的妙用
项目备注是什么? 在使用 微信开发者工具 上传体验版的时候,会有一个项目备注的条目,如图: [图片] 现在就来简单说说【项目备注】的一些基础用法吧(采取QA形式) Q:我的小程序/小游戏需要账号登录才能使用,但是小程序提审没有输入测试账号和密码的地方,怎么办? A:可以在醒目备注里面把测试账号和密码写上去,这样审核人员就能看到啦 Q:我的小程序被驳回,说不能完整体验所有功能,我小程序是内部使用的,需要登录才行,不登录当然不能体验啦。 A:可以给审核人员一个测试账号进行测试,同上。 Q:我小程序是内部使用的,必须授权才能使用,但是一直被驳回说登录流程不规范。 A:可以在项目备注里面写明该小程序的应用场景,供审核人员进行判断。 Q:小程序被驳回,说需要XX资质,但是我们这里XX部门说不需要这个资质,也没用这个资质了,该怎么办? A:可以在项目备注里面写明该资质无需提供,最好再带上你所联系的XX部门相关人员的单位、姓名以及联系方式,以便审核人员核实。 tips: 可以把本次的更新内容写到项目备注,也许能加快审核也说不定呢~ 目前暂时就想到这些,以后有想到啥就回来补充,也欢迎各位大佬在评论区留言,然后我编辑到文章中来~
2019-09-18