前面说到的都是一条一条的回复给用户消息,如果想要一次性发给多个用户,就要使用微信提供的群发接口了。
微信群发需要注意(其实就是微信文档里面的内容):
1.次数不一样,认证的订阅号可以每天发送一条群发消息,而认证的服务号虽然每天可以发送100条,但是用户每月只能接收四条,多余四条的将发送失败。
2.群发的时候,认证的订阅号每天只能使用is_to_all群发一次或者在公众平台群发一次。相应的,服务号每个月公众平台群发+is_to_all群发最多只能四次。
根据标签群发
1.这个接口是通过post请求的,请求参数根据群发的内容略有不同。
2.tagid就是以前的分组id现在改名叫标签,在微信公众平台->用户管理的右侧可以看到已经创建的标签名,获得标签id需要通过接口来获得已经创建的所有标签的id。
3.当is_to_all为true时,可以选择不填写tagid。
4.media_id需要通过微信上传素材接口获得。
5.群发接口可以发送卡券,cardid需要通过创建卡券获得或者卡券相关事件推送获得。
/** *根据标签进行群发 */ public function pushByTags(){ $access_token=get_token(); $url="https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=".$access_token; $data=array( 'filter'=>array( 'is_to_all'=>false, 'tag_id'=>135 ), 'text'=>array( 'content'=>'test' ), 'msgtype'=>'text' ); $result=json_decode(curl($url,json_encode($data)),true); if($result['errcode']==0){ echo "群发成功"; M('monthtuisong')->add(array('msgid'=>$result['msg_id'])); }else{ echo "群发失败"; } }
返回errcode=0只是意味着群发任务提交成功,并不意味着群发结束,后续的群发过程中可能受到各种因素的影响,需要一段时间才能群发完毕。
根据openid列表群发
1.根据openid列表进行群发和根据标签群发基本相似,只有第一个参数是不同的。根据标签群发的第一个参数是filter而这个是touser,touser里面是
需要群发的openid列表。
2.只有服务号可用,订阅号不可用。
public function pushByOpenIdList(){ $access_token=get_token(); $url="https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=".$access_token; $data=array( 'touser'=>array('xxx','yyy'),//填写你要发的ID 'text'=>array( 'content'=>'test' ), 'msgtype'=>'text' ); $result=json_decode(curl($url,json_encode($data)),true); if($result['errcode']==0){ echo "群发成功"; M('monthtuisong')->add(array('msgid'=>$result['msg_id'],'shijian'=>time())); }else{ echo "群发失败:原因:".$result['errmsg']; } }
删除群发
删除群发适用于,当群发过后发现群发消息不对的时候,可以使用接口进行删除这次群发。
1.msg_id是群发消息成功后返回的msgid。
2.删除接口只能删除图文和视频,其他类型的不能删除。
3.删除图文只是将图文详情页失效,但是图文的消息卡片用户在本地还是可以看到。
4.如果多次群发的都是用一个media_id类型的素材,删除掉其中一个群发,会将所有这个素材的群发全部失效。
public function deletePushAll(){ $access_token=get_token(); $url="https://api.weixin.qq.com/cgi-bin/message/mass/delete?access_token=".$access_token; $data=array('msg_id'=>1000000005); $result=json_decode(curl($url,json_encode($data)),true); if($result['errcode']==0){ echo "删除群发成功"; }else{ echo "群发失败:原因:".$result['errmsg']; } }
预览接口
1、预览接口可以将消息发送给一个指定的用户,可以查看消息的样式和排版,但是每天只有100次,需要谨慎使用。
public function previewPush(){ $access_token=get_token(); $url="https://api.weixin.qq.com/cgi-bin/message/mass/preview?access_token=".$access_token; $data=array( 'touser'=>'odys8xDP3L7UP1nXoDFrevFqO6KQ', 'text'=>array( 'content'=>'test' ), 'msgtype'=>'text' ); $result=json_decode(curl($url,json_encode($data)),true); }
群发消息查询
这个接口是用来查询已经发送的消息的状态,msg_id是提交群发任务成功后返回的一个标识。如果返回SEND_SUCCESS说明已经全部群发成功。
public function selectPush(){ $access_token=get_token(); $url="https://api.weixin.qq.com/cgi-bin/message/mass/get?access_token=".$access_token; $data=array('msg_id'=>1000000005); $result=json_decode(curl($url,json_encode($data)),true); var_dump($result);exit; }
查询结果:
群发事件推送
在群发快要成功的时候,微信会推送一个XML结构以事件的形式推送到开发者的URL上,开发者可以根据返回的结构来分析这个消息发送了多少人,成功的有多少,失败的有多少。
public function masssendjobfinish(){ $msgid=$this->msgId; $total=$this->totalCount ; $filter=$this->filterCount; $sendCount=$this->sentCount; $errorCount=$this->errorCount; $data=array( 'totalcount'=>$total, 'filtercount'=>$filter, 'sendcount'=>$sendCount, 'errorcount'=>$errorcount ); plog($data); M('monthtuisong')->where(array('msgid'=>$msgid))->save($data); }