微信公众平台开发【接收消息】接收普通消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。服务器在解析此数据包,获取相关参数的值从而做出回复。接收普通消息主要包括:文本消息、图片消息、语音消息、视频消息、小视频消息、地理位置消息、链接消息。XML数据包结构和相关参数如下:

1、文本消息

 <xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[text]]></MsgType>
 <Content><![CDATA[this is a test]]></Content>
 <MsgId>1234567890123456</MsgId>
 </xml>
参数				描述
ToUserName		开发者微信号
FromUserName	 发送方帐号(一个OpenID)
CreateTime	 	消息创建时间 (整型)
MsgType	 		text
Content	 		文本消息内容
MsgId	 		消息id,64位整型

那么这些参数该如何获取呢,示例代码如下:

index.php(完整代码下载)

<?php
/**
  * 作者:smalle
  * 网址:http://blog.csdn.net/oldinaction
  * 微信公众号:smallelife
  */

//定义 token
define("TOKEN", "smalle");
//实例化对象
$wechatObj = new wechatCallbackapiTest();
//调用函数
if (isset($_GET['echostr'])) {
	$wechatObj->valid();
}else{
	$wechatObj->responseMsg();
}

class wechatCallbackapiTest
{
	public function valid()
	{
		$echoStr = $_GET["echostr"];
		if($this->checkSignature()){
			echo $echoStr;
			exit;
		}
	}

	public function responseMsg()
	{
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  

		if (!empty($postStr)){
			libxml_disable_entity_loader(true);//安全防护
			$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
			$fromUsername = $postObj->FromUserName;
			$toUsername = $postObj->ToUserName;
			$createTime = $postObj->CreateTime;
			$msgType = $postObj->MsgType;
			$content = $postObj->Content;
			$msgId = $postObj->MsgId;
			if($msgType == 'text'){
				$textTpl = "<xml>
						<ToUserName><![CDATA[%s]]></ToUserName>
						<FromUserName><![CDATA[%s]]></FromUserName>
						<CreateTime>%s</CreateTime>
						<MsgType><![CDATA[text]]></MsgType>
						<Content><![CDATA[%s]]></Content>
						<FuncFlag>0</FuncFlag>
						</xml>";
				$time = time();
				$contentStr = "您发的是消息包含以下信息:\n发信人OpenID:".$fromUsername."\n收信人微信号:".$toUsername."\n发信时间:".$createTime."\n消息类型:".$msgType."\n消息内容:".$content."\n消息ID:".$msgId;
				$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
				echo $resultStr;
			}else{
				$textTpl = "<xml>
						<ToUserName><![CDATA[%s]]></ToUserName>
						<FromUserName><![CDATA[%s]]></FromUserName>
						<CreateTime>%s</CreateTime>
						<MsgType><![CDATA[text]]></MsgType>
						<Content><![CDATA[%s]]></Content>
						<FuncFlag>0</FuncFlag>
						</xml>";
				$time = time();
				$contentStr = "您发的消息类型不是文本。而是".$msgType;
				$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
				echo $resultStr;
			}

		}
	}

	private function checkSignature()
	{
		if (!defined("TOKEN")) {
			throw new Exception('TOKEN is not defined!');
		}
		$signature = $_GET["signature"];
		$timestamp = $_GET["timestamp"];
		$nonce = $_GET["nonce"];
		$token = TOKEN;
		$tmpArr = array($token, $timestamp, $nonce);
		sort($tmpArr, SORT_STRING);
		$tmpStr = implode( $tmpArr );
		$tmpStr = sha1( $tmpStr );

		if( $tmpStr == $signature ){
			return true;
		}else{
			return false;
		}
	}
}

?>

效果预览:

代码分析:

  • 第32-42行【$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];......$msgId = $postObj->MsgId;】:实现获取用户发送过来的消息数据。
  • 第43-55行【if($msgType == ‘text‘){......echo $resultStr;】:实现的是被动回复文本消息给用户

2、图片消息

使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

 <xml>
 <ToUserName><![CDATA[toUser]]></ToUserName>
 <FromUserName><![CDATA[fromUser]]></FromUserName>
 <CreateTime>1348831860</CreateTime>
 <MsgType><![CDATA[image]]></MsgType>
 <PicUrl><![CDATA[http://blog.csdn.net/oldinaction]]></PicUrl>
 <MediaId><![CDATA[media_id]]></MediaId>
 <MsgId>1234567890123456</MsgId>
 </xml>
参数				描述
ToUserName		开发者微信号
FromUserName	发送方帐号(一个OpenID)
CreateTime		消息创建时间 (整型)
MsgType	 		image
PicUrl	 		图片链接
MediaId	 		图片消息媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId	 		消息id,64位整型

3、语音消息

使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<MsgId>1234567890123456</MsgId>
</xml>
参数				描述
ToUserName		开发者微信号
FromUserName	发送方帐号(一个OpenID)
CreateTime		消息创建时间 (整型)
MsgType	 		语音为voice
MediaId	 		语音消息媒体id,可以调用多媒体文件下载接口拉取数据。
Format	 		语音格式,如amr,speex等
MsgID	 		消息id,64位整型

请注意,开通语音识别后,用户每次发送语音给公众号时,微信会在推送的语音消息XML数据包中,增加一个Recongnition字段(注:由于客户端缓存,开发者开启或者关闭语音识别功能,对新关注者立刻生效,对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试)。开启语音识别后的语音XML数据包如下:

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<Format><![CDATA[Format]]></Format>
<Recognition><![CDATA[腾讯微信团队]]></Recognition>
<MsgId>1234567890123456</MsgId>
</xml>

多出的字段中,Format为语音格式,一般为amr,Recognition为语音识别结果,使用UTF8编码。

4、视频消息

使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[video]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
参数				描述
ToUserName		开发者微信号
FromUserName	发送方帐号(一个OpenID)
CreateTime		消息创建时间 (整型)
MsgType	 		视频为video
MediaId	 		视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
ThumbMediaId		视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId	 		消息id,64位整型

5、小视频消息

使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1357290913</CreateTime>
<MsgType><![CDATA[shortvideo]]></MsgType>
<MediaId><![CDATA[media_id]]></MediaId>
<ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
<MsgId>1234567890123456</MsgId>
</xml>
参数				描述
ToUserName		开发者微信号
FromUserName	发送方帐号(一个OpenID)
CreateTime		消息创建时间 (整型)
MsgType	 		小视频为shortvideo
MediaId	 		视频消息媒体id,可以调用多媒体文件下载接口拉取数据。
ThumbMediaId		视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。
MsgId	 		消息id,64位整型

6、地理位置消息

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[location]]></MsgType>
<Location_X>23.134521</Location_X>
<Location_Y>113.358803</Location_Y>
<Scale>20</Scale>
<Label><![CDATA[位置信息]]></Label>
<MsgId>1234567890123456</MsgId>
</xml> 
参数				描述
ToUserName		开发者微信号
FromUserName	发送方帐号(一个OpenID)
CreateTime		消息创建时间 (整型)
MsgType	 		location
Location_X		地理位置维度
Location_Y		地理位置经度
Scale	 		地图缩放大小
Label	 		地理位置信息
MsgId	 		消息id,64位整型

当用户给公众账号发送位置时,便可以获取相应的地理位置信息。部分示例代码如下:

index.php(完整代码下载)

$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];  

if (!empty($postStr)){
	libxml_disable_entity_loader(true);//安全防护
	$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
	$fromUsername = $postObj->FromUserName;
	$toUsername = $postObj->ToUserName;
	$msgType = $postObj->MsgType;
	$j = $postObj->Location_Y;//经度
	$w = $postObj->Location_X;//纬度
	$label = $postObj->Label;//地理位置信息
	if($msgType == 'location'){
		$textTpl = "<xml>
				<ToUserName><![CDATA[%s]]></ToUserName>
				<FromUserName><![CDATA[%s]]></FromUserName>
				<CreateTime>%s</CreateTime>
				<MsgType><![CDATA[text]]></MsgType>
				<Content><![CDATA[%s]]></Content>
				<FuncFlag>0</FuncFlag>
				</xml>";
		$time = time();
		$contentStr = "您的位置信息如下:\n经度:".$j."\n纬度:".$w."\n地理位置信息:".$label;
		$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $contentStr);
		echo $resultStr;
	}else{
		echo '';
	}

}

效果展示:

现在你可能觉得这一小串数字没什么用,到后面我会分享一些关于位置信息的小案例,那个时候就起作用了。

7、链接消息

使用方法同文本消息,此处不再赘述,不懂得话可以在博文后面留言。

<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[fromUser]]></FromUserName>
<CreateTime>1351776360</CreateTime>
<MsgType><![CDATA[link]]></MsgType>
<Title><![CDATA[公众平台官网链接]]></Title>
<Description><![CDATA[公众平台官网链接]]></Description>
<Url><![CDATA[url]]></Url>
<MsgId>1234567890123456</MsgId>
</xml>
参数				描述
ToUserName		接收方微信号
FromUserName	发送方微信号,若为普通用户,则是一个OpenID
CreateTime		消息创建时间
MsgType	 		消息类型,link
Title	 			消息标题
Description		消息描述
Url	 			消息链接
MsgId	 		消息id,64位整型

======================================================================

关注【Smalle】【微信公众号:smallelife】                           捐赠【Smalle】【微信公众号:smallelife】

关注就有豪礼相送哦,源码、工具、文档应有尽有
            你的扫码便是我前进的动力,扫码、扫码、扫码

======================================================================

                                     

版权声明:文章版权所有,未经允许请勿转载!

时间: 2024-08-15 07:00:11

微信公众平台开发【接收消息】接收普通消息的相关文章

C# 微信公众平台开发(4)-- 模版消息

微信公众平台开发 --发送模版消息 发送模版消息是微信服务号给某个用户发送模版消息,类似于APP的推送通知: 1.添加模版消息 在页面的左上 有一个添加功能插件的 按钮,如题 添加完成后,我们就可以在左边的菜单栏看到 相应的信息了: 2.添加模版消息    详情里面有关模版的介绍,和发送短信需要传送的数据: 3.发送模版消息 接口调用请求说明http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_

Java微信公众平台开发(五)--文本及图文消息回复的实现

上篇我们说到回复消息可以根据是否需要上传文件到微信服务器可划分为[普通消息]和[多媒体消息],这里我们来讲述普通消息的回复实现,在消息回复中存在一个关键字段[openid],它是微信用户对于公众号的唯一标识,这里不做过多解释后面将给出时间专门来讲解微信生态中的关键字! (一)回复文本消息 在前面我们已经完成了对消息的分类和回复消息实体的建立,这里回复文本消息需要用到的就是我们的TextMessage,我们把回复文本消息在[文本消息]类型中给出回复!在我们做消息回复的时候需要设置消息的接收人ToU

微信公众平台开发(3)-回复消息

一.回复文本消息二.回复链接消息三.回复音乐消息四.回复图文消息五.事件-订阅六.事件-取消订阅PS:当然还包括表情.参考:http://www.360doc.com/content/13/0803/13/13350344_304465190.shtml完整代码:微信接口配置的回调地址对应的Controller import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.spring

微信公众平台开发(2)-消息封装

微信公众平台开发(2)-消息处理 消息包括文本.图片.语音.视频.音乐.图文,消息格式参考http://mp.weixin.qq.com/wiki/index.php?title=发送被动响应消息 在接入接口时指定了回调URL,在保存时微信会以GET方式调用此URL,并将signature,timestamp,nonce,echostr添加到URL上 因此在我们的微信处理的Controller中需要有执行上面URL的GET方法. 那么,发送和接收消息怎么来实现呢? 这个是通过以POST方式调用上

java微信公众平台开发事件推送

import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; import org.springframework.stereotype.Service; import com.ifp.weixin.biz.cor

微信公众平台开发教程--方培工作室,PHP语言版本

准备工作 微信公众平台的注册 介绍如何注册一个微信公众账号. 入门教程 微信公众平台开发入门教程 内容:1.申请SAE作为服务器; 2.启用开发模式; 3.微信公众平台PHP SDK; 4.接收发送消息类型解析; 5.微信公众平台开发模式原理; 6.快速开发天气预报功能. 入门教程是下面所有教程的基础. 基础接口 微信公众平台开发(2) 天气预报 介绍了使用中国天气网气象数据,实现微信上的天气预报功能. 微信公众平台开发(3) 中英翻译 介绍了使用有道翻译的接口,在微信公众平台上,开发中英互译的

用C++做微信公众平台开发的后台开发时,用sha1加密验证的方法

微信公众平台开发时,需要验证消息是否来自微信服务器,这要用到sha1加密算法,官网上给的是php的sha函数,C++中要用到下面这个函数: 一.引入头文件: #include<openssl/sha.h> #include<inttypes.h> 二.用这个函数转码: //函数功能:将传入的字符串用sha1加密算法加密后传出 //strOriginal:原始字符串 //返回值:加密后的字符串 stringGetSha1Str(const string& strOrigina

第四篇 :微信公众平台开发实战Java版之完成消息接受与相应以及消息的处理

温馨提示: 这篇文章是依赖前几篇的文章的. 第一篇:微信公众平台开发实战之了解微信公众平台基础知识以及资料准备 第二篇 :微信公众平台开发实战之开启开发者模式,接入微信公众平台开发 第三篇 :微信公众平台开发实战之请求消息,响应消息以及事件消息类的封装 首先,我们看看原来写的dopost方法: /** * 处理微信服务器发来的消息 */ public void doPost(HttpServletRequest request, HttpServletResponse response) thr

微信公众平台开发教程(二) 基本原理及消息接口

微信公众平台开发教程(二) 基本原理及消息接口 一.基本原理 在开始做之前,大家可能对这个很感兴趣,但是又比较茫然.是不是很复杂?很难学啊? 其实恰恰相反,很简单.为了打消大家的顾虑,先简单介绍了微信公众平台的基本原理. 微信服务器就相当于一个转发服务器,终端(手机.Pad等)发起请求至微信服务器,微信服务器,然后将请求转发给自定义服务(这就里就是我们的具体实现). 服务处理完毕,然后挥发给微信服务器,微信服务器再将具体响应回复到终端. 通信协议为:HTTP 数据格式为:XML 具体的流程如下图

微信公众平台开发之处理普通消息---2

(接上一篇文章:微信公众平台开发之处理普通消息---1) 本章节主要讲述对普通消息的处理. 当用户关注微信公众号时,取消关注时,给公众号发各种信息时,作出简单的响应(处理). 一.在com.cc.wechat.util包下新建工具类: ---MessageUtil: 对xml解析需要用到两个工具包: 1 xstream.jar 点击下载 2 dom4j.jar 点击下载 package com.cc.wechat.util; import java.io.IOException; import