文档章节

PHP微信开发入门(二)

Pulsar-V
 Pulsar-V
发布于 2016/07/08 20:45
字数 853
阅读 36
收藏 0
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类来合成处理各种消息的推送方法。

© 著作权归作者所有

共有 人打赏支持
Pulsar-V

Pulsar-V

粉丝 52
博文 107
码字总数 80955
作品 1
成都
后端工程师
私信 提问
移动开发之微信小程序——资料集合

本文转载自:知乎 有需要下载的客官可可以点击知乎去下载相关资料 一:官方地址集合: 1:官方工具:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=1476434678461 2:...

DJY1992
2016/12/21
0
0
你应该用3个小时学会编程

文章摘要: 人每天都在进行编程工作,编程对于人来说是很自然的. 你完全有能力在3个小时内学会编程. 也有必要闪电般的学会编程,以确认你是否喜欢这一行,并降低学习. 本文中的实验者–一个0基础...

燕十八
2014/01/07
0
0
微信公众号开发入门中遇到的坑

微信公众号开发和正常的API开发区别不是很大,区别在于:我们需要按照他的一些规定输出(echo 打印) XML数据,大体思路如下: 所有的入口都是调你的 index.php (主页)API ,区别在于不同的...

满损谦益
2017/12/05
0
0
微信小程序视频教程

微信小程序视频教程,微信小程序项目实战,微信小程序基础入门教程 本文出自 “php ecshop 二次开发” 博客,请务必保留此出处http://phpecshop.blog.51cto.com/6296699/1862940 NideShop微信小...

ch10mmt
2016/10/18
0
0
微信小程序免费视频+精品教程合集+demo合集(长期更新,推荐收藏)

1:官方工具:https://mp.weixin.qq.com/debug/w ... tml?t=1476434678461 2:简易教程:https://mp.weixin.qq.com/debug/wxadoc/dev/?t=1476434677599 3:设计指南:https://mp.weixin.qq.......

qianmenchuxue
2016/10/22
706
0

没有更多内容

加载失败,请刷新页面

加载更多

eslint rules 规则

'rules': { "comma-dangle": ["error", "never"], //是否允许对象中出现结尾逗号 "no-cond-assign": 2, //条件语句的条件中不允许出现赋值运算符 "no-console": 2, //不允许出现console语句 ...

agenyun
34分钟前
1
0
类型判断时instanceof和equals的不同用法

接口设计时为了避免序列化的麻烦,将接口定义为参数为map<String,String>类型的接口,但是现在调用时需要转换当前的实体Bean为Map,接口接收方再把Map转换为另一个Bean实体。过程中的需要对类...

wangtx
41分钟前
1
0
vue 组件间传值(个人精编)

1.父组件向子组件传值 1⃣️.子组件标签绑定需要传递的参数名2⃣️.子组件页面使用props 接收参数 2.子组件向父组件传值  1⃣️.子组件使用$emit来触发一个自定义事件,并传递一个参...

MrBoyce
51分钟前
1
0
(荷兰)彼得·冯·门施著:博物馆学研究的目的

博物馆学研究的目的 (荷)彼得·冯·门施 尽管诸多关于博物馆学认知目的的不同看法可以被归纳为数个主要群体,但没有一个群体可以被称为“学派”。一般来说,学派是由于博物馆学研究目的的不...

乔老哥
今天
2
0
Vue slot的用法

之前看官方文档,由于自己理解的偏差,不知道slot是干嘛的,看到小标题,使用Slot分发内容,就以为 是要往下派发内容。然后就没有理解插槽的概念。其实说白了,使用slot就是先圈一块地,将来...

peakedness丶
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部