使用EasyWechat进行微信推送

工作关系,有项目需要用到微信推送,我们的技术栈是PHP,经过调查,发现了一个比较好用的第三方微信SDK——EasyWechat,借助这个第三方SDK,我们能很方便的进行一些微信相关开发,由于EasyWechat的文档并没有很清晰的介绍推送相关的步骤,我这里做个介绍,希望能帮助有同样需求的朋友。

前提条件

我们后端运行在PHP7,系统是Workerman+Laravel接受物联网终端上报上来的数据,根据规则,有些情况需要实时或者定时推送到关注了对应公众号的用户上,让用户及时了解设备的报警信息及机器的运行统计等信息,其中,部分软件版本号如下:

  • PHP: 7.3.9
  • Workerman: 3.5.19
  • Laravel: 5.5.44
  • EasyWechat: 4.1.31

安装EasyWechat

其实安装EasyWechat只需要一行composer命令就可以,但是我这里是Laravel,官方为Laravel专门提供了一个包,我用的是Laravel 5.5.x安装命令如下:

composer require “overtrue/laravel-wechat:~4.0”

对,就这么简单,一行命令就能安装好。

微信公众号

在写代码之前,还需要有个微信公众号,用以对接微信公众平台。登录微信公众平台,然后点击左侧的添加功能插件,找到模板消息,点击添加,如图(看不清截图的,可以右键选择新窗口打开查看大图):
wechat-mp-template-message-1.png
因为我这边截图之前已经开通了,所以显示的是“已添加”。

开通微信公众平台模板消息

要使用微信公众号进行推送消息,首先需要开通模板消息。其实开通很简单,简单填个说明然后等待开通就好了,这一步就不截图了。

创建或添加消息模板

不要觉得我这个标题有问题,其实我说的不是一回事。和发送短信及邮件一样,微信公众平台推送消息都是需要先定义模板的。
微信公众平台发送模板消息有两种方式,一种是自定义添加完全符合自己要求的,另一种选择模板库已有的凑合着用。
我一开始选择按照我们自己的业务添加完全符合我们自己的消息模板,结果提交了很多次后台都没有审核通过,审核结果:

新增模板消息的申请审核不通过
标题为“设备报警通知”的模板消息审核不通过,原因是:模板库中已存在类似的可通用模板,请勿重复申请。 补充说明:请搜索【设备报警】,模板库里已存在类似的模板可调用

我也是开通了模板消息才知道,其实微信公众后台已经有了很多消息模板,各行各业的都有,我试了下搜索和我们需求类似的,相似结果有100多条,如图:
wechat-mp-template-message-tmpl-store.png
使用关键字搜索,然后找到合适的模板之后,点击模板页面的添加就能添加到我们模板库了,如图:
wechat-mp-template-message-tmpl-list.png
点击详情,能看到模板里面定义的变量,这是我们进行推送的关键,如图:
wechat-mp-template-message-tmpl-detail.png
重点注意{{first.DATA}}{{keyword1-3.DATA}}{{remark.DATA}},这是我们后续推送时需要替换的变量名。

使用消息模板进行推送

有了消息模板之后,接下来我们就可以进行推送了,先上个对应的代码:

$config = [
    'app_id' => env('WX_APP_ID'),
    'secret' => env('WX_SECRET'),
    'response_type' => 'array',
];
$app = Factory::officialAccount($config);
$app->template_message->send([
    'touser' => $user->openid,
    'template_id' => env('WX_WARNING_PUSH_TEMPLATE_ID'),
    'url' => $url,
    'miniprogram' => [],
    'data' => [
        'first' => '设备报警推送',
        'keyword1' => $var,
        'keyword2' => [$var, '#F00'],
        'keyword3' => $var,
        'remark' => '点击此条消息可以查看详情'
    ],
]);

其中,上面的几个env相关变量,我是把配置放在了.env文件里面,实际使用的时候,要么使用实际的值进行替换,要么到.env文件增加对应的值就好,而data里面的几个数组,可以根据实际的业务需求进行替换。然后把这段代码放到需要触发推送的地方就能进行推送了。
实际推送输出:

[2019-10-14 15:57:45] NULL.DEBUG: >>>>>>>>
POST /cgi-bin/message/template/send?access_token=26_BtbgCzVxMdhPo7gH9_e808gXIQj0ktF9po6VXIFe4-avuMeaCODTmTcg78phOwxxxxAsqIjTWDg3AuOSbOOo4_ivy-qLQLJ14rD73Axxxx HTTP/1.1
Host: api.weixin.qq.com
Content-Length: 451
User-Agent: GuzzleHttp/6.3.3 curl/7.29.0 PHP/7.1.32
Content-Type: application/json
{"touser":"oDVCN1tfbeqQ_tYQOXRSYMxxx","template_id":"5cb_6a-0dSMUDXNzWFNkHYXEUt0ESMS8XpQrDPX1R8U","url":"http:\/\/cloudbool.com","data":{"first":{"value":"设备报警推送"},"keyword1":{"value":"No. xxxx"},"keyword2":{"value":"通信故障","color":"#F00"},"keyword3":{"value":"2019-10-14 15:57:44"},"remark":{"value":"点击此条消息可以查看详情"}},"miniprogram":""}
<<<<<<<<
HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: application/json; encoding=utf-8
Date: Mon, 14 Oct 2019 07:57:45 GMT
Content-Length: 55
{"errcode":0,"errmsg":"ok","msgid":103091955795xxxx}
--------
NULL

这是微信收到的推送消息截图:
wechat-mp-template-message-example.jpg

使用微信公众平台测试号

其实如果只是需要自己测试的话,可以不需要为了推送而专门注册一个公众号,微信公众平台为我们开发者提供了测试号,地址在这里:

https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo

用微信扫码就能登录,里面我们能获取到开发公众号的测试沙盒环境,接口能满足我们开发公众号的大部分功能,模板消息也是一样的,如图,这是测试号推送成功的截图:
wechat-mp-template-message-tmpl-sandbox.jpg