微信发送图文消息,支持多图文发送,微信官方要求用xml格式发送,所以第一种方式就是直接将xml做一个模板,然后用sprintf函数进行格式,大概如下:
$xmlTpl = "<xml> <ToUserName><![CDATA[%s]]></ToUserName> <FromUserName><![CDATA[%s]]></FromUserName> <CreateTime>%s</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[%s]]></Content> </xml>"; $result = sprintf($xmlTpl, $pushData['FromUserName'], $pushData['ToUserName'], time(), $content);
如果是图文的话用图文的模板即可,最后直接echo $result;exit();就可以实现了。
第二种方式是把数据放到数组里面,然后对数组进行xml格式转换即可,要注意的问题是多维数组的递归转换和微信xml回复格式的正确性验证,多图文如下:
//回复图文消息 public static function transmitNews($postArr,$newsList) { $list = []; foreach ($newsList as $key => $item){ $list['item['.$key.']'] = [ 'Title'=>str_replace('%','点',$item['title']), 'Description'=>'点击进入详情', 'PicUrl'=>$item['pic'], 'Url'=>$item['url'], ]; } $arr = [ 'ToUserName'=>$postArr['FromUserName'], 'FromUserName'=>$postArr['ToUserName'], 'CreateTime'=>time(), 'MsgType'=>'news', 'ArticleCount'=>count($newsList), 'Articles'=>[$list], ]; return self::arr2xml($arr); }
//这个是递归转换数组到xml的方法: private static function arr2xml($data, $root = true){ $str=""; if($root)$str .= "<xml>"; foreach($data as $key => $val){ //去掉key中的下标[] $key = preg_replace('/\[\d*\]/', '', $key); if(is_array($val)){ $child = arr2xml($val, false); $str .= "<$key>$child</$key>"; }else{ $str.= "<$key><![CDATA[$val]]></$key>"; } } if($root)$str .= "</xml>"; return $str; }最后echo $obj::$transmitNews($postArr,$newsList);即可。
效果如下: