微信发送图文消息,支持多图文发送,微信官方要求用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);即可。
效果如下:
