设为首页 收藏本站
查看: 786|回复: 0

[经验分享] php开发微信公众账号开发包开发教程四之响应消息封装

[复制链接]

尚未签到

发表于 2017-4-13 12:35:32 | 显示全部楼层 |阅读模式
本文主要讲解如何处理如何向用户回复文本消息,语音信息等。本文中的指的信息时被动响应回复的信息,首先参见官方文档http://mp.weixin.qq.com/wiki/index.php?title=%E5%8F%91%E9%80%81%E8%A2%AB%E5%8A%A8%E5%93%8D%E5%BA%94%E6%B6%88%E6%81%AF
先分析一段文本回复信息的xml代码:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好]]></Content>
</xml>

当用户发送信息到公众号时,微信服务器将向我们的应用发送一段xml,即前一篇文章中所讲的内容,得到信息后我们可以向用户返回一些信息,比如语音,文本等。此时我们则需要按官方api中那样发送一段xml文本即可,读完全部回复信息分析发现每种类型回复信息的xml都有如下部分
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>12345678</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
</xml>

<MsgType>节点后面的元素根据不同回复的消息类型而改变,所以我们可以定义基类:

/**
* 回复消息基类
* @author Administrator
*
*/
abstract  class  AbstractBaseMessage {
protected $message;
protected  $fromUsername;
protected  $toUsername ;
protected  $time ;
/**
* 获取消息模板
*/
protected abstract function getMessageContent();
/**
*
* @param unknown_type $fromUsername 消息发送者
* @param unknown_type $toUsername 消息接收者
*/
public function __construct($toUsername,$fromUsername){
$this->time = time();
$this->fromUsername = $fromUsername;
$this->toUsername = $toUsername;
// echo "父类方法1..\n".$this->toUsername;
}
public function getMessage() {
$messageType = $this->getMessageType();
$tpl_header = "<xml>
<ToUserName><![CDATA[{$this->toUsername}]]></ToUserName>
<FromUserName><![CDATA[{$this->fromUsername}]]></FromUserName>
<CreateTime>{$this->time}</CreateTime>
<MsgType><![CDATA[{$messageType}]]></MsgType>";
$tpl_footer = "</xml>";
$this->message = $tpl_header.$this->getMessageContent().$tpl_footer;
return  $this->message;
}
protected  abstract  function getMessageType();
}

具体各类消息封装如下:

<?php
require_once 'message/response/AbstractBaseMessage.php';
/**
* 图片消息
* @author Administrator
*
*/
class ImageMessage extends AbstractBaseMessage{
private $mediaId ;
/**
*
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $mediaId 通过上传多媒体文件,得到的id。
*/
public function __construct($toUsername,$fromUsername,$mediaId){
$this->mediaId = $mediaId ;
parent::__construct($toUsername,$fromUsername);
}
protected function getMessageType() {
return "image" ;
}
/**
*
*/
protected function getMessageContent() {
return "<Image>
<MediaId><![CDATA[{$this->mediaId}]]></MediaId>
</Image>";
}
}
/**
* 音乐消息
* @author Administrator
*
*/
class MusicMessage extends AbstractBaseMessage{
private $musicUrl ;
private $hQMusicUrl ;
private $thumbMediaId ;
private $title;
private $description;
/**
*
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $title 音乐标题
* @param unknown_type $description音乐描述
* @param unknown_type $musicUrl音乐链接
* @param unknown_type $hQMusicUrl高质量音乐链接,WIFI环境优先使用该链接播放音乐
* @param unknown_type $thumbMediaId缩略图的媒体id,通过上传多媒体文件,得到的id
*/
public function __construct($toUsername,$fromUsername,$title,$description,$musicUrl,$hQMusicUrl,$thumbMediaId){
$this->title = $title;
$this->description = $title;
$this->musicUrl = $musicUrl ;
$this->hQMusicUrl = $hQMusicUrl;
$this->thumbMediaId = $thumbMediaId;
parent::__construct($toUsername,$fromUsername);
}
protected function getMessageType() {
return "music" ;
}
/**
*
*/
protected function getMessageContent() {
if($this->thumbMediaId == null){
return "<Music>
<Title><![CDATA[{$this->title}]]></Title>
<Description><![CDATA[{$this->description}]]></Description>
<MusicUrl><![CDATA[{$this->musicUrl}]]></MusicUrl>
<HQMusicUrl><![CDATA[{$this->hQMusicUrl}]]></HQMusicUrl>
</Music>";
}
return "<Music>
<Title><![CDATA[{$this->title}]]></Title>
<Description><![CDATA[{$this->description}]]></Description>
<MusicUrl><![CDATA[{$this->musicUrl}]]></MusicUrl>
<HQMusicUrl><![CDATA[{$this->hQMusicUrl}]]></HQMusicUrl>
<ThumbMediaId><![CDATA[{$this->thumbMediaId}]]></ThumbMediaId>
</Music>";
}
}
/**
* 图片文本信息
* @author Administrator
*
*/
class TextImageMessage extends AbstractBaseMessage{
private $params ;
/**
*
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $params
* @param unknown_type $description
* @param unknown_type $picUrl
* @param unknown_type $url
*/
public function __construct(){
$args  = func_get_args();
$arglen = count($args);
if($arglen ==3) {
call_user_func_array(array($this,"__construct1"),$args);
}else if($arglen == 6){
call_user_func_array(array($this,"__construct2"),$args);
}else {
die("args length is not 3 or 6");
}
}
/**
*
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $params ArticleItem或ArticleItem数组
*/
public function __construct1($toUsername,$fromUsername,$params) {
if(!is_array($params) && !($params instanceof ArticleItem)){
die("Argument 3 must be an instance of Array or ArticleItem");
}
$this->params = $params ;
parent::__construct($toUsername,$fromUsername);
}
/**
*
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $title
* @param unknown_type $description
* @param unknown_type $picUrl
* @param unknown_type $url
*/
public function __construct2($toUsername,$fromUsername,$title,$description,$picUrl,$url) {
$this->title = $title;
$this->description =$description;
$this->picUrl = $picUrl;
$this->url = $url;
parent::__construct($toUsername,$fromUsername);
}
protected function getMessageType() {
return "news" ;
}
/**
*
*/
protected function getMessageContent() {
print_r($this->params);
if(is_array($this->params)){
$len = count($this->params) ;
$str = "<ArticleCount>{$len}</ArticleCount>
<Articles>";
for ($i=0;$i<count($this->params);$i++){
if($this->params[$i] instanceof ArticleItem){
$str=$str."<item>
<Title><![CDATA[{$this->params[$i]->tilte}]]></Title>
<Description><![CDATA[{$this->params[$i]->description}]]></Description>
<PicUrl><![CDATA[{$this->params[$i]->picUrl}]]></PicUrl>
<Url><![CDATA[{$this->params[$i]->url}]]></Url>
</item>" ;
}else {
die("数组中第{$i}个元素不是 ArticleItem类型");
}
}
$str=$str."</Articles>";
return $str;
}elseif ($this->params instanceof ArticleItem){
return "<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[{$this->params->tilte}]]></Title>
<Description><![CDATA[{$this->params->description}]]></Description>
<PicUrl><![CDATA[{$this->params->picUrl}]]></PicUrl>
<Url><![CDATA[{$this->params->url}]]></Url>
</item>
</Articles>";
}else {
return "<ArticleCount>1</ArticleCount>
<Articles>
<item>
<Title><![CDATA[{$this->title}]]></Title>
<Description><![CDATA[{$this->description}]]></Description>
<PicUrl><![CDATA[{$this->picUrl}]]></PicUrl>
<Url><![CDATA[{$this->url}]]></Url>
</item>
</Articles>";
}
}
}
/**
* 文本消息
* @author Administrator
*
*/
class TextMessage extends AbstractBaseMessage{
private $content ;
/**
*
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $content 消息内容
*/
public function __construct($toUsername,$fromUsername,$content){
// echo "子类方法2..\n";
$this->content = $content ;
parent::__construct($toUsername,$fromUsername);
}
/**
*
*/
protected function getMessageContent() {
return "<Content><![CDATA[{$this->content}]]></Content>";
}
/**
*
*/
protected function getMessageType() {
return "text" ;
}

}
/**
* 视频消息
* @author Administrator
*
*/
class VideoMessage extends AbstractBaseMessage{
private $mediaId ;
private $title;
private $description;
/**
*
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $mediaId 通过上传多媒体文件,得到的id。
* @param unknown_type $title 视频消息的标题
* @param unknown_type $description 视频消息的描述
*/
public function __construct($toUsername,$fromUsername,$mediaId,$title,$description){
$this->mediaId = $mediaId ;
$this->title = $title;
$this->description = $title;
parent::__construct($toUsername,$fromUsername);
}
protected function getMessageType() {
return "video" ;
}
/**
*
*/
protected function getMessageContent() {
return "<Video>
<MediaId><![CDATA[{$this->mediaId}]]></MediaId>
<Title><![CDATA[{$this->title}]]></Title>
<Description><![CDATA[{$this->description}]]></Description>
</Video> ";
}
}
/**
* 语音消息
* @author Administrator
*
*/
class VoiceMessage extends AbstractBaseMessage{
private $mediaId ;
/**
*
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $mediaId 通过上传多媒体文件,得到的id。
*/
public function __construct($toUsername,$fromUsername,$mediaId){
$this->mediaId = $mediaId ;
parent::__construct($toUsername,$fromUsername);
}
protected function getMessageType() {
return "voice" ;
}
/**
*
*/
protected function getMessageContent() {
return "<Voice>
<MediaId><![CDATA[{$this->mediaId}]]></MediaId>
</Voice>";
}
}

发送图文消息时候如果有个条的时候需要使用的工具类:
/**
* 图片文本消息项
* @author Administrator
*
*/
class ArticleItem {
public $tilte;
public $description;
public $picUrl;
public $url;
/**
* 图片
* @param unknown_type $tilte
* @param unknown_type $description
* @param unknown_type $picUrl
* @param unknown_type $url
*/
public function __construct($tilte,$description,$picUrl,$url){
$this->tilte = $tilte;;
$this->description = $description;
$this->picUrl = $picUrl;
$this->url=$url;
}
}
然后定义一个消息发送工具类:

class MessageUtil {
/**
* 不可实例化
*/
private function __construct(){}
/**
* 发送文本消息
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $time
* @param unknown_type $contentStr
*/
public static function sendTextMessage($toUsername, $fromUsername, $contentStr){
$textMessage = new TextMessage($toUsername,$fromUsername,$contentStr);
echo $textMessage->getMessage();
}
/**
* 发送一条图文信息
* @param $fromUsername
* @param $toUsername
* @param $time
* @param $title
*/
public static function sendOneTextImageMessage($toUsername,$fromUsername,$title,$description, $picUlr,$url) {
$message = new TextImageMessage($toUsername,$fromUsername,$title,$description, $picUlr,$url);
echo $message->getMessage();
}
/**
* 发送多条文本图片消息
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param Array $items ArticleItem数组
*/
public static  function sendMoreTextImageMessage($toUsername,$fromUsername, $items) {
$message = new TextImageMessage($toUsername,$fromUsername,$items);
echo $message->getMessage();
}
/**
* 发送声音消息
* @param unknown_type $toUsername
* @param unknown_type $fromUsername
* @param unknown_type $mediaId
*/
public static function sendVoiceMessage($toUsername,$fromUsername,  $mediaId) {
$message = new VoiceMessage($toUsername,$fromUsername,$mediaId);
echo $message->getMessage();
}
/**
* 发送视频消息
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $mediaId
* @param unknown_type $title
* @param unknown_type $description
*/
public static function sendVideoMessage($fromUsername,$toUsername,$mediaId,$title,$description) {
$message = new VideoMessage($fromUsername,$toUsername,$mediaId,$title,$description);
echo $message->getMessage();
}
/**
* 发送音乐消息
* @param $fromUsername
* @param $toUsername
* @param $title
* @param $description
* @param $musicUrl
* @param $hQMusicUrl
* @param $thumbMediaId
*/
public static function sendMusicMessage($fromUsername,$toUsername,$title,$description,$musicUrl,$hQMusicUrl,$thumbMediaId) {
$message = new MusicMessage($fromUsername,$toUsername,$title,$description,$musicUrl,$hQMusicUrl,$thumbMediaId);
echo $message->getMessage();
}
/**
* 发送图片消息
* @param unknown_type $fromUsername
* @param unknown_type $toUsername
* @param unknown_type $mediaId
*/
public static  function sendImageMessage($fromUsername,$toUsername,$mediaId) {
$message = new ImageMessage($fromUsername,$toUsername,$mediaId);
echo $message->getMessage();
}
}

到此发送消息的类已经封装好了,我们需要发送一条文本信息的时候只需要MessageUtil中的方法即可。需要了解更多请继续关注

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-364497-1-1.html 上篇帖子: 用PHP开发企业Wifi网络Web认证系统(附源码) 下篇帖子: REST及其在PHP中的现状(包含某些资源抽象方法)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表