微信小程序,利用云开发实现定时推送模板消息
<p><span style="font-size: 18px"><strong>要实现利用云开发定时推送模板消息,分为三个重点分别是</strong></span></p><ol>
<li><span style="font-size: 18px"><strong>获取和储存fromid</strong></span></li>
<li><span style="font-size: 18px"><strong>周期获取AccessToken</strong></span></li>
<li><span style="font-size: 18px"><strong>定时执行推送方法</strong></span></li>
</ol>
<p>我们将三个重点一个一个来实现</p>
<p>具体实现出来的效果:用户在小程序中触发定时推送会在当天22点收到模板消息,若触发多次,例如7次,就会在之后7天每天的10点收到模板消息推送。</p>
<p><span style="font-size: 14pt"><strong>1.获取和储存formid</strong></span></p>
<p>推送模板消息必不可少的是formid 首先我们需要在用户触发了定时发送模板消息的事件之后将fromid存储在云开发数据库中</p>
<p>(1)先在云函数数据库中建立新的数据集来存放所需数据,formid存储在data字段中</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)"> timeingTask{
_id:
_openid:</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">用户openid,根据需求也可以加入opengid</span>
taskType: <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">任务类型,可以通过设定不同的参数执行不同定时任务</span>
execTime: <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">执行时间,到达这个时间开始执行</span>
data:{}<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 其他所需数据,将formid放在作为参数放在里面</span>
}</pre>
</div>
<p>(2)创建云函数saveFormID(云函数名称可自定)用于执行储存formid </p>
<p><span style="font-size: 16px"> <span style="text-decoration: underline; color: rgba(255, 0, 0, 1)">index.js</span></span></p>
<div class="cnblogs_code">
<pre> <span style="color: rgba(0, 0, 255, 1)">const</span> cloud = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx-server-sdk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
cloud.init()
</span><span style="color: rgba(0, 0, 255, 1)">const</span> db =<span style="color: rgba(0, 0, 0, 1)"> cloud.database()
exports.main </span>= <span style="color: rgba(0, 0, 255, 1)">async</span>(<span style="color: rgba(0, 0, 255, 1)">event</span>, context) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">switch</span> (<span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.action) {
</span><span style="color: rgba(0, 0, 255, 1)">case</span> <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">saveFormID</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">:
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span> saveFormID(<span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">)
}
</span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">:
{
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)">
}
}
}
</span><span style="color: rgba(0, 0, 255, 1)">async</span> function saveFormID(<span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">var</span> s = <span style="color: rgba(0, 0, 255, 1)">await</span> db.collection(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">timeingTask</span><span style="color: rgba(128, 0, 0, 1)">'</span>).<span style="color: rgba(0, 0, 255, 1)">where</span><span style="color: rgba(0, 0, 0, 1)">({
_openid: </span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.userInfo.openId,
}).orderBy(</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">execTime</span><span style="color: rgba(128, 0, 0, 1)">'</span>, <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">desc</span><span style="color: rgba(128, 0, 0, 1)">'</span>).<span style="color: rgba(0, 0, 255, 1)">get</span>()<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取该用户是否有待执行的推送</span>
<span style="color: rgba(0, 0, 255, 1)">if</span> (s.data.length == <span style="color: rgba(128, 0, 128, 1)">0</span>){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">若不存在待执行推送,就新增一个当日的推送</span>
let time = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Date();
time.setHours(</span><span style="color: rgba(128, 0, 128, 1)">14</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>, <span style="color: rgba(128, 0, 128, 1)">0</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设定推送时间,可根据需求调整</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">await</span> db.collection(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">timeingTask</span><span style="color: rgba(128, 0, 0, 1)">'</span>).add({<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将定时任务存入云函数数据库</span>
<span style="color: rgba(0, 0, 0, 1)"> data: {
data: {
_openid: </span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.userInfo.openId,
formId: </span><span style="color: rgba(0, 0, 255, 1)">event</span>.formId,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将formid存入data中</span>
<span style="color: rgba(0, 0, 0, 1)"> },
execTime: time,
taskType: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">可根据需求自定</span>
_openid: <span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.userInfo.openId,
}
})
}</span><span style="color: rgba(0, 0, 255, 1)">else</span>{<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">如果已存在任务就再最新的任务的基础上再新增一个下一天执行的任务</span>
let lastTime = <span style="color: rgba(0, 0, 255, 1)">new</span> Date(s.data[<span style="color: rgba(128, 0, 128, 1)">0</span>].execTime)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">最后的任务的执行时间</span>
lastTime.setMilliseconds(lastTime.getMilliseconds() + (<span style="color: rgba(128, 0, 128, 1)">1</span> * <span style="color: rgba(128, 0, 128, 1)">24</span> * <span style="color: rgba(128, 0, 128, 1)">60</span> * <span style="color: rgba(128, 0, 128, 1)">60</span> * <span style="color: rgba(128, 0, 128, 1)">1000</span><span style="color: rgba(0, 0, 0, 1)">));
</span><span style="color: rgba(0, 0, 255, 1)">var</span> month = lastTime.getMonth() + <span style="color: rgba(128, 0, 128, 1)">1</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">var</span> day =<span style="color: rgba(0, 0, 0, 1)"> lastTime.getDate();
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (month < <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">) {
month </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> month;
}
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (day < <span style="color: rgba(128, 0, 128, 1)">10</span><span style="color: rgba(0, 0, 0, 1)">) {
day </span>= <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> day;
}
</span><span style="color: rgba(0, 0, 255, 1)">var</span> val = lastTime.getFullYear() + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-</span><span style="color: rgba(128, 0, 0, 1)">"</span> + month + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">-</span><span style="color: rgba(128, 0, 0, 1)">"</span> + day+<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)"> 14:00:00</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
let time </span>= <span style="color: rgba(0, 0, 255, 1)">new</span> Date(val)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">设定任务推送时间,可根据需求调整</span>
<span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">await</span> db.collection(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">timeingTask</span><span style="color: rgba(128, 0, 0, 1)">'</span>).add({<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">将定时任务存入云函数数据库</span>
<span style="color: rgba(0, 0, 0, 1)"> data: {
data: {
_openid: </span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.userInfo.openId,
_opengid: </span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.openGid,
formId: </span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.formId,
},
execTime: time,
taskType: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
_openid: </span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.userInfo.openId,
_opengid: </span><span style="color: rgba(0, 0, 255, 1)">event</span><span style="color: rgba(0, 0, 0, 1)">.openGid,
}
})
}
}</span></pre>
</div>
<p><span style="font-size: 16px"><strong>2.周期获取AccessToken</strong></span></p>
<p>再有了formid之后我们还需要AccessToken 来发送模板消息,由于AccessToken有效时间为两小时,所以我们需要定时的更新AccessToken,需要使用到云函数定时触发器</p>
<p>云函数定时触发器详情可查看 云函数定时触发器<br></p>
<p>(1)在云函数数据库中创建数据集来存放AccessToken</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 128, 1)">1</span> <span style="color: rgba(0, 0, 0, 1)">publicField{
</span><span style="color: rgba(0, 128, 128, 1)">2</span> <span style="color: rgba(0, 0, 0, 1)">_id:
</span><span style="color: rgba(0, 128, 128, 1)">3</span> time:<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">AccessToken创建的时间</span>
<span style="color: rgba(0, 128, 128, 1)">4</span> token: <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">AccessToken</span>
<span style="color: rgba(0, 128, 128, 1)">5</span> type: <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">类型,可根据需求使用</span>
<span style="color: rgba(0, 128, 128, 1)">6</span> }</pre>
</div>
<p>(2)创建云函数GetAccess(云函数名称可自定)获取AccessToken <span style="font-size: 18px"> </span></p>
<p><span style="font-size: 16px"><span style="text-decoration: underline"><span style="color: rgba(255, 0, 0, 1); text-decoration: underline">index.js</span></span></span></p>
<div class="cnblogs_code">
<pre> cloud = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx-server-sdk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">const</span> rq = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">request-promise</span><span style="color: rgba(128, 0, 0, 1)">'</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">通过npm引入request-promise包,可用可不用</span>
<span style="color: rgba(0, 0, 0, 1)"> cloud.init()
</span><span style="color: rgba(0, 0, 255, 1)">const</span> db =<span style="color: rgba(0, 0, 0, 1)"> cloud.database();
</span><span style="color: rgba(0, 0, 255, 1)">const</span> APPID = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">你的APPID</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">const</span> APPSECRET = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">你的APPSECRET</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 0, 255, 1)">const</span> COLLNAME = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">publicField</span><span style="color: rgba(128, 0, 0, 1)">'</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">云函数数据库的数据集名</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> FIELDNAME = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ACCESS_TOKEN</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">数据type </span>
exports.main = <span style="color: rgba(0, 0, 255, 1)">async</span> (<span style="color: rgba(0, 0, 255, 1)">event</span>, context) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
let res </span>= <span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> rq({
method: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">GET</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
uri: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=</span><span style="color: rgba(128, 0, 0, 1)">"</span> + APPID + <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">&secret=</span><span style="color: rgba(128, 0, 0, 1)">"</span> +<span style="color: rgba(0, 0, 0, 1)"> APPSECRET,
});
res </span>= JSON.parse(res)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取AccessToken</span>
let now = <span style="color: rgba(0, 0, 255, 1)">new</span> Date();<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">当前时间</span>
let resUpdate = <span style="color: rgba(0, 0, 255, 1)">await</span> db.collection(COLLNAME).<span style="color: rgba(0, 0, 255, 1)">where</span><span style="color: rgba(0, 0, 0, 1)">({
type: FIELDNAME
}).update({</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">存入云函数数据库</span>
<span style="color: rgba(0, 0, 0, 1)"> data: {
token: res.access_token,
time: now,
}
})
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
console.error(e)
}
}</span></pre>
</div>
<p> (3)设置云函数定时器</p>
<p>为GetAccess云函数设置每小时运行一次的定时器 ,在云函数GetAccess目录下新建文件</p>
<p><span style="text-decoration: underline; color: rgba(255, 0, 0, 1); font-size: 16px">config.json</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">triggers</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">myTimer</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">触发器名字</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">timer</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">触发器类型</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">config</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0 0 */1 * * * *</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">触发时间,当前为每小时触发</span>
<span style="color: rgba(0, 0, 0, 1)"> }
]
}</span></pre>
</div>
<p>之后在云函数处右键点击上传触发器,即可完成定时运行云函数</p>
<p><img src="https://img2018.cnblogs.com/i-beta/1531896/201911/1531896-20191126144322199-304593526.png"></p>
<p><strong><span style="font-size: 14pt">3.定时执行推送方法</span></strong></p>
<p><span style="font-size: 14px">accessToken和formid都有了之后我们就可以开始最重要的部分,也就是定时执行模板消息推送了</span></p>
<p><span style="font-size: 14px">(1)新增云函数sendMessage(云函数名称可自定)</span></p>
<p><span style="font-size: 14px">(2)在云函数下新建文件,<span style="font-size: 16px; color: rgba(255, 0, 0, 1)"><span style="color: rgba(0, 0, 0, 1)"><span style="font-size: 14px">用于封装发送模板消息的方法</span></span></span></span></p>
<p><span style="text-decoration: underline"><span style="font-size: 16px; color: rgba(255, 0, 0, 1); text-decoration: underline">templateMessage.js </span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> rp = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">request-promise</span><span style="color: rgba(128, 0, 0, 1)">'</span>);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">npm引用request-promise包,可用可不用</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> sendTemplateMsg = <span style="color: rgba(0, 0, 255, 1)">async</span> (token, msgid, msgData, openid, formid, page) =><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">发送数据</span><span style="color: rgba(128, 0, 0, 1)">"</span>, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">token:</span><span style="color: rgba(128, 0, 0, 1)">"</span>, token, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msgid:</span><span style="color: rgba(128, 0, 0, 1)">"</span>, msgid, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">msgData:</span><span style="color: rgba(128, 0, 0, 1)">"</span>, msgData, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">openid:</span><span style="color: rgba(128, 0, 0, 1)">"</span>, openid, <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">formid:</span><span style="color: rgba(128, 0, 0, 1)">"</span>, formid,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">page:</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)"> ,page)
</span><span style="color: rgba(0, 0, 255, 1)">await</span><span style="color: rgba(0, 0, 0, 1)"> rp({
json: </span><span style="color: rgba(0, 0, 255, 1)">true</span><span style="color: rgba(0, 0, 0, 1)">,
method: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">POST</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
uri: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=</span><span style="color: rgba(128, 0, 0, 1)">'</span> +<span style="color: rgba(0, 0, 0, 1)"> token,
body: {
touser: openid,
template_id: msgid,
page: page,
form_id: formid,
data: msgData
}
}).then(res </span>=><span style="color: rgba(0, 0, 0, 1)"> {
console.log(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">发送成功</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, res)
}).</span><span style="color: rgba(0, 0, 255, 1)">catch</span>(err =><span style="color: rgba(0, 0, 0, 1)"> {
console.error(err)
})
}
module.exports </span>=<span style="color: rgba(0, 0, 0, 1)"> {
sendTemplateMsg: sendTemplateMsg,
}</span></pre>
</div>
<p> (3)在云函数下新建文件 ,用于封装发送方法,来处理需要发送数据</p>
<p> <span style="text-decoration: underline"><span style="font-size: 16px; color: rgba(255, 0, 0, 1); text-decoration: underline">send.js</span></span><span style="font-size: 16px; color: rgba(255, 0, 0, 1)"><span style="font-size: 14px"> </span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> cloud = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx-server-sdk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">const</span> templateMessage = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">templateMessage.js</span><span style="color: rgba(128, 0, 0, 1)">'</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">引入发送模板消息方法</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> COLL_FIELD_NAME = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">publicField</span><span style="color: rgba(128, 0, 0, 1)">'</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">存放accessToken的数据集</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> FIELD_NAME = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">ACCESS_TOKEN</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">数据类型</span>
<span style="color: rgba(0, 0, 255, 1)">const</span> MSGID = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">模板ID</span><span style="color: rgba(128, 0, 0, 1)">'</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">要发送的模板消息的模板ID</span>
<span style="color: rgba(0, 0, 0, 1)">cloud.init()
</span><span style="color: rgba(0, 0, 255, 1)">const</span> db =<span style="color: rgba(0, 0, 0, 1)"> cloud.database()
</span><span style="color: rgba(0, 0, 255, 1)">const</span> send = <span style="color: rgba(0, 0, 255, 1)">async</span> data =><span style="color: rgba(0, 0, 0, 1)"> {
let openid </span>= data._openid<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取用户openid</span>
let formid = data.formId<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">获取formid</span>
let tokenRes = <span style="color: rgba(0, 0, 255, 1)">await</span> db.collection(COLL_FIELD_NAME).<span style="color: rgba(0, 0, 255, 1)">where</span><span style="color: rgba(0, 0, 0, 1)">({
type: FIELD_NAME
}).</span><span style="color: rgba(0, 0, 255, 1)">get</span>()<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 从数据库中获取AccessToken</span>
let token = tokenRes.data[<span style="color: rgba(128, 0, 128, 1)">0</span>].token; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> access_token</span>
let page = <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">pages/homePage/homePage</span><span style="color: rgba(128, 0, 0, 1)">'</span>;<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">模板消息的打开页</span>
let msgData = {<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">根据需求自定模板消息的数据</span>
<span style="color: rgba(0, 0, 0, 1)"> keyword1: {
value: </span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">*****</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">,
},
keyword2: {
value: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">*****</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
},
keyword3: {
value: </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">*****</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
},
};
</span><span style="color: rgba(0, 0, 255, 1)">await</span> templateMessage.sendTemplateMsg(token, MSGID, msgData, openid, formid, page);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">调用发送模板消息方法</span>
<span style="color: rgba(0, 0, 0, 1)">}
module.exports </span>=<span style="color: rgba(0, 0, 0, 1)"> {
send: send,
}</span></pre>
</div>
<p><span style="font-size: 16px; color: rgba(255, 0, 0, 1)"><span style="font-size: 14px"><span style="color: rgba(0, 0, 0, 1)">(4)在云函数中获取数据库中的任务,并判断时间是否到达执行时间</span></span></span></p>
<p><span style="text-decoration: underline; font-size: 16px"><span style="color: rgba(255, 0, 0, 1); text-decoration: underline">index.js</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">const</span> cloud = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">wx-server-sdk</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">)
cloud.init()
</span><span style="color: rgba(0, 0, 255, 1)">const</span> db =<span style="color: rgba(0, 0, 0, 1)"> cloud.database()
exports.main </span>= <span style="color: rgba(0, 0, 255, 1)">async</span>(<span style="color: rgba(0, 0, 255, 1)">event</span>, context) =><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">const</span> execTasks = []; <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">创建待执行任务栈
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 1.获取数据库中待执行的定时任务</span>
let taskRes = <span style="color: rgba(0, 0, 255, 1)">await</span> db.collection(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">timeingTask</span><span style="color: rgba(128, 0, 0, 1)">'</span>).limit(<span style="color: rgba(128, 0, 128, 1)">100</span>).<span style="color: rgba(0, 0, 255, 1)">get</span><span style="color: rgba(0, 0, 0, 1)">()
let tasks </span>=<span style="color: rgba(0, 0, 0, 1)"> taskRes.data;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 2.定时任务是否到达触发时间,时间到了便存入任务栈,并将数据库中的记录删除</span>
let now = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Date();
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">for</span> (let i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < tasks.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (tasks.execTime <= now) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">判断是否已经过了任务触发时间</span>
execTasks.push(tasks); <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">存入待执行任务栈
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 定时任务数据库中删除该任务</span>
<span style="color: rgba(0, 0, 255, 1)">await</span> db.collection(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">timeingTask</span><span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(0, 0, 0, 1)">).doc(tasks._id).remove()
}
}
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
console.error(e)
}
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 3.处理待执行任务</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> (let i = <span style="color: rgba(128, 0, 128, 1)">0</span>; i < execTasks.length; i++<span style="color: rgba(0, 0, 0, 1)">) {
let task </span>=<span style="color: rgba(0, 0, 0, 1)"> execTasks;
</span><span style="color: rgba(0, 0, 255, 1)">if</span> (task.taskType == <span style="color: rgba(128, 0, 128, 1)">1</span>) { <span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">执行发送方法</span>
console.log(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">send执行了</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">, task.data)</span><span style="color: rgba(0, 0, 255, 1)">const</span> send = require(<span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">send.js</span><span style="color: rgba(128, 0, 0, 1)">'</span>)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">引入发送方法</span>
<span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">await</span> send.send(task.data)<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">执行发送方法</span>
} <span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (e) {
console.error(e)
}
}
}
}</span></pre>
</div>
<p> (5)为云函数sendMessage添加云函数定时器,每分钟执行</p>
<p><span style="text-decoration: underline"><span style="font-size: 16px; color: rgba(255, 0, 0, 1); text-decoration: underline">config.json</span></span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">permissions</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">openapi</span><span style="color: rgba(128, 0, 0, 1)">"</span>: [<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">云函数调用发送模板消息的权限</span>
<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">wxacode.get</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">templateMessage.send</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">templateMessage.addTemplate</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">templateMessage.deleteTemplate</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">templateMessage.getTemplateList</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">templateMessage.getTemplateLibraryById</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">templateMessage.getTemplateLibraryList</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
]
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">triggers</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">name</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">myTimer</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">type</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">timer</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">config</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">0 */1 * * * * *</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">每分钟执行</span>
<span style="color: rgba(0, 0, 0, 1)"> }
]
}</span></pre>
</div>
<p><strong>注意要上传触发器。</strong></p>
<p>以上便是利用云开发定时推送模板消息的实现过程。</p>
<p>实现思路参考于<<微信小程序,定时发送模板消息功能实现(云开发实现)>></p><br><br>
来源:https://www.cnblogs.com/cokolxvd/p/11935976.html
頁:
[1]