利用公众号的模板消息把评论/留言推送到微信


话说,本系统使用了CommentToMail插件来实现:当游客评论留言时,会自动发送到邮箱通知。但是,又不是工作消息,谁天天去看邮件呢?自从前两天,做了-> 用iOS的Siri语音助手快速发布“说说”用微信公众号快速发布“说说” 之后呢,我就想,能不能借鉴他们的思路方法,调用公众号的模板消息接口来推送评论消息呢?就是不知道微信公众号的测试号支不支持[模板消息]的功能,因为我记得,订阅号也是要申请的。
看了一眼后,完美!是提供了的。那就可以动起手来了!

参考CommentToMail插件

1、主要是插件目录/usr/plugins/CommentToMail下的Action.php文件,是定时推送邮件的主要文件。
2、CommentToMail插件大致上有俩个版本,一个是需要设置网站监控,另一个是修改版,不需要设置网站监控。
3、我的是监控版本,每隔几分钟会定时执行一遍,并推送出邮件。地址大致如下:

https://博客地址/action/comment-to-mail?do=deliverMail&key=你的密钥

借鉴CommentToMail插件

它的执行机制,简单来说,就是定时去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.phpcross.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

最终效果

声明:目的地-Destination|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 利用公众号的模板消息把评论/留言推送到微信


前程似锦、未来可期、寻得良人、共赴白头,祝你也祝我。