评论

云开发定时发送模板消息实现方案

云开发定时发送模板消息实现方案

在实际开发过程中,许多需求需要定时发送模板消息通知用户比如说给发起助力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》给了我灵感,也解决了困扰我多天的问题

至于如何定时发送多个模板消息请结合之前的一篇文章《云开发如何同时发送对个模板消息》



最后一次编辑于  2019-09-23  
点赞 5
收藏
评论

4 个评论

  • 飞飞
    飞飞
    2020-12-18

    这个模板函数现在已经不支持了,有什么新的方法吗?

    Return result

    {"errCode":45103,"errMsg":"openapi.templateMessage.send:fail This API has been unsupported rid: 5fdcaf8f-4cece675-5e765bd2"}



    2020-12-18
    赞同
    回复 1
    • Charb
      Charb
      2020-12-20
      订阅消息
      2020-12-20
      回复
  • 李志强
    李志强
    2020-04-13

    云函数这样调用,是收费的还是免费的

    2020-04-13
    赞同
    回复
  • WY
    WY
    2019-09-29

    楼主加个微信  请教下

    2019-09-29
    赞同
    回复 1
    • Charb
      Charb
      2019-09-29
      Miss1610935575
      2019-09-29
      回复
  • 白宦成 #Linux中国
    白宦成 #Linux中国
    2019-09-23

    打卡

    2019-09-23
    赞同
    回复
登录 后发表内容