文档章节

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

webphp
 webphp
发布于 2017/07/26 11:28
字数 730
阅读 8
收藏 0
点赞 0
评论 0
微信公众号平台在开发模式下可以在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
博文 91
码字总数 91650
作品 0
海淀
程序员
微信公众号开发之连简单的自动回复都不能实现

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

在我的歌声里 ⋅ 2017/02/04 ⋅ 2

微信公众号开发遇到奇怪的问题

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

在我的歌声里 ⋅ 2017/02/04 ⋅ 1

Yii 的微信模块--Yii-wechat

Yii-wechat 是基于 Yii2 实现的微信模块, 集成微信模拟器、多公众号管理、扩展开发接口,只需关注功能,微信开发的强劲引擎. 注意 如果是全新使用和,你可以使用 Yii2-app-wechat 微信应用模板(...

红薯 ⋅ 2015/06/02 ⋅ 1

微信公众号交互流程and so on

1、微信公众号交互流程 微信公众号-->微信服务器-->开发者服务后台 开发者服务后台-->微信服务器-->微信公众号 微信用户给微信公众号发消息之后,消息到达微信服务器被处理成XML数据包并转发...

晚天吹凉风 ⋅ 01/31 ⋅ 0

php之微信公众号开发三公牛牛房卡平台搭建使用php7要注意的地方

开启微信公众号开发三公牛牛房卡平台搭建网站(h5.fanshubbs.com联系Q1687054422),从微信开发文档中下载demo 如下载php示例代码 示例代码中是使用“$GLOBALS["HTTP_RAW_POST_DATA"]”接收来自...

三公平台 ⋅ 02/03 ⋅ 0

laravel 微信开发-自动回复

laravel 微信开发-自动回复 1.微信公众号的逻辑,用户关注了你的微信公众号后,假设用户发送了一条消息给你的公众号,实际上是先发送到腾讯的服务器上,腾讯把内容转成特定的xml格式,再转发...

阿泽Aze ⋅ 2017/11/21 ⋅ 0

微信公众平台开发之一,公众平台介绍

腾讯推出了微信公众账号,以和我们平时个人用的微信号区别开来, 公众账号们通过微信公众平台来进行操作,比如群发消息、查看粉丝的回复消息等等。 那么一个公众账号到底是怎么运作的呢?公众...

squanchao ⋅ 2016/06/29 ⋅ 0

微信公众号开发--环境搭建和准备工作

开发和调试之殇 微信公众号的开发,说简单也简单,说麻烦也麻烦,麻烦的不是开发过程,而是搭建开发环境的过程。不过俗话说得好,磨刀不误砍柴工,我们有必要花点时间来研究下如何攻破微信公...

我家有宝 ⋅ 2016/10/09 ⋅ 0

Cenbylin/WxMessageSDK

WxMessageSDK 轻量的微信公众号消息处理SDK 简化和微信服务器交互的繁琐部分,支持未认证/认证公众号。 快速开始 本SDK所做大部分工作仅仅是封装了微信文档的开发工作,为了保证拓展性,安装...

Cenbylin ⋅ 2017/08/06 ⋅ 0

微信公众平台自助引擎 - 微擎

微信公众平台自助引擎,简称微擎,微擎是一款免费开源的微信公众平台管理系统。 注:使用微擎必须要有自己的服务器、虚拟空间或者自己的BAE,且必须要支持PHP+MYSQL,上传微擎程序后按系统指...

匿名 ⋅ 2013/09/13 ⋅ 4

没有更多内容

加载失败,请刷新页面

加载更多

下一页

高并发之Nginx的限流

首先Nginx的版本号有要求,最低为1.11.5 如果低于这个版本,在Nginx的配置中 upstream web_app { server 到达Ip1:端口 max_conns=10; server 到达Ip2:端口 max_conns=10; } server { listen ...

算法之名 ⋅ 今天 ⋅ 0

Spring | IOC AOP 注解 简单使用

写在前面的话 很久没更新笔记了,有人会抱怨:小冯啊,你是不是在偷懒啊,没有学习了。老哥,真的冤枉:我觉得我自己很菜,还在努力学习呢,正在学习Vue.js做管理系统呢。即便这样,我还是不...

Wenyi_Feng ⋅ 今天 ⋅ 0

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 今天 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部