https://mp.weixin.qq.com/wiki...
二.关于群发接口
1.订阅号每天可以群发消息一条,服务号每月(自然月)四条的群发权限。开发者模式下,可以通过高级群发接口,实现更灵活的群发能力。
2.注意
● 对于认证订阅号,群发接口每天可成功调用1次,此次群发可选择发送给全部用户或某个标签;
● 对于认证服务号虽然开发者使用高级群发接口的每日调用限制为100次,但是用户每月只能接收4条,无论在公众平台网站上,还是使用接口群发,用户每月只能接收4条群发消息,多于4条的群发将对该用户发送失败;
● 具备微信支付权限的公众号,在使用群发接口上传、群发图文消息类型时,可使用a标签加入外链;
● 开发者可以使用预览接口校对消息样式和排版,通过预览接口可发送编辑好的消息给指定用户校验效果。
通俗的说就是
● 服务号一个月只能发四条消息,虽然一个月就四条 但它是即时呈现到客户眼前 只要你打开微信就有一条未读
● 订阅号每天一条,但订阅号所有的商家都在一起显示,而且不会主动提醒,需要你点开服务号才可以看到
● 一条群发消息里,是可以包括多条图文消息。
● 群发的消息不包括商家推送消息等其他消息类型。
如下所示,为京东的服务号消息界面。上面的是群发消息,下面是发货通知消息。
这就是为什么有的人会疑惑,自己接受来自服务号的消息1个月不止4条,或者接受的消息怎么有好几条。
3.群发图文消息的过程
● 首先,预先将图文消息中需要用到的图片,使用上传图文消息内图片接口,上传成功并获得图片URL
● 上传图文消息素材,需要用到图片时,请使用上一步获取的图片URL
● 使用对用户标签的群发,或对OpenID列表的群发,将图文消息群发出去
● 在上述过程中,如果需要,还可以预览图文消息、查询群发状态,或删除已群发的消息等
4.群发图片、文本等其他消息类型的过程
● 如果是群发文本消息,则直接根据下面的接口说明进行群发即可
● 如果是群发图片、视频等消息,则需要预先通过素材管理接口准备好mediaID
5.关于群发时使用is_to_all为true使其进入公众号在微信客户端的历史消息列表
● 使用is_to_all为true且成功群发,会使得此次群发进入历史消息列表。
● 为防止异常,认证订阅号在一天内,只能使用is_to_all为true进行群发一次,或者在公众平台官网群发(不管本次群发是对全体还是对某个分组)一次。以避免一天内有2条群发进入历史消息列表。
● 类似地,服务号在一个月内,使用is_to_all为true群发的次数,加上公众平台官网群发(不管本次群发是对全体还是对某个分组)的次数,最多只能是4次。
● 设置is_to_all为false时是可以多次群发的,但每个用户只会收到最多4条,且这些群发不会进入历史消息列表。
注意
1.本接口中所有使用到media_id的地方,现在都可以使用素材管理中的永久素材media_id了。请但注意,使用同一个素材群发出去的链接是一样的,这意味着,删除某一次群发,会导致整个链接失效。
2.建议使用开发者模式的情况下,先使用预览接口,因为接口每日可以调取100次。预览达到预期效果后,才使用正式接口(openId列表群发)。
6.附说明:getWxAccessToken和https_request分别是我代码中关于获取微信全局token和调用第三方接口的方法。
三.群发消息接口——关于素材与接口
初学者很容易分不清楚开发文章当中,’素材管理‘与’消息管理-群发接口‘中,一些操作步骤的区别和用途,本人当时也是饶了很多坑,各种搜索与询问,故记录下来,为的就是日后能够帮助同行少绕弯路,以及自己日后的温习。如有错误的地方,恳请不临指教,谢谢。
1.官文链接
● 高级群发
https://mp.weixin.qq.com/wiki...
● 素材管理
https://mp.weixin.qq.com/wiki...
2.关于素材
● 素材:在微信开发中,素材指的就是原始的媒体文件(如图片、视频、声音等)以及图文类型的文件
● 媒体文件是最基础的素材,图文素材等(比如含其他媒体文件的文件素材)其他素材需要获取到基础媒体文件素材,这个看具体也无需求
● 也就是说,你也可以选择在群发消息的时候,发纯文本素材
● 媒体素材通过接口上传成功后,都会有一个媒体id,也就是media_id,这个媒体id用在之后需要调用的时候,是个关键。
注意
● 上传图片素材分两种:返回URL和返回media_id
● 素材管理分两大类:永久和临时
3.临时素材与永久素材
● 临时素材
公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放。通过本接口,公众号可以新增临时素材(即上传临时多媒体文件)。
请注意:
1、对于临时素材,每个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除(所以用户发送给开发者的素材,若开发者需要,应尽快下载到本地),以节省服务器资源。
2、media_id是可复用的。
3、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/amr格式
4、需使用https调用本接口。
● 永久素材
除了3天就会失效的临时素材外,开发者有时需要永久保存一些素材,届时就可以通过本接口新增永久素材。
最近更新,永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
请注意:
1、新增的永久素材也可以在公众平台官网素材管理模块中看到
2、永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
3、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
4、调用该接口需https协议
注意
● “永久素材”里的“最近更新...”文字所说的返回URL,就是前面提到的上传图片素材种类之一:返回图片URL
临时素材与永久素材的不同之处
4.素材与群发接口的结合使用(以下讲解的素材均以永久素材来说明)
第一步:上传图片
前面有提过,上传图片素材分两种,主要是返回参数的不同
a.返回media_id(其实可以同时返回media_id和url)——文档名:新增其他类型永久素材
使用说明
● 传入参数:全局token和类型type
● 返回:media_id和url
● 可以根据业务逻辑需求,只返回media_id或者做判断
● 注意:视频素材的请求链接是不同的
● 使用:URL可以直接放在群发消息之图文消息中的img标签,media_id可以用在图文消息的封面图片id。
b.只返回URL——文档名:上传图文消息内的图片获取URL
使用说明
● 传入参数:全局token
● 返回:url
● URL作用:放在图文消息中使用(使用img标签)。
c.总结:只返回URL和返回media_id的区别就在于使用地方的不同,当然返回media_id的方法也可以返回URL。media_id用于群发图文消息的封面,url用在文本的Img标签。
第二步:上传图文素材等文件素材
a.新增永久图文素材
b.上传图文消息素材
由于和上面的新增永久图文素材差异不大,故这里不做赘述,详情见第七条。
简单说明
● thumb_media_id:前面提到的上传图片返回media_id(也就是“新增其他类型永久素材”)就是用在此处,作为图文消息的封面图片。
● content:前面提到的上传图片2种类型,返回的URL就是用在此处的img标签里。
5.关于“上传图文消息素材”和“新增永久图文素材”的区别
● 上传图文消息素材:等于是直接把图文素材传到微信的服务器,每次凭借media_id获取素材,并且不占用素材库
● 新增永久图文素材:在开发者和微信服务器之间,多了一个素材库。素材库的素材有数量限制,但是可以直接查看到。
四.群发消息接口——第1步:上传图片(返回URL)
1.说明
● 功能:上传图文消息内的图片获取URL【订阅号与服务号认证后均可用】
● 注意:本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下
● 官方文档参考
2.代码实现
a.思路
● 调用接口
https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN
看到后面需要用token,就知道,肯定也是需要获取到全局的token,再组装url。
● 参数说明
调用示例(使用curl命令,用FORM表单方式上传一个图片):
curl -F media=@test .jpg "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"
从官文中可以看出,图片名(带格式的图片名)需要在media(代表媒体)之后,并加@符号。
这里就涉及到CURL的知识:
curl上传:文件的标识@+相对路径
b.代码实现
注:以下是我的代码实现,大家可以根据自己的项目去实际编写
function addMaterial() {
$access_token = $this->getWxAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=".$access_token;
$filename = '文件名,带路径';
$data=array("media"=>'@'. $filename);
print_R($data);
$res=$this->https_request( $url ,'post', 'json', $data);
dump($res); exit();
return $res;
}
● 说明
——方法为了实现功能,写的都比较直接。后续可以对代码进行改编,方法里的参数可以使用传参的方式,这样使用起来也比较灵活。
—— filename:文件名,相对于项目的入口文件,一般是根目录的路径。比如我编写此代码的时候用的是ThinkPHP框架,项目根目录有个index.php入口文件,在根目录有个Public,图片是直接放在Public下的,所以上述的filename应该是Public/图片名.格式,请大家根据自己实际图片路径去写。
——print_r和dump是为了看打印的结果,这个大家测试的时候可以使用下,方便查看,无误后去掉即可。
四.群发消息接口——第1步:上传素材(包括图片、视频、声音等,返回URL和MediaId,推荐)
1.说明
● 新增的永久素材也可以在公众平台官网素材管理模块中看到
● 永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其他类型为1000
● 素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
● 调用接口需https协议
● 官方文档参考
● 注意:官方说明,视频素材需要另外一个表单,这里暂不做说明。
● 通过POST表单来调用接口,表单id为media,包含需要上传的素材内容,有filename、filelength、content-type等信息
● 注意:图片素材将进入公众平台官网素材管理模块中的默认分组
2.代码实现
a.思路
● 调用接口
https://api.weixin.qq.com/cgi-bin/material/add_material? access_token=ACCESS_TOKEN&type=TYPE
看到后面需要用token,就知道,肯定也是需要获取到全局的token,再组装url,此外type类型也需要指定。
● 官方关于类型等其他参数说明如下
参数是否必须说明access_token是调用接口凭证type是媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)media是form-data中媒体文件标识,有filename、filelength、content-type等信息
b.代码实现
注:以下是我的代码实现,大家可以根据自己的项目去实际编写
function addMaterial() {
$access_token = $this->getWxAccessToken();
$type='image';
//https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE
$url = "https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=".$access_token."&type=".$type;
$filename = '文件名';
$data=array("media"=>'@'. $filename);
$res=$this->https_request( $url ,'post', 'json', $data);
return $res['media_id'];
}
● 说明
——方法为了实现功能,写的都比较直接。后续可以对代码进行改编,方法里的参数可以使用传参的方式,这样使用起来也比较灵活。
—— filename:带格式的文件名,相对于项目的入口文件,一般是根目录的路径。比如我编写此代码的时候用的是ThinkPHP框架,项目根目录有个index.php入口文件,在根目录有个Public,图片是直接放在Public下的,所以上述的filename才是如此格式,请大家根据自己实际图片路径去写。
——type:传入的媒体类型
——作用:返回的media_id用作新增图文素材中的图文消息封面素材id,url用作新增图文素材中,content(图文消息的具体内容)的img标签。
六.群发消息接口——第2步:上传图文之新增永久图文素材
1.说明
● 接口
https://api.weixin.qq.com/cgi...
2.注意
● thumb_media_id:需要先上传图片素材,且图文消息的封面图片素材id必须是永久mediaID
● content:上传图片素材的2种方式,都有返回url,就是用在此处的img标签中。
● 返回:media_id用于调用后面的群发消息时使用
● 注意:图文消息内容,将过滤外部的图片链接
3.代码实现
function addNews(){
$access_token = $this->getWxAccessToken();
$thumb_media_id=$this->addMaterial();
$content_img=$this->addMaterialUrl();
$url = "https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=".$access_token;
$array = array(
"articles" => array( /*若新增的是多图文素材,则此处应还有几段articles结构 */
array(
"title" => urlencode('最后一组测试——1'),
"thumb_media_id" => $thumb_media_id, //图文消息的封面图片素材id(必须是永久mediaID)
"author" => urlencode('测试编辑1'), //作者
"digest" => urlencode('这是测试的摘要1'), //图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空
"show_cover_pic" => 1, //是否显示封面,0为false,即不显示,1为true,即显示
"content" => urlencode("这是一个测试文章1
测试下图文素材的效果
测试下图文素材的效果"), //图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS
"content_source_url" => urlencode("http://www.地址") //图文消息的原文地址,即点击“阅读原文”后的URL
),
array(
"title" => urlencode('最后一组测试——2'),
"thumb_media_id" => $thumb_media_id, //图文消息的封面图片素材id(必须是永久mediaID)
"author" => urlencode('测试编辑2'), //作者
"digest" => urlencode('这是测试的摘要2'), //图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空
"show_cover_pic" => 1, //是否显示封面,0为false,即不显示,1为true,即显示
"content" => urlencode("这是一个测试文章2
测试下图文素材的效果
测试下图文素材的效果"), //图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS
"content_source_url" => urlencode("http://www.地址") //图文消息的原文地址,即点击“阅读原文”后的URL
),
),
);
$postJson = urldecode( json_encode( $array ) );
//dump($postJson);
$res=$this->https_request( $url ,'post', 'json', $postJson);
//dump($res['media_id']);exit();
return $res['media_id'];
}
说明
● addMaterial():是我写的新增其他类型永久素材,里面新增的是图片。
● addMaterialUrl():是我写的一个关于上传图片只返回URL的方法。虽然返回的只有URL,但也是个数组,所以,要么在方法里返回结果的时候,就取下标url返回,要么调用的时候取下标url使用。
● urlencode和urldecode:因为后面POST的是一个JSON数组。如果JSON数据里有中文,那么需要用urlencode先转,后面再用urldecode转过来。
● 需要注意的是,我的html标记属性用的是单引号,所以无需转义。如果你使用了双引号,需要用htmlspecialchars转义,再用htmlspecialchars_decode转回来。
● 请使用三维数组!!!看官方示例,如果以PHP写数组的写法来看,似乎不熟悉的人都会写成二维数组,但是这样是无法解析的,在articles里,还有一层数组!!
七.群发消息接口——第2步:上传图文之上传图文消息素材
1.说明
● 接口
https://api.weixin.qq.com/cgi...
● 官文说明
function uploadNews(){
//1.获取全局access_token
$access_token = $this->getWxAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=".$access_token;
//2.组装数据
$thumb_media_id=$this->addMaterial();
$content_img=$this->addMaterialUrl();
$array = array(
"articles" => array( /*若新增的是多图文素材,则此处应还有几段articles结构 */
array(
"thumb_media_id" => $thumb_media_id, //图文消息缩略图的media_id,可以在基础支持-上传多媒体文件接口中获得
"author" => urlencode('编辑1'), //作者
"title" => urlencode('这是测试的标题——1'),
"content_source_url" => urlencode("http://www.地址"), //图文消息的原文地址,即点击“阅读原文”后的URL
"content" => urlencode("这是一个测试文章——1
测试下图文素材的效果——1
测试下图文素材的效果——1"), //图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS
"digest" => urlencode('这是测试的摘要1'), //图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空
"show_cover_pic" => 1 //是否显示封面,0为false,即不显示,1为true,即显示
),//第一个图文文
array(
"thumb_media_id" => $thumb_media_id, //图文消息缩略图的media_id,可以在基础支持-上传多媒体文件接口中获得
"author" => urlencode('编辑2'), //作者
"title" => urlencode('这是测试的标题——2'),
"content_source_url" => urlencode("http://www.地址"), //图文消息的原文地址,即点击“阅读原文”后的URL
"content" => urlencode("这是一个测试文章——2
测试下图文素材的效果——1
测试下图文素材的效果——1"), //图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS
"digest" => urlencode('这是测试的摘要2'), //图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空
"show_cover_pic" => 1 //是否显示封面,0为false,即不显示,1为true,即显示
),//第2个图文
),
);
$postJson = urldecode( json_encode( $array ) );
$res=$this->https_request( $url ,'post', 'json', $postJson);
//dump($res);
return $res['media_id'];
}
说明
● $thumb_media_id和$content_img的获取方法:均为前文中提到的方法
● 注意:articles下的数组个数,取决于你要发送的图文消息个数,但一次最多8个
八.群发消息接口——第3步:预览接口(非必须步骤,但建议保留)
1.意义:为了防止开发者模式下,每月发送4条消息的限制,从而导致不满意消息的效果现象。
2.官方文档
注意:虽然预览接口调用的次数较多,但是每天有100次的限制,请注意!!!
3.代码实现——纯文本
function sendMsgAll(){
//1.获取全局access_token
$access_token = $this->getWxAccessToken();
$openid="我的openid";
//2.组装群发预览接口数据 array
$url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=".$access_token;
$array =array(
'touser'=> $openid, //openid
'text' => array('content' => '雨纷纷,旧故里草木深'), //文本内容
'msgtype' => 'text' //格式
);
//3.将数组转成json格式
$postJson = json_encode ( $array );
//4.调用第三方接口
$res = $this->https_request( $url ,'post', 'json',$postJson);
return $res;
}
4.代码实现——图文
function sendMsgAllPreview(){
//1.获取全局access_token
$access_token = $this->getWxAccessToken();
$openid="我的openid";
$media_id=$this->addNews();
//2.组装群发预览接口数据 array
$url = "https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=".$access_token;
$array = array(
"touser" =>$openid,
"mpnews"=>array("media_id"=>$media_id),
"msgtype"=>"mpnews"
);
//3.将数组转成json格式
$postJson = json_encode ( $array );
//4.调用第三方接口
$res = $this->https_request( $url ,'post', 'json',$postJson);
//dump($res);
return $res;
}
说明
● $openid:此处因为是做预览,只需要一个ID,获取有很多种方法。比如之前获取用户信息的时候,可以获取到openid,或者是测试号的id都可以,只要是合法的openid。
● mpnews:媒体id。需要你之前有上传过图文消息的素材,获得素材的id。
疑问:我预览接口是成功的,返回是0,但是没有官方示例的msg_id...难道改版了?知道的麻烦不吝赐教,谢谢。
九.群发消息接口——第4步:根据标签进行群发
1.说明
● 接口
https://api.weixin.qq.com/cgi...
● 官方说明
2.代码实现
//根据标签进行群发
function sendAllByTag(){
//1.获取全局access_token
$access_token = $this->getWxAccessToken();
$url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=".$access_token;
//2.组装数据
$media_id=$this->addNews();
$array=array(
'filter' => array( //用于设定图文消息的接收者
'is_to_all' => true, //是否向全部用户发送,值为true或false,选择true该消息群发给所有用户,选择false可根据tag_id发送给指定群组的用户
'tag_id' =>'', //群发到的标签的tag_id,参加用户管理中用户分组接口,若is_to_all值为true,可不填写tag_id
),
'mpnews' => array( //用于设定即将发送的图文消息
'media_id' => $media_id, //用于群发的消息的media_id
),
'msgtype'=> 'mpnews', //群发的消息类型,图文消息为mpnews,文本消息为text,语音为voice,音乐为music,图片为image,视频为video,卡券为wxcard
);
$postJson = json_encode( $array );
$res=$this->https_request( $url ,'post', 'json', $postJson);
//dump($res);
return $res;
}