文档章节

微信公众号在开发模式下与php进行通信及回复消息

webphp
 webphp
发布于 2017/07/26 11:28
字数 730
阅读 14
收藏 0

码上生花,ECharts 作品展示赛正式启动!>>>

微信公众号平台在开发模式下可以在php中根据微信的对外接口,可以自定义业务逻辑的处理,今天在这里对微信公众号的订阅成功以后回复文本信息及回复图文信息进行php开发
<?php
define ( 'TOKEN', 微信公众号中的令牌Token );
$apitest = new callbackApiTest ();
$apitest->valid ();//token验证

class callbackApiTest {
	/**
	 * 验证token
	 */
	public function valid() {
		$echoStr = $_GET ["echostr"];//随机字符数
		if ($this->checkSignature ( $echoStr )) {
			echo $echoStr;
			exit ();
		}
	}
	/**
	 * 接收公众平台get传递的值及验证
	 */
	private function checkSignature($echoStr="") {
		if (! defined ( "TOKEN" )) {
			throw new Exception ( "TOKEN is not defined!" );
		}
		$nonce = $_GET ['nonce'];
		$signature = $_GET ["signature"];
		$timestamp = $_GET ['timestamp'];
		$token = TOKEN;
		$tmpArr = array (
				$token,
				$timestamp,
				$nonce 
		);
		// use SORT_STRING rule
		sort ( $tmpArr, SORT_STRING );
		$tmpStr = implode ( $tmpArr );
		$tmpStr = sha1 ( $tmpStr );
		////只在初次订阅的时候才会有随机码echostr的输出
		if ($tmpStr == $signature && $echoStr) {
			return true;
		} else {
			$this->reponseMsg ();
		}
	}
	
	/**
	 * 接收事件推送
	 */
	public function reponseMsg() {
		// 1、获取到微信推送过来post数据(xml格式)
		$postArr = $GLOBALS['HTTP_RAW_POST_DATA'];
		// 2、处理消息类型,并设置回复类型和内容
		if (! empty ( $postArr )) {
			libxml_disable_entity_loader ( true ); // 是防止XML外部实体注入,做为转化xml包的安全防御
			$postObj = simplexml_load_string ( $postArr, 'SimpleXMLElement', LIBXML_NOCDATA ); // 将xml转化为对象
			if (strtolower ( $postObj->MsgType ) == 'event') {
				if (strtolower ( $postObj->Event ) == 'subscribe') {
					$msgType = 'text';
					$content = '欢迎关注公众帐号';
					$this->getMsgTextTemplate($postObj,$msgType,$content);
				}
			//如果接收的是文本消息,按用户发送的内容自动回复消息	
			}elseif( strtolower( $postObj->MsgType ) == 'text' ){
				switch ( trim($postObj->Content) ){
					case 1:
					$msgType = 'text';
					$content = '你发送的消息为1';
					$this->getMsgTextTemplate($postObj,$msgType,$content);
					break;					
					case 2:
					$msgType = 'text';
					$content = '你发送的消息为2';
					$this->getMsgTextTemplate($postObj,$msgType,$content);
					break;
					case '图文':
					$newsArray = $this->getNewsArr();
					$this->getMsgNewsTemplate($postObj, 'news', $newsArray);
					break;
				}
			}
			
			
		}
	}
	
	//获取发送TEXT文件消息
	public function getMsgTextTemplate($postObj,$msgType,$content){
		$template = "<xml>
				<ToUserName><![CDATA[%s]]></ToUserName>
				<FromUserName><![CDATA[%s]]></FromUserName>
				<CreateTime>%s</CreateTime>
				<MsgType><![CDATA[%s]]></MsgType>
				<Content><![CDATA[%s]]></Content>
				</xml>";
		$toUserName = $postObj->FromUserName;
		$fromUserName = $postObj->ToUserName;
		$time = time ();
		$resultStr = sprintf ( $template, $toUserName, $fromUserName, $time, $msgType, $content );
		echo $resultStr;
	}
	
	/**
	 * 获取图文数据
	 */
	public function getNewsArr(){
		$arr = array(
				array(
						'title'=>'习近平出席英国女王举行的欢迎仪式',
						'description'=>'进行国事访问的国家主席习近平出席了英国女王伊丽莎白二世在伦敦骑兵检阅场举行的隆重欢迎仪式。',
						'picurl'=>'http://himg2.huanqiu.com/attachment2010/2015/1020/19/49/20151020074926561.jpg',
						'url'=>'http://world.huanqiu.com/exclusive/2015-10/7802368.html?from=bdwz',
				),
				array(
						'title'=>'澳大利亚一架客机与闪电“擦肩而过”瞬间',
						'description'=>'澳大利亚悉尼遭遇暴风雨天气,坎塔斯航空公司的一架客机在准备降落悉尼机场时,险些被闪电击中',
						'picurl'=>'http://upload.cankaoxiaoxi.com/2015/1020/thumb_114_84_1445339792572.jpg',
						'url'=>'http://www.cankaoxiaoxi.com/photo/20151020/971513.shtml',
				),
				
		);
		return $arr;
	}
	//发送图文消息
	public function getMsgNewsTemplate($postObj, $msgType, $newsArray){
		
		$template="<xml>
						<ToUserName><![CDATA[%s]]></ToUserName>
						<FromUserName><![CDATA[%s]]></FromUserName>
						<CreateTime>%s</CreateTime>
						<MsgType><![CDATA[%s]]></MsgType>
						<ArticleCount>".count($newsArray)."</ArticleCount>
						<Articles>";
		foreach($newsArray as $k => $v){
			$template.="<item>
							<Title><![CDATA[".$v['title']."]]></Title> 
							<Description><![CDATA[".$v['description']."]]></Description>
							<PicUrl><![CDATA[".$v['picurl']."]]></PicUrl>
							<Url><![CDATA[".$v['url']."]]></Url>
							</item>";
		}		
		$template.="</Articles>
						</xml> ";
		$toUserName = $postObj->FromUserName;
		$fromUserName = $postObj->ToUserName;
		$time = time();			
		$resultStr = sprintf($template, $toUserName, $fromUserName, $time, $msgType);
		echo $resultStr;
	}

}
 

© 著作权归作者所有

webphp
粉丝 1
博文 92
码字总数 92338
作品 0
海淀
程序员
私信 提问
加载中
请先登录后再评论。
微信公众号开发之连简单的自动回复都不能实现

各位网友: 我们公司安排我们做微信公众号接口开发,就是由编辑模式进入开发模式,接入自己的服务器。所以我就去图书馆借了本书《微信公众平台搭建、开发与实践指南》照着搭建环境和敲代码,...

在我的歌声里
2017/02/04
734
2
微信公众号开发遇到奇怪的问题

各位网友: 我们公司安排我们做微信公众号接口开发,就是由编辑模式进入开发模式,接入自己的服务器。所以我就去图书馆借了本书《微信公众平台搭建、开发与实践指南》照着搭建环境和敲代码,...

在我的歌声里
2017/02/04
213
1
PHP开发微信被动回复消息遇到的大坑

最近开始做CMS后台与微信公众号的整合,在做被动回复消息时,按照官方文档的XML格式回复消息,总是提示“该公众号提供的服务出现故障,请稍后再试”。但是通过微信提供的接口调试工具看我的接...

osc_x4nw3ehr
2018/03/31
7
0
Java 微信公众号开发_学习笔记

一、课程介绍   本套课程的学习内容,开发语言   微信公众号介绍,申请以及后台设置详解   编辑模式下的消息回复,菜单建立,素材管理等   开发前的环境搭建以及工具准备   开发者...

osc_z1hvg4cu
2018/04/24
4
0
微信公众号开发者模式介绍及接入

Java公众号开发环境搭建 需要准备的东西: 一个微信公众号,参考:微信公众号申请及介绍 内网穿透工具,参考:使用natapp开启内网穿透之旅 数据交互 编辑模式和开发模式的关系: 编辑模式和开...

ZeroOne01
2018/06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

硬核揭露:350美元的反5G量子设备,竟只是128M的U盘

   “5G 信号一传播,正在飞的鸟儿立刻掉地上死了。”    “5G 基站会致癌,还会提升自杀率,甚至能传播新冠病毒。”    这些耸人听闻的言论,是 5G 技术阴谋论宣扬者经常挂在嘴边的话...

osc_91g5cdgs
21分钟前
10
0
微服务海量日志监控平台

前面几章蜻蜓点水的介绍了elasticsearch、apm相关的内容。本片主要介绍怎么使用ELK Stack帮助我们打造一个支撑起日产TB级的日志监控系统 背景 在企业级的微服务环境中,跑着成百上千个服务都...

osc_sejhgcp0
22分钟前
15
0
如何监控 Linux 服务器状态?

Linux 服务器我们天天打交道,特别是 Linux 工程师更是如此。为了保证服务器的安全与性能,我们经常需要监控服务器的一些状态,以保证工作能顺利开展。 本文介绍的几个命令,不仅仅适用于服务...

osc_3ytpwpyb
23分钟前
18
0
在已经编译安装好php7场景下 安装php openssl扩展

在已经编译安装好php7场景下 安装php openssl扩展 yum install openssl-devel #要安装这个,否则报错configure: error: Cannot find OpenSSL's <evp.h> centos cd /root/php7/php-7.2.31/ext......

osc_4isxawz4
24分钟前
23
0
在已经编译安装好php7场景下安装curl扩展

在已经编译安装好php7场景下安装curl扩展 cd /root/php7/php-7.2.31/ext/curl #从php官网下载php源码安装包 /usr/local/php746/bin/phpize #已经安装好的phpize的路径 yum install libcurl-...

osc_h6vn1kqs
26分钟前
23
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部