话说,本系统使用了CommentToMail插件来实现:当游客评论留言时,会自动发送到邮箱通知。但是,又不是工作消息,谁天天去看邮件呢?自从前两天,做了-> 用iOS的Siri语音助手快速发布“说说” 和 用微信公众号快速发布“说说” 之后呢,我就想,能不能借鉴他们的思路方法,调用公众号的模板消息接口来推送评论消息呢?就是不知道微信公众号的测试号支不支持模板消息的功能,因为我记得,订阅号也是要申请的。
看了一眼后,完美!是提供了的。那就可以动起手来了!
1、主要是插件目录/usr/plugins/CommentToMail
下的Action.php
文件,是定时推送邮件的主要文件。
2、CommentToMail插件大致上有俩个版本,一个是需要设置网站监控,另一个是修改版,不需要设置网站监控。
3、我的是监控版本,每隔几分钟会定时执行一遍,并推送出邮件。地址大致如下:
https://博客地址/action/comment-to-mail?do=deliverMail&key=你的密钥
它的执行机制,简单来说,就是定时去sql查询数据库mail表中,是否有邮件尚未发送(字段:send),有则发送,没有就不管。发送邮件后,send变为1。
那么,我微信推送的话,也是借助这张表。首先,自定义一个接口,定时任务定时访问,查询出微信尚未推送的消息,然后调用微信的模板消息接口,最后改变状态。
我使用的是微信公众号的测试号,正常订阅号是只能选择内置模板的,调用方法一样。
如下图所示,当然,测试号可以随意设置。
邮件发送状态使用的是send
字段,这个无法重复用,所以新增一个wxsend
字段。
ALTER TABLE `typecho_mail` ADD `wxsent` TINYINT(1) NULL DEFAULT '0' COMMENT '微信推送状态' AFTER `sent`;
1、安装及其他的,这个参照之前的文章:用iOS的Siri语音助手快速发布“说说” 和 用微信公众号快速发布“说说”
2、找到微信发送系统的根目录,主要文件是server.php
和cross.php
两个文件。
3、server.php
拷贝一份重命名为WeChatServer.php
。(也可以按你的想法自定义)。然后修改内容为:
<?php
require __DIR__ . '/vendor/autoload.php';
include 'config.php';
require('WeChatTemplate.php');
use EasyWeChat\Factory;
$app = Factory::officialAccount($config);
$app->server->push(WeChatTemplateHandler::class);
$response = $app->server->serve();
// 将响应输出
$response->send();
注意
require('WeChatTemplate.php');
和$app->server->push(WeChatTemplateHandler::class);
是要修改的部分。
4、新增一个php文件,命名为WeChatTemplate.php
。
部分代码如下:
class WeChatTemplateHandler implements EventHandlerInterface
{
public function handle($message = null)
{
global $config;
$db = new Db();
$openid = 'xxxxxxxxx';//自己的openid
$mailQueue = $db->query("SELECT id,content FROM `typecho_mail` WHERE wxsent = 0")->fetchAll();
if(sizeof($mailQueue)>0){
$access_token = get_access_token($config);
foreach($mailQueue as &$mail)
{
$mailId = $mail['id'];
$mailInfo = unserialize(base64_decode($mail['content']));
$authorId = $mailInfo->authorId;
$ownerId = $mailInfo->ownerId;
//print_r($mailInfo);
// 不推送自己的消息
if($authorId != $ownerId){
// 发送模板信息
if ($mailInfo)
{
if (send_template($mailInfo,$config,$openid,$access_token))
{
$db->query("update `typecho_mail` set wxsent = 1 WHERE id = $mailId");
}
}
}
}
}
return push(1);
}
}
/** * 功能:获取access_token * * @param $code * @return mixed */
function get_access_token($config)
{
$appid = $config['app_id'];
$appsecret = $config['secret'];
$url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret;
$data = json_decode(file_get_contents($url));//返回的json数组转换成array数组
if($data->errcode){
return '';
}
return $data->access_token;
}
// 发送模板消息
function send_template($mailInfo,$config,$openid,$access_token)
{
$url = 'https://api.weixin.qq.com/cgi-bin/message/template/send?access_token='.$access_token;
//定义消息模板JSON
$json_template = json_tempalte($openid, '你的template_id',
$mailInfo->permalink,$mailInfo->title,$mailInfo->author,$mailInfo->mail,$mailInfo->text);
//发送POST请求
list($returnCode, $returnContent) = http_post_json($url, $json_template);
//打印日志(JSON格式)
echo '发送结果如下:' . $returnContent . '\n';
return true;
}
注意,新增的文件名和上面的require('WeChatTemplate.php');
一致。修改的class名和$app->server->push(WeChatTemplateHandler::class);
一致。
如同CommentToMail插件一样,增加网站监控功能。地址为:
http://时光机地址/WeChatServer.php