【php】微信公众帐号开发接口--消息回复

一、简介

微信公众平台提供了三种消息回复的格式,即文本回复、图文回复和音乐回复,在这里我想跟大家分享下自己的体会,以供读者使用。


二、文本回复

 文本回复xml 结构

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[content]]></Content>
</xml>
说明:ToUserName表示接收消息方帐号,即发送请求消息的用户。填写的值是$fromUsername = $postObj->FromUserName


我们可以将该结构封装成函数,在需要回复文本的地方直接调用:

function response_text($object,$content)
{
    $textTpl = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>".time()."</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[%s]]></Content>
                <FuncFlag>%d</FuncFlag>
                </xml>";
    $resultStr = sprintf($textTpl, $object->FromUserName, $object->ToUserName, $content, $flag);
    return $resultStr;
}
说明:sprintf函数根据格式textTpl,依次输入参数。


实际程序调用上述函数

实现普通文本回复:

public function handleText($postObj)
{
        $keyword = trim($postObj->Content);
 
        if(!empty( $keyword ))
        {
            $contentStr = "微信公众平台-普通文本回复功能源代码";
            $resultStr = _response_text($postObj,$contentStr);
            echo $resultStr;
        }else{
            echo "Input something...";
        }
}
说明:trim 是为了去掉字符串首尾的空格

实现关注时回复:

public function handleEvent($object)
{
        $from_MsgType = $object->Event;
        if ($from_MsgType == "subscribe")        
        { 
            $contentStr = "感谢您关注【你的帐号名】"."\n"."微信号:your account";
        }
       
        $resultStr = _response_text($object, $contentStr);
        return $resultStr;
}
说明:"感谢您关注【你的帐号名】"."\n"."微信号:your account"。本行代码中插入了一个换行符,我们采用'.'拼接两个字符串

三、图文消息回复

图文回复xml 结构

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[title1]]></Title>
<Description><![CDATA[description1]]></Description>
<PicUrl><![CDATA[picurl]]></PicUrl>
<Url><![CDATA[url]]></Url>
</item>
</Articles>
<FuncFlag>0</FuncFlag>
</xml>
说明:

ToUserName 接收方帐号(收到的OpenID)
FromUserName 开发者微信号
CreateTime 消息创建时间 (整型)
MsgType news
可以看出,前四个参数与文本消息相同,不同之处在于MsgType 由text 变为news了。

ArticleCount 图文消息个数,限制为10条以内。此处为1,表示有单图文消息
Articles 多条图文消息信息,默认第一个item为大图,注意,如果图文数超过10,则将会无响应
Title 图文消息标题
Description 图文消息描述
PicUrl 图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
Url 点击图文消息跳转链接

单图文消息

如果只是发送单图文消息,我们已经可以直接调用函数,传入参数即可实现首次关注发送单图文消息,完整代码如下:

	private function transmitNews($object, $ArticleCount, $Title,
				$Description, $PicUrl, $Url, $flag = 0)
	{
		$newsTpl = "<xml>
					<ToUserName><![CDATA[%s]]></ToUserName>
					<FromUserName><![CDATA[%s]]></FromUserName>
					<CreateTime>".time()."</CreateTime>
					<MsgType><![CDATA[news]]></MsgType>
					<ArticleCount>%s</ArticleCount>
					<Articles>
					<item>
					<Title><![CDATA[%s]]></Title>
					<Description><![CDATA[%s]]></Description>
					<PicUrl><![CDATA[%s]]><PicUrl>
					<Url><![CDATA[%s]]></Url>
					</item>
					</Articles>
					<FuncFlag>%d</FuncFlag>
					</xml>";    
		$resultStr = sprintf($newsTpl, $object->FromUserName, 
			$object->ToUserName, $ArticleCount, $Title, $Description, 
			$PicUrl, $Url, $flag);
		return $resultStr;		
	}

具体步骤,请参考 青龙老贼的文章

多图文消息

多图文消息与单图文消息基本类似,在标签<item>...</item>之后在插入一个或者多个<item>...</item>。

在讨论多图文之前,我们先对单图文消息结构做一些变动。此时我们将消息结构分解为三层,头部,主体,尾部,如下所示:

$newsTplHead = "<xml>
                <ToUserName><![CDATA[%s]]></ToUserName>
                <FromUserName><![CDATA[%s]]></FromUserName>
                <CreateTime>%s</CreateTime>
                <MsgType><![CDATA[news]]></MsgType>
                <ArticleCount>2</ArticleCount>
                <Articles>";
$newsTplBody1 = "<item>
                <Title><![CDATA[%s]]></Title>
                <Description><![CDATA[%s]]></Description>
                <PicUrl><![CDATA[%s]]></PicUrl>
                <Url><![CDATA[%s]]></Url>
                </item>";

$newsTplBody2 = "<item>
                <Title><![CDATA[%s]]></Title>
                <Description><![CDATA[%s]]></Description>
                <PicUrl><![CDATA[%s]]></PicUrl>
                <Url><![CDATA[%s]]></Url>
                </item>";

$newsTplFoot = "</Articles> 
                <FuncFlag>0</FuncFlag> 
                </xml>";

此时,调用单图文消息函数可以修改为:

//输出图文消息
	private function transmitSingalNews($object, $newsContent)
	{
		$newsTplHead = "<xml>
					<ToUserName><![CDATA[%s]]></ToUserName>
					<FromUserName><![CDATA[%s]]></FromUserName>
					<CreateTime>".time()."</CreateTime>
					<MsgType><![CDATA[news]]></MsgType>
					<ArticleCount>1</ArticleCount>
					<Articles>";
		$newsTplBody = "	<item>
					<Title><![CDATA[%s]]></Title>
					<Description><![CDATA[%s]]></Description>
					<PicUrl><![CDATA[%s]]><PicUrl>
					<Url><![CDATA[%s]]></Url>
					</item>";
		$newsTplFoot = "</Articles>
					<FuncFlag>%d</FuncFlag>
					</xml>";    
		
		//图文消息开头
		//$bodyCount = 1;
		$head = sprintf($newsTplHead, $object->FromUserName, $object->ToUserName);

		//图文消息内容
		$Title = $newsContent['Title'];
		$Description = $newsContent['Description'];
		$PicUrl = $newsContent['PicUrl'];
		$Url = $newsContent['Url'];
		$body = sprintf($newsTplBody, $Title, $Description, $PicUrl, $Url);

		$FuncFlag = 0;
		$foot = sprintf($newsTplFoot, $FuncFlag);

		return $head.$body.$foot;		
	}

那么,只需要将newsContent数组设置为多维数组,循环载入数组参数值到newsTplBody中,即可实现自动回复单图文消息

稍作改动即可实现多图文消息,如下所示:

//输出多图文消息
	private function transmitMultiNews($object, $newsContent)
	{
		$newsTplHead = "<xml>
					<ToUserName><![CDATA[%s]]></ToUserName>
					<FromUserName><![CDATA[%s]]></FromUserName>
					<CreateTime>".time()."</CreateTime>
					<MsgType><![CDATA[news]]></MsgType>
					<ArticleCount>%d</ArticleCount>
					<Articles>";
		$newsTplBody = "<item>
					<Title><![CDATA[%s]]></Title>
					<Description><![CDATA[%s]]></Description>
					<PicUrl><![CDATA[%s]]></PicUrl>
					<Url><![CDATA[%s]]></Url>
					</item>";
		$newsTplFoot = "</Articles>
					<FuncFlag>%d</FuncFlag>
					</xml>";    
		//图文消息开头
		$bodyCount = count($newsContent);
		$head = sprintf($newsTplHead, $object->FromUserName, $object->ToUserName,
						$bodyCount);

		//图文消息主要内容
		foreach ($newsContent as $key=>$value)
		{
			$body.=sprintf($newsTplBody, $value['Title'], $value['Description'],
						$value['PicUrl'], $value['Url']);
		}

		$FuncFlag = 0;
		$foot = sprintf($newsTplFoot, $FuncFlag);

		return $head.$body.$foot;		
		
	}

我们采用foreeach语句对数组遍历。
foreach()有两种用法:

1: foreach(array_name as $value)    {     

statement;  

}

这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环回得到下一个元素。

例如,foreach($newsContent as $value)即表示将数组$newsContent的值赋给$value,从而我们可以在sprintf函数中引用变量$value向消息模板$newsTplBody传值。

2:foreach(array_name as $key => $value)    {     

  statement;    

} 

这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。比如newsContent['Title']= 'String'中的“TItle”

你可能感兴趣的:(【php】微信公众帐号开发接口--消息回复)