如何实现小程序发送服务通知?
小程序给用户发送消息需要经过一系列验证,初次接触这个需求时可能会花费较长时间去研究和测试。为了帮助大家更好地理解并减少学习时间,我整理了一套完整的发送消息逻辑,方便以后消息通知功能时参考。
发送模板消息的步骤
发送模板消息主要分为以下几个步骤:获取access_token、建立消息模板、获取form_id、发送消息通知以及设定定时任务。下面我们逐一讲解。
一、获取access_token
在向微信请求发送消息时,需要使用到access_token。access_token相当于小程序的身份证,虽然有appid和appsecret这两个凭证,但微信为了安全性,采用了access_token这个有时效的身份证明。一条access_token的有效期只有2小时,而且单个小程序每天只能请求1000次access_token。因此,我们需要一套逻辑来确保access_token的可用性。
通过向指定地址请求,可以返回对应的access_token。我们可以编写一个方法来获取access_token,并设置一个定时器,每小时触发一次该接口,确保随时都能获取到有效的token。
二、建立消息模板
在小程序微信公众平台的左侧栏中,有一个模板消息的选项卡。按照文档添加一个模板消息后,就可以得到对应的模板ID。这一步基本是网页操作,比较简单,不再赘述。
三、获取form_id
为了防止小程序对用户发送过多的消息通知,微信对消息通知进行了限制。每发送一条消息通知,都需要一条form_id或prepay_id。prepay_id是用户使用微信支付后返回的ID,本文不做详细解释。
form_id是与button绑定的ID,每当用户点击绑定过的button时,就会返回一条form_id。一条form_id的有效期是7天,且每个用户的form_id只能对该用户使用。因此,我们需要一个专门的逻辑来保存和使用form_id。
以下是一个获取form_id的示例代码:
```javascript
// pages/index/index.js
form_id: function(e) {
wx.request({
url: 'test.com/index/index/form_id', // 自行替换接口
method: "POST",
data: {
form_id: e.detail.formId,
openId: openId // 自行获取当前用户openId
},
header: {
'content-type': 'application/x-www-form-urlencoded'
}
})
}
```
在服务器端,我们可以通过以下代码来处理form_id的保存:
```php
public function form_id(){
if (empty($_POST)) {;}
$form_id = $_POST['form_id'];
if ($form_id == 'the formId is a mock one'){;} // 过滤工具生成的form_id
$openId = $_POST['openId'];
if (!$openId) {;}
$data = compact('form_id','openId');
db('form_id')->insert($data);
}
```
此外,我们还需要定时删除过期的form_id,确保数据库中的form_id都是有效的:
```php
public function test(){
$time = time()-518400; // 保证form_id可用性,删除6天前的form_id
db('form_id')->where('createTime','delete();
// 将该方法每天执行一次
}
```
四、发送消息通知
当access_token和form_id都确保可用后,就可以给用户发送消息通知了。具体发送逻辑可以根据业务需求进行调整。
五、设定定时任务
为了保证上述操作顺利进行,我们需要设定几个定时任务来辅助消息发送。假设我们有以下几个方法:
- getToken:每小时更新一次token
- delForm_id:每天删除一次6天前的form_id
- message:每分钟执行一次发送消息
首先,连接上服务器并打开定时任务设置。设置中的每一行就是一个定时任务,分为3个部分:
1. 定时任务的执行时间
2. PHP执行文件的路径
3. 需要执行的PHP文件路径
如果使用的是原生PHP,直接指向该文件即可;如果是使用ThinkPHP框架,则需要指向根目录或public目录下的index.php,后边跟上/模块/控制器/方法。
最后,重启一下定时任务,确保所有任务正常运行。
通过以上步骤,你就可以顺利实现小程序发送服务通知的功能了。