在实际开发过程中,许多需求需要定时发送模板消息通知用户比如说给发起助力3小时未完成用户发送消息,传统开发通过自己发的服务器定时函数很容易就可以实现。但是小程序云开发定时函数不支持云调用,所以通过云开发实现定时发送模板消息也就无法实现。最初想的一个方案是:发送模板消息仍然通过自己的服务器发送。但是这样一来仍然会用到自己的服务器,服务器的部署维护仍需要自己来处理,这样就跟云开发提出的观念背道而驰了。于是想有没有一种方案完全脱离自己的服务器,就像云开发提出的口号让开发者只需要关注代码的逻辑。之前看了一篇文章《云开发如何对外提供URL》不少涉及到支付、订单等异步操作的场景,会需要提供一个回调 URL,以确保在用户完成自己的支付过程后,由支付服务器对回调的 URL 发起请求,确认调用成功。因此,不少用户在使用时提出了自己的疑问,应该如何实现这样的功能?
由于目前云开发云函数尚不支持云调用,所以我们需要借助腾讯云提供的云函数和 定时器,来实现类似的功能。
流程如下:
具体实现
1. 创建云函数
访问 https://console.cloud.tencent.com/ ,使用你的腾讯云账号登陆,在顶部菜单栏中找到「云产品」— 「Serverless」—「云函数」
在云函数中,选择「函数服务」,并在函数服务页面点击「新建」
创建一个新的云函数,其中函数名称根据你的需要填写
运行环境选择 Node.js 8.9,创建方式选择空白函数,完成后点击下一步。
在下一页不需要做修改,直接点击完成。
2. 创建 API 网关调用
在创建完成云函数以后,我们会进入到这样的界面,在这个界面中选择「触发方式」
在触发方式页面新增一个触发方式,使用 「定时触发」,定时任务名字「任意」,触发周期「根据需求设置」,传入参数「可根据需求选择」。
填写完成后,点击保存
3,编写小程序云函数
js代码
// 云函数入口文件 const cloud = require( 'wx-server-sdk' ) cloud.init() // 云函数入口函数 exports.main = async(event, context) => { const wxContext = cloud.getWXContext() const sendresult = await sendMsg() return sendresult } async function sendMsg() { return await cloud.openapi.templateMessage.send({ touser: "otgvn5YlKfigH0T6pNowJXVmElUk" , page: 'pages/pStepInfo/info' , template_id: "LnF85yDgCq44-_ECl3pA_fnddZq9Uhv7J_V-eZf3jZs" , form_id: "c365b4f3cb0b4dd18f3ccbc3d8071349" , emphasis_keyword: 'keyword1.DATA' , data: { keyword1: { value: "charb" , }, keyword2: { value: "测试模板消息" , }, keyword3: { value: '拼点已完成' , }, } }).then(res => { return res }). catch (err => { return err }) } |
json配置
{ "permissions" : { "openapi" : [ "templateMessage.send" ] } } |
保存,上传云函数
4. 编写程序调用
当我们完成了云函数的配置以后,接下来我们可以修改云函数,使其完成我们自己想要的功能。
我们希望云函数可以从外部发来的请求中获取到参数,并借助云开发提供的 API,调用云开发的云函数。则我们可以这样操作
我们在本地新建一个目录,并在其中执行如下命令(需要你提前安装了 N ode.js 环境)
cd 新建文件夹
npm install --save request
npm install --save request-promise
然后创建一个文件index.js
,并在其中加入如下代码,并设置其中的 APPID、SECRET、ENV_ID 等字段。
const rp = require( 'request-promise' ); const APPID = '' ; // 小程序 APPID const SECRET = '' ; // 小程序 Secret const ENV_ID = '' const NAME = ''//小程序云函数名 const TOKEN_URL = `https: //api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${APPID}&secret=${SECRET}` // const QUERY_URL = 'https://api.weixin.qq.com/tcb/invokecloudfunction' exports.main_handler = async (event, context, callback) => { let token_resp = await rp(TOKEN_URL) let token = JSON.parse(token_resp).access_token const QUERY_URL = 'https://api.weixin.qq.com/tcb/invokecloudfunction?access_token=' +token+ "&env=" +ENV_ID+ "&name=" +NAME const para = event.queryString||event para.time= new Date().getTime() const options = { method: 'POST' , uri: QUERY_URL, body: { POSTBODY: para, }, headers: { 'User-Agent' : 'Request-Promise' }, json: true // Automatically parses the JSON string in the response }; const result = await rp(options) return result } |
配置完成后,保存文件。
5. 上传代码
打包完成后,重新访问腾讯云控制台,找到刚刚创建的云函数,进入到「函数代码」中,选择其中的「本地上传文件夹」,选择你刚刚创建的文件夹,等待其自动压缩完成后,点击保存上传。
上传完成后,会自动进行部署。
这样过一会模板消息就会发送成功了
在这里需要感谢一下社区的 白宦成,他的文章《云开发如何对外提供url》给了我灵感,也解决了困扰我多天的问题
至于如何定时发送多个模板消息请结合之前的一篇文章《云开发如何同时发送对个模板消息》
这个模板函数现在已经不支持了,有什么新的方法吗?
Return result
{"errCode":45103,"errMsg":"openapi.templateMessage.send:fail This API has been unsupported rid: 5fdcaf8f-4cece675-5e765bd2"}
云函数这样调用,是收费的还是免费的
楼主加个微信 请教下
打卡