摘要:关于上传图文消息素材和新增永久图文素材的区别上传图文消息素材等于是直接把图文素材传到微信的服务器,每次凭借获取素材,并且不占用素材库新增永久图文素材在开发者和微信服务器之间,多了一个素材库。
**说明
1.文章和有道笔记几乎内容相同,所以如果有人在有道上有幸看到一样的文章,应该也是我写的,除非是全部复制
2.内容会较长,故会拆分多篇文章讲解
3.目前基本的群发已记录完结,如果后续有补充,会作说明**
一.官方文档
高级群发接口
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...
● 官文说明
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("这是一个测试文章——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; }
注意
● 认证后的服务号每个月就4次群发消息机会!!!请谨慎...建议使用前先使用预览接口先发给自己的账号测试看看效果,再用正式的接口。
● 附带个疑问:不知道为什么,上传图文消息素材获取不到最后的id,一直报错40007,但是新增永久图文素材的一直是正确的。闹心,查了好久也查不出来。
40007不合法的媒体文件id
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/22015.html
摘要:此接口主要用于客服等有人工消息处理环节的功能,方便开发者为用户提供更加优质的服务。不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息。 1、关于群发接口和消息接口 关于群发接口1.订阅号每天可以群发消息一条,服务号每月(自然月)四条的群发权限。开发者模式下,可以通过高级群发接口,实现更灵活的群发能力。2.注意● 对于认证订阅号,群发接口每天可成功调用1次,此次群发可选择发送给全...
摘要:微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习以上就是模板消息,只有文字和跳转链接,没有封面图。 微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习 showImg(https://segmentfault.com/img/bV1Zj2?w=341&h=610); 以上就是模板消息,只有文字和跳转链接,没有封面图。在服务号的后台添加功能插...
摘要:微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习以上就是模板消息,只有文字和跳转链接,没有封面图。 微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习 showImg(https://segmentfault.com/img/bV1Zj2?w=341&h=610); 以上就是模板消息,只有文字和跳转链接,没有封面图。在服务号的后台添加功能插...
摘要:微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习以上就是模板消息,只有文字和跳转链接,没有封面图。 微信认证的服务号才有推送模板消息接口所以本文需要在认证服务号的情况下学习 showImg(https://segmentfault.com/img/bV1Zj2?w=341&h=610); 以上就是模板消息,只有文字和跳转链接,没有封面图。在服务号的后台添加功能插...
阅读 1788·2021-09-23 11:21
阅读 668·2019-08-30 15:55
阅读 795·2019-08-29 15:40
阅读 474·2019-08-29 12:56
阅读 3141·2019-08-26 12:00
阅读 3519·2019-08-23 18:24
阅读 2230·2019-08-23 17:08
阅读 1618·2019-08-23 17:03