在这篇微信公众平台高级接口开发教程中我们将介绍如何使用接口实现微信公众平台群发功能。
本文分为以下四个部分
- 准备群发内容
- 选择群发对象
- 执行群发
- 接收群发结果
一、准备群发内容
群发内容可以是文本、图片、语音、视频、图文。群发文本只需要文本内容其他内容需要获得相应的media_id。
1. 文本内容
文本内容就是一段文字比如"微信公众平台开发最佳实践"
2. 图片、语音、视频
要求如下
- 图片image: 128K支持JPG格式
- 语音voice256K播放长度不超过60s支持AMR\MP3格式
- 视频video1MB支持MP4格式
准备好以后需要使用上传下载多媒体文件接口将其上传到微信服务器获得media_id。
上传的开发方法可以参考本博客的第80篇教程 微信公众平台开发(80) 上传下载多媒体文件
3. 图文
首先要准备缩略图要求如下
- 缩略图thumb64KB支持JPG格式
同样的使用上传下载多媒体文件接口上传到微信服务器后得到缩略图的media_id
然后需要使用上传图文消息素材接口将其上传到微信服务器接口为
https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=ACCESS_TOKEN
要POST提交的数据示例如下
{ "articles": [ { "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p", "author":"xxx", "title":"Happy Day", "content_source_url":"www.qq.com", "content":"content", "digest":"digest" }, { "thumb_media_id":"qI6_Ze_6PtV7svjolgs-rN6stStuHIjs9_DidOHaj0Q-mwvBelOXCFZiq2OsIU-p", "author":"xxx", "title":"Happy Day", "content_source_url":"www.qq.com", "content":"content", "digest":"digest" } ] }
参数说明如下
参数 | 是否必须 | 说明 |
---|---|---|
Articles | 是 | 图文消息一个图文消息支持1到10条图文 |
thumb_media_id | 是 | 图文消息缩略图的media_id可以在基础支持-上传多媒体文件接口中获得 |
author | 否 | 图文消息的作者 |
title | 是 | 图文消息的标题 |
content_source_url | 否 | 在图文消息页面点击“阅读原文”后的页面 |
content | 是 | 图文消息页面的内容支持HTML标签 |
digest | 否 | 图文消息的描述 |
根据上述POST结构定义图文数组如下
上传成功后返回如下将得到图文消息的media_id
{ "type":"news", "media_id":"CsEf3ldqkAYJAU6EJeIkStVDSvffUJ54vqbThMgplD-VJXXof6ctX5fI6-aYyUiQ", "created_at":1391857799 }
二、选择群发对象
群发对象可以是用户组也可以是OpenID列表。
1.用户组
获得用户分组需要使用高级接口中的查询所有分组接口获得相应的group_id
开发方法可以参考本博客的第88篇教程 微信公众平台开发(88) 用户分组接口
2.OpenID列表
OpenID列表是使用高级接口中的获取关注者列表接口来实现的。
开发方法可以参考本博客的第87篇教程 微信公众平台开发(87) 获取关注者列表
三、执行群发
由于群发对象的不同执行群发也有不同的方式。
1. 对用户组群发
对用户组群发的接口如下
https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=ACCESS_TOKEN
要POST的内容按内容不同组成也不一样。
文本
{ "filter":{ "group_id":"2" }, "text":{ "content":"CONTENT" }, "msgtype":"text" }
语音注意此处media_id需通过基础支持中的上传下载多媒体文件来得到
{ "filter":{ "group_id":"2" }, "voice":{ "media_id":"123dsdajkasd231jhksad" }, "msgtype":"voice" }
图片注意此处media_id需通过基础支持中的上传下载多媒体文件来得到
{ "filter":{ "group_id":"2" }, "image":{ "media_id":"123dsdajkasd231jhksad" }, "msgtype":"image" }
视频
{ "filter":{ "group_id":"2" }, "mpvideo":{ "media_id":"IhdaAQXuvJtGzwwc0abfXnzeezfO0NgPK6AQYShD8RQYMTtfzbLdBIQkQziv2XJc", }, "msgtype":"mpvideo" }
图文消息注意图文消息的media_id需要通过上述方法来得到
{ "filter":{ "group_id":"2" }, "mpnews":{ "media_id":"123dsdajkasd231jhksad" }, "msgtype":"mpnews" }
相关参数说明如下
参数 | 是否必须 | 说明 |
---|---|---|
filter | 是 | 用于设定图文消息的接收者 |
group_id | 是 | 群发到的分组的group_id |
mpnews | 是 | 用于设定即将发送的图文消息 |
media_id | 是 | 用于群发的消息的media_id |
msgtype | 是 | 群发的消息类型图文消息为mpnews文本消息为text语音为voice音乐为music图片为image视频为video |
title | 否 | 消息的标题 |
description | 否 | 消息的描述 |
thumb_media_id | 是 | 视频缩略图的媒体ID |
其接口实现代码如下所示
返回结果如下
array(3) { ["errcode"]=> int(0) ["errmsg"]=> string(27) "send job submission success" ["msg_id"]=> float(2347614963) }
参数说明
参数 | 说明 |
---|---|
type | 媒体文件类型分别有图片image、语音voice、视频video和缩略图thumb图文消息为news |
errcode | 错误码 |
errmsg | 错误信息 |
msg_id | 消息ID |
下面是向用户组发送图文消息的效果分别是接收到图文消息查看图文消息内容后的效果
2.对OpenID列表群发
接口如下
https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=ACCESS_TOKEN
POST数据示例如下
文本
{ "touser": [ "oR5Gjjl_eiZoUpGozMo7dbBJ362A", "oR5Gjjo5rXlMUocSEXKT7Q5RQ63Q" ], "msgtype": "text", "text": { "content": "hello from boxer." } }
语音
{ "touser":[ "OPENID1", "OPENID2" ], "voice":{ "media_id":"mLxl6paC7z2Tl-NJT64yzJve8T9c8u9K2x-Ai6Ujd4lIH9IBuF6-2r66mamn_gIT" }, "msgtype":"voice" }
图片
{ "touser":[ "OPENID1", "OPENID2" ], "image":{ "media_id":"BTgN0opcW3Y5zV_ZebbsD3NFKRWf6cb7OPswPi9Q83fOJHK2P67dzxn11Cp7THat" }, "msgtype":"image" }
视频
{ "touser":[ "OPENID1", "OPENID2" ], "video":{ "media_id":"123dsdajkasd231jhksad", "title":"TITLE", "description":"DESCRIPTION" }, "msgtype":"video" }
图文消息注意图文消息的media_id需要通过上述方法来得到
{ "touser":[ "OPENID1", "OPENID2" ], "mpnews":{ "media_id":"123dsdajkasd231jhksad" }, "msgtype":"mpnews" }
参数列表
参数 | 是否必须 | 说明 |
---|---|---|
touser | 是 | 填写图文消息的接收者一串OpenID列表OpenID最少个最多10000个 |
mpnews | 是 | 用于设定即将发送的图文消息 |
media_id | 是 | 用于群发的图文消息的media_id |
msgtype | 是 | 群发的消息类型图文消息为mpnews文本消息为text语音为voice音乐为music图片为image视频为video |
title | 否 | 消息的标题 |
description | 否 | 消息的描述 |
thumb_media_id | 是 | 视频缩略图的媒体ID |
返回数据示例正确时的JSON返回结果
{ "errcode":0, "errmsg":"send job submission success", "msg_id":2347614964 }
四、接收群发结果
1. 设置公众号助手
为了能接收群发结果需要设置公众号助手结果将推送到绑定的个人微信账号上。其设置如下
2. 接收结果事件
群发任务提交后群发任务可能在一定时间后才完成因此群发接口调用时仅会给出群发任务是否提交成功的提示若群发任务提交成功则在群发任务结束时会向开发者在公众平台填写的开发者URLcallback URL推送事件。
推送的XML结构如下发送成功时
<xml> <ToUserName><![CDATA[gh_3e8adccde292]]></ToUserName> <FromUserName><![CDATA[oR5Gjjl_eiZoUpGozMo7dbBJ362A]]></FromUserName> <CreateTime>1394524295</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[MASSSENDJOBFINISH]]></Event> <MsgID>1988</MsgID> <Status><![CDATA[sendsuccess]]></Status> <TotalCount>100</TotalCount> <FilterCount>80</FilterCount> <SentCount>75</SentCount> <ErrorCount>5</ErrorCount> </xml>
参数 | 说明 |
---|---|
ToUserName | 公众号的微信号 |
FromUserName | 公众号群发助手的微信号为mphelper |
CreateTime | 创建时间的时间戳 |
MsgType | 消息类型此处为event |
Event | 事件信息此处为MASSSENDJOBFINISH |
MsgID | 群发的消息ID |
Status | 群发的结构为“send success”或“send fail”或“err(num)”。但send success时也有可能因用户拒收公众号的消息、系统错误等原因造成少量用户接收失败。err(num)是审核失败的具体原因可能的情况如下 err(10001), //涉嫌广告 err(20001), //涉嫌政治 err(20004), //涉嫌社会 err(20002), //涉嫌色情 err(20006), //涉嫌违法犯罪 err(20008), //涉嫌欺诈 err(20013), //涉嫌版权 err(22000), //涉嫌互推(互相宣传) err(21000), //涉嫌其他 |
TotalCount | group_id下粉丝数或者openid_list中的粉丝数 |
FilterCount | 过滤过滤是指特定地区、性别的过滤、用户设置拒收的过滤用户接收已超4条的过滤后准备发送的粉丝数原则上FilterCount = SentCount + ErrorCount |
SentCount | 发送成功的粉丝数 |
ErrorCount | 发送失败的粉丝数 |
从上可以看出这其实是公众号群发助手模拟向公众号发送消息那么群发结果也是返回给公众号助手。
在微信公众平台PHP SDK中增加该事件消息的处理结果如下
private function receiveEvent($object) { $content = ""; switch ($object->Event) { case "subscribe": $content = "欢迎关注方倍工作室"; break; case "MASSSENDJOBFINISH": $content = "消息ID".$object->MsgID. "\n结果".$object->Status. "\n粉丝数".$object->TotalCount. "\n过滤".$object->FilterCount. "\n发送成功".$object->SentCount. "\n发送失败".$object->ErrorCount; break; default: break; } $result = $this->transmitText($object, $content); return $result; }