**说明
1.文章和有道笔记几乎内容相同,因此若是有人在有道上有幸看到同样的文章,应该也是我写的,除非是所有复制
2.内容会较长,故会拆分多篇文章讲解
3.目前基本的群发已记录完结,若是后续有补充,会做说明**php
一.官方文档
高级群发接口
https://mp.weixin.qq.com/wiki...html
二.关于群发接口
1.订阅号天天能够群发消息一条,服务号每个月(天然月)四条的群发权限。开发者模式下,能够经过高级群发接口,实现更灵活的群发能力。
2.注意
● 对于认证订阅号,群发接口天天可成功调用1次,这次群发可选择发送给所有用户或某个标签;
● 对于认证服务号虽然开发者使用高级群发接口的每日调用限制为100次,可是用户每个月只能接收4条,不管在公众平台网站上,仍是使用接口群发,用户每个月只能接收4条群发消息,多于4条的群发将对该用户发送失败;
● 具有微信支付权限的公众号,在使用群发接口上传、群发图文消息类型时,可以使用a标签加入外链;json
● 开发者可使用预览接口校对消息样式和排版,经过预览接口可发送编辑好的消息给指定用户校验效果。
通俗的说就是
● 服务号一个月只能发四条消息,虽然一个月就四条 但它是即时呈现到客户眼前 只要你打开微信就有一条未读
● 订阅号天天一条,但订阅号全部的商家都在一块儿显示,并且不会主动提醒,须要你点开服务号才能够看到
● 一条群发消息里,是能够包括多条图文消息。
● 群发的消息不包括商家推送消息等其余消息类型。
以下所示,为京东的服务号消息界面。上面的是群发消息,下面是发货通知消息。api
这就是为何有的人会疑惑,本身接受来自服务号的消息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来进行的。素材管理接口对全部认证的订阅号和服务号开放。经过本接口,公众号能够新增临时素材(即上传临时多媒体文件)。
请注意:
一、对于临时素材,每一个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除(因此用户发送给开发者的素材,若开发者须要,应尽快下载到本地),以节省服务器资源。
二、media_id是可复用的。
三、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/amr格式
四、需使用https调用本接口。
● 永久素材
除了3天就会失效的临时素材外,开发者有时须要永久保存一些素材,届时就能够经过本接口新增永久素材。
最近更新,永久图片素材新增后,将带有URL返回给开发者,开发者能够在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
请注意:
一、新增的永久素材也能够在公众平台官网素材管理模块中看到
二、永久素材的数量是有上限的,请谨慎新增。图文消息素材和图片素材的上限为5000,其余类型为1000
三、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持bmp/png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/wma/wav/amr格式
四、调用该接口需https协议
注意
● “永久素材”里的“最近更新...”文字所说的返回URL,就是前面提到的上传图片素材种类之一:返回图片URL框架
临时素材与永久素材的不一样之处
4.素材与群发接口的结合使用(如下讲解的素材均以永久素材来讲明)
第一步:上传图片
前面有提过,上传图片素材分两种,主要是返回参数的不一样
a.返回media_id(其实能够同时返回media_id和url)——文档名:新增其余类型永久素材curl
使用说明
● 传入参数:全局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("<h1>这是一个测试文章1</h1><br /><img src='{$content_img}' /><br /><div>测试下图文素材的效果</div><br /><div>测试下图文素材的效果</div>"), //图文消息的具体内容,支持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("<h1>这是一个测试文章2</h1><br /><img src='{$content_img}' /><br /><div>测试下图文素材的效果</div><br /><div>测试下图文素材的效果</div>"), //图文消息的具体内容,支持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...
● 官文说明
2.代码实现
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("<h1>这是一个测试文章——1</h1><br /><img src='{$content_img}' /><br /><div>测试下图文素材的效果——1</div><br /><div>测试下图文素材的效果——1</div>"), //图文消息的具体内容,支持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("<h1>这是一个测试文章——2</h1><br /><img src='{$content_img}' /><br /><div>测试下图文素材的效果——1</div><br /><div>测试下图文素材的效果——1</div>"), //图文消息的具体内容,支持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; }
注意 ● 认证后的服务号每月就4次群发消息机会!!!请谨慎...建议使用前先使用预览接口先发给本身的帐号测试看看效果,再用正式的接口。 ● 附带个疑问:不知道为何,上传图文消息素材获取不到最后的id,一直报错40007,可是新增永久图文素材的一直是正确的。闹心,查了很久也查不出来。40007不合法的媒体文件id