过年这几天写了一个小程序,练手云开发,因为之前用过几次Node.js想到云开发也支持,就试试了,反正微信免费的额度也够了。
涉及的内容
注意几个坑啊:云函数配置文件加上权限列表,订阅消息和模板消息不一样。
- 云函数
- 云数据库
- 定时任务
- 订阅消息
小程序简介:
我这里小程序后端是Node.js写的爬虫(用的云开发)
提供brainyquote每日的英文推荐,支持搜索,订阅每日推送。
开始
前端
小程序:UI看图就好了。
订阅页面
云函数:
开始引入云函数:首先建立一个文件夹用来放云函数(其实就是一个云端的Node.js函数)。
我的是 fcs 然后你需要在项目配置文件里加上这个目录:
然后fcs就有了云的图标。
右键就可以新建云函数。
看一个最基本的云函数,也会用到,获取用户的openid
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
// 云函数入口函数
exports.main = async (event, context) => {
//云函数自带openid参数,你可以直接用
const wxContext = cloud.getWXContext()
return {
event,
openid: wxContext.OPENID,
appid: wxContext.APPID,
unionid: wxContext.UNIONID,
}
}
右键上传部署云端。
我们在小程序端调用一下看看。
wx.cloud.callFunction({
name: "quote-openid"
}).then((res) => {
console.log('openid')
console.log(res.result);
this.setData({
userInfo: res.result
})
}).catch((error) => {
wx.showToast({
title: 'load Failed',
})
})
可以看到是一个Promise的函数。用的wx.cloud.callFunction()来调用我们的云函数,这里注意你的云环境要提前初始化,我在app.js初始化的:wx.cloud.init()
如果你想给云函数加参数:xxcallFunction({data:{xxxx}}),云函数里面用event.xx来使用。
我们的数据都是通过云函数提供的,其实就是几个node.js爬虫,用的requests和cheerio模块。写完云函数,可以本地部署测试一下。
这里不说node了,可以去看一下文档,有js基础,很容易。
现在拿到数据,小程序基本可以用了,但是,我们要做的个性化啊,比如搜索:用到了云函数加参数,上面说了。
更进一步,我们加个订阅消息,每天给用户推送一句英文语录。
先去小程序后台添加一个消息模板,拿到模板ID后。
requestSubscribeMessage
申请订阅消息,我写到工具模块了,可以直接用。
const order = function(db,openid){
wx.requestSubscribeMessage({
tmplIds: ['模板ID'],
success(res) {
// console.log(res);
if (res['模板ID'] === 'accept') {
//先检查有没有订阅过
//更新
console.log('开始更新订阅记录')
//这里有一个云函数sub是用来添加订阅记录放到数据库的,因为安全性,只能在后端处理数据库更新
wx.cloud.callFunction({
name: "quote-sub"
}).then((res) => {
if (res.result.errMsg === 'collection.update:ok'){
console.log('更新订阅记录ok')
wx.showToast({
title: '订阅成功',
});
}else{
console.log('订阅成功,记录更新错误!')
console.log(res);
}
}).catch((error) => {
console.log('更新订阅记录失败')
wx.showToast({
title: 'load Failed',
})
})
} else {
//未订阅过
console.log('未订阅过')
db.collection('users').add({
data: {
order: 1
}
}).then((res) => {
console.log(res)
})
}
}
})
} else {
wx.showToast({
title: '订阅失败',
})
}
},
fail(res) {
console.log(res)
wx.showToast({
title: '订阅失败',
})
}
})
};
module.exports = {
order:order
}
看看sub函数如何操作数据库的。
// 云函数入口文件
const cloud = require('wx-server-sdk')
cloud.init()
//初始化数据库,这里和小程序端区别是有权限更新,编辑,添加
const db = cloud.database()
// 云函数入口函数
exports.main = async (event, context) => {
const wxContext = cloud.getWXContext()
//这是SDK提供的工具函数,类似于mysql的函数
const _ = db.command
let status = await db.collection('users').where({ _openid: wxContext.OPENID }).update({
data: {
//给订阅记录加一
order: _.inc(1)
}
})
//返回订阅结果
return status
}
订阅完成后,处理定时任务推送:要使用定时任务,需要在这个云函数的文件里加一个config.json的文件,填写一下配置,注意不可以有注释,不然提醒你部署触发器一直失败!
Cron语法,可以百度,微信官方也有说明,秒 分 时 xxx等 * 代表每
{
"permissions": {
"openapi": [
"subscribeMessage.send"
]
},
"triggers": [
{
"name": "order",
"type": "timer",
"config" : "0 30 08 * * * *"
}
]
}
添加一个新的云函数,调用订阅消息接口,这里是官方示例,注意模板字段格式!
const cloud = require('wx-server-sdk')
cloud.init()
exports.main = async (event, context) => {
try {
const result = await cloud.openapi.subscribeMessage.send({
touser: 'OPENID',
page: 'index',
data: {
number01: {
value: '339208499'
},
date01: {
value: '2015年01月05日'
},
site01: {
value: 'TIT创意园'
},
site02: {
value: '广州市新港中路397号'
}
},
templateId: 'TEMPLATE_ID'
})
console.log(result)
return result
} catch (err) {
console.log(err)
return err
}
}
我们要做的就是定时,循环给订阅的用户推送最新的英文语录,并且,记录减去1. 这里用到了云函数调用其它云函数,比如我们先拿到订阅用户列表,这里和小程序端是一样的用法。
let users = (await cloud.callFunction({
name: 'quote-users'
})).result;
然后遍推送:
for(let i of users){
console.log(i);
//推送
cloud.openapi.subscribeMessage.send({
xxxxxx
完成后,右键云函数:部署云端,部署触发器。
如果觉得没底,可以把cron改成5s的,先测试一下,或者手动触发调试。
—由于过年了,小程序还没审核完成,想体验一下的小伙伴,可以回复公众号:秋果科技工作室:quote 申请体验。
已经上线:微信搜索小程序:brainyquoteLite即可。
云开发后台