300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > PHP微信公众号开发——群发消息

PHP微信公众号开发——群发消息

时间:2020-06-23 23:57:51

相关推荐

PHP微信公众号开发——群发消息

一.官方文档

高级群发接口

https://mp./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./wiki...

● 素材管理

https://mp./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./cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN

看到后面需要用token,就知道,肯定也是需要获取到全局的token,再组装url。

● 参数说明

调用示例(使用curl命令,用FORM表单方式上传一个图片):

curl -F media=@test.jpg "https://api./cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN"

从官文中可以看出,图片名(带格式的图片名)需要在media(代表媒体)之后,并加@符号。

这里就涉及到CURL的知识:

curl上传:文件的标识@+相对路径

b.代码实现

注:以下是我的代码实现,大家可以根据自己的项目去实际编写

function addMaterial() {$access_token = $this->getWxAccessToken(); $url = "https://api./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./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./cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE$url = "https://api./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./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./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./cgi...

● 官文说明

2.代码实现

function uploadNews(){//1.获取全局access_token$access_token = $this->getWxAccessToken(); $url = "https://api./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./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./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./cgi...

● 官方说明

2.代码实现

//根据标签进行群发function sendAllByTag(){//1.获取全局access_token$access_token = $this->getWxAccessToken(); $url = "https://api./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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。