PHP微信开发入门(二)

微信服务器消息推送

微信的消息推送方式是客户操作微信发生一系列事件,然后腾讯微信服务器发送一个XML数据POST请求把事件描述发送到你填写的服务器URL上,你的服务器处理完结果后,将数据输出给微信服务器。

  • 示例代码
<?php
class Response {
	/*
	 * 自动回复类
	 * 
	 * @param string $openid
	 * 
	 */
	public function responseMsg($openid) {
		/*
		 * 在最新版本PHP里面去掉了全局post的数据
		 * 所以我们用
		 * file_get_contents ( 'php://input', 'r' )
		 * 方法来获取xml数据
		 */
		@$postStr = file_get_contents ( 'php://input', 'r' );
		if (! empty ( $postStr )) {
			//设置时区
			date_default_timezone_set ( "PRC" );
			$date = date ( "Y-m-d h:i:s" );
			
			//加载解析xml数据
			libxml_disable_entity_loader ( true );
			$postObj = simplexml_load_string ( $postStr, 'SimpleXMLElement', LIBXML_NOCDATA );
			
			//读出xml树里面的节点对象
			//取得发送方的id
			$fromUsername = $postObj->FromUserName;
			
			//取得接收方的id(你的公众号id)
			$toUsername = $postObj->ToUserName;
			
			//取得消息类型
			$type = $postObj->MsgType;
			//取得服务器当前时间
			$time = time ();
			
			//判断消息类型
			switch ($type) {
				//文本消息
				case "text" :
					//这里也可以用case或者是数据库模糊匹配人工智能等筛选并返回回答数据
					
					//取得用户发送的文本消息
					$keyword = htmlspecialchars ( trim ( $postObj->Content ) );
					if ($keyword == "你好") {
						$contentStr = "你也好哟";
						echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
						break;
					} else {
						$contentStr = "啥?你说啥?";
						echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
						break;
					}
				//图片消息
				case "image" :
					$contentStr = "谢谢哟,我会好好保存的";
					echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
					//获取用户发送的图片
					$img = file_get_contents ( $postObj->PicUrl );
					break;
				//声音消息
				case "voice" :
					$contentStr = "我现在听不懂说话的啦";
					echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
					break;
				//位置消息
				case "location" :
					//取得用户发送的地址信息,并且返回消息加上用户地址给用户
					$contentStr = "原来你在 " . $postObj->Label . "呀";
					echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
					break;
				//小视频
				case "shortvideo" :
					//取得视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
					$vimg = $postObj->ThumbMediaId;
					//取得视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
					$video=$postObj->MediaId ;
					
					$contentStr = "这啥小视频???";
					echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
					break;
				//视频消息
				case "video" :
					//取得视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
					$vimg = $postObj->ThumbMediaId;
					//取得视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
					$video=$postObj->MediaId ;
					
					$contentStr = "这啥视频???";
					echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
					break;
				//链接消息
				case "link":
					$titel=$postObj->Title;
					$Description=$postObj->Description;
					$Url=$postObj->Url;
					
					$contentStr ="链接标题是->{$titel} 描述是{$Description} 链接地址是{$Url}";
					echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
					break;
				case "event":
					$contentStr ="这是事件";
					echo $this->SendText ( $fromUsername, $toUsername, $time, $contentStr );
					break;
			}
		}
	}
	/*
	 * 构造发送数据的方法
	 * 
	 * @param String $toU 公众号的id
	 * 
	 * @param String $fromU 用户的ID
	 * 
	 * @param int $time 服务器当前时间
	 * 
	 * @param String $msg 文本消息内容
	 * 
	 * @return 返回xml数据
	 * 
	 */
	public function SendText($toU, $fromU, $time, $msg) {
		$xml = "<xml>
		<ToUserName><![CDATA[{$toU}]]></ToUserName>
		<FromUserName><![CDATA[{$fromU}]]></FromUserName>
		<CreateTime>{$time}</CreateTime>
		<MsgType><![CDATA[text]]></MsgType>
		<Content><![CDATA[{$msg}]]></Content>
		</xml>";
		return $xml;
	}
}

在后面我们可以构造一个xml类来合成处理各种消息的推送方法。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端之路

Sql注入

关于防范Sql注入也是安全测试老生常谈的问题。 首先说一下,攻击者之所以可以利用自己输入的数据来达到攻击网站的目的,原因就在于SQL语言作为一种解释型语言,它的...

2248
来自专栏高性能服务器开发

『腾讯后台开发』实习生技能要求

1462
来自专栏MongoDB中文社区

MongoDB 新功能介绍-Change Streams

MongoDB 3.6已经GA有一段时间,网络上对于该版本新特性的详细介绍文章比较少为此借机会对部分新特性做一个相对详细的介绍。基于早期MongoDB版本实现如...

2662
来自专栏XAI

【Python3-API】情感倾向分析示例代码

Python3-urllib3-API情感倾向分析示例代码 AccessToken获取可以参考:http://ai.baidu.com/forum/topic/...

3149
来自专栏李家的小酒馆

通过Python实现一个文档的半自动录入工具

  因为公司需要将word办的接口文档在线化,看起来是个很好的事情,但是就是苦逼了我们这些干活的,其中工程量最大的就是参数的录入,要是参数少也罢,有的接口动辄三...

961
来自专栏达摩兵的技术空间

vue项目实践003

通过本问将看到我在vue的项目中,进行的一系列的项目优化,然后看到不同的维度将这些点进行分类。

1092
来自专栏Java架构

深入理解Java虚拟机到底是什么什么是Java虚拟机从进程的角度解释JVM

1765
来自专栏玄魂工作室

老司机教你下载tumblr上视频和图片的正确姿势

本文面向初学者。 很多同学问我:“我非常想学Python编程,但是找不到兴趣点”。 还有的同学呢,找到了很好的兴趣点,但是无从下手,“玄魂老师,我想下载tumb...

1.1K7
来自专栏CDA数据分析师

Python开发:缓存机制介绍

缓存是一种将定量数据加以保存以备迎合后续请求的处理方式,旨在加快数据的检索速度。在今天的文章中,我们将一同从简单示例出发,了解如何使用缓存机制。在此之后,我们将...

2809
来自专栏ytkah

finecms栏目文章页seo设置

  finecms栏目页和文章页默认的标题是页面title_二级栏目title_一级栏目title_网站名称(比如:finecms怎么设置标题_finecms二...

2826

扫码关注云+社区