2015-08-26 13:06:22 oldinaction 阅读数 6937
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79059 人正在学习 去看看 翟东平

当普通微信用户向公众账号发消息时,微信服务器将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】

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

===================================微笑微笑微笑===================================

                                     


2018-10-22 21:19:04 jyluwen 阅读数 1357
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79059 人正在学习 去看看 翟东平

       之前下载了微信开发者工具,最近一直提示下载更新。因为嫌麻烦,就没有更新。结果今天微信开发者工具竟然打不开了!好吧!以后还是经常更新比较好!

  遇到了微信开发者工具打不开的问题,就重新下载了最新版的微信开发者工具!但是下载完了以后,却发现打不上汉字,我的天呀!网上搜索还是微信开发者工具自身的bug,需要重新启动一下才可以使用。好吧,我又关了重新启动了一下,才可以正常使用。

   经验教训:1.需要经常更新微信开发者工具,别等到有了问题,如打不开,进不去编辑页面,才重新下载!会影响工作效率。不过如果是更新了,依然会出现这个问题,那就只能重新下载了!

       2.重新更新了以后,会出现打不上中文汉字的问题,只能输入英文,输入中文就会闪一下没了。解决方案:关闭微信开发者工具,再重新打开!

什么时候我写文章也能如此就好了!老话说:“读书破问卷,下笔如有神”,想来我读书还是没有读到位呀!

2017-05-04 11:09:38 DestinyLordC 阅读数 1484
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79059 人正在学习 去看看 翟东平

方法1

  亲测该方法快捷有效,建议使用,没有windows系统的朋友,随便找一台windows计算机下载安装后,打包需要的文件即可。

安装步骤
需要先在已安装的windows微信开发者工具里面打包package.nw包,安装好后的目录中存在package.nw目录,整个目录打包成.zip格式即可。
下载地址:https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=201715

$ wget -c https://dl.nwjs.io/v0.25.2/nwjs-sdk-v0.25.2-linux-x64.tar.gz
$ ls
nwjs-sdk-v0.25.2-linux-x64.tar.gz package.nw.zip
$ tar -zxvf nwjs-sdk-v0.25.2-linux-x64.tar.gz
$ unzip package.nw.zip
$ mv package.nw/* nwjs-sdk-v0.25.2-linux-x64
$ cd nwjs-sdk-v0.25.2-linux-x64/
$ ./nw
#即可启动

方法2

  微信Web开发者工具只有window版本和mac版本,如果想要在Linux系统下运行微信Web开发者工具,需要花费很大周折。(转自https://zhuanlan.zhihu.com/p/24630979?refer=dreawer

注:带 * 的步骤或文件为不确定是否管用的步骤或文件。
本人系统为Linux Mint 18.1版本。

1、下载nwjs

  下载nwjs的SDK。

2、将微信web开发者工具拷贝到nwjs

  将在window系统下安装的微信web开发者工具文件夹中的package.nw、icon.ico、* 微信web开发者工具.exe拷贝到nwjs sdk解压后的文件夹内。

  * 解压 微信web开发者工具.exe,将解压后的文件夹内的文件移动到nwjs sdk解压后的文件夹内。

3、修改代码

  进入到nwjs文件夹,在终端内运行

$ ./nw
  会出现提示 Cannot find module ‘……’
  
  根据提示,在提示错误的文件内修改module名,因为名字大小写会有错误,比如appServiceConfig模块,它的实际模块名是appserviceConfig,这些都是大小写字母错误导致找不到模块。

  会有几个文件需要修改,根据错误提示修改。

4、在微信小程序项目文件内创建run-detectors文件

  在微信小程序项目文件夹内创建run-detectors文件,因为该文件没有扩展名,在linux系统会被认为是文件夹,导致找不到该文件导致报错。

5、下载wine

  在命令行内运行

  $ sudo apt-get install wine
  在右键选择wine环境运行wcc.exe,会提示安装依赖。wcc.exe在linux的 /home/用户名/.config/微信web开发者工具/WeappVendor 文件夹内。

6、载入项目

  在载入项目前,* 先在wine下运行wcc.exe和wcsc.exe(不提前运行wcc.exe和wcsc.exe的话可能会报错)。第一次载入项目后编译可能会慢一些,3、5s到10s左右,后面因为有缓存会快一些。


  修改wcc.exe和wcsc.exe文件名,去掉.exe。

  进入到package.nw/app/dist/weapp/文件夹,找到

  commit/build.js、trans/transWxmlToJs.js和utils/vendorManager.js,将代码中的wcc.exe和wcsc.exe改成wcc和wcsc。

  !!!使用编辑功能可能会报错,所以不要用自带的编辑功能。

7、编辑器

  推荐使用webstorm,在File - Editor - code style - File Types内设置如图下所示。将wxss添加到css类型文件,将wxml添加到html类型文件。

  微信的文件改变自动刷新会有3到5s的时间来编译,不是很快。

2014-10-20 15:16:01 piaoxuefengqi 阅读数 4247
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79059 人正在学习 去看看 翟东平

背景


最近申请了一个微信公众号,想根据用户的消息进行智能动态回复。于是有了这篇文章。

公众号申请:https://mp.weixin.qq.com。

想根据具体消息进行智能动态回复,需要开启开发者模式。

开发者模式需要进入开发者中心进行编码认证。这里面只讲主要的代码,关键步骤见参考资料


开发环境


环境:python + sae + Flask



myapp.py


开启后需要认证服务器,服务器认证代码编写:

import hashlib
from flask import Flask, request, render_template, jsonify, make_response
import time
import _elementtree as ET

app = Flask(__name__)
app.debug = True

@app.route('/weixin/', methods=['GET', 'POST'])
def wechat_auth():
    if request.method == 'GET':
        token = '****'   # your token
    query = request.args
    signature = query.get('signature', '')
    timestamp = query.get('timestamp', '')
    nonce = query.get('nonce', '')
    echostr = query.get('echostr', '')
    s = [timestamp, nonce, token]
    s.sort()
    s = ''.join(s)
    if hashlib.sha1(s).hexdigest() == signature:
        return make_response(echostr)



设置消息回复

认证完毕后,即可根据微信发来的xml进行消息解析,然后根据具体消息进行回复。

设置消息回复的代码如下,只需要修改刚才的函数体:

@app.route('/weixin/', methods=['GET', 'POST'])
def wechat_auth():
    cQuestion = CQuestion()
    xml_recv = ET.fromstring(request.data)
    ToUserName = xml_recv.find("ToUserName").text
    FromUserName = xml_recv.find("FromUserName").text
    Content = xml_recv.find("Content").text
    cResponse = CResponse()
    cQuestion.insertIntoSql(ToUserName)
    cQuestion.insertIntoSql(FromUserName)
    if Content.strip() == "1":
        return cResponse.getResponseXml(FromUserName, ToUserName, "Hello, world!")
    elif Content.strip() == "2":
        return cResponse.getResponseXml(FromUserName, ToUserName, "Hello, python!")
    else:
        return cResponse.getResponseXml(FromUserName, ToUserName, "Hello!")


测试


编写完上面的代码并提交后开始测试,测试效果如下:





更多测试


关注微信号itoffer。

二维码:   


提供多种功能,包括新闻检索、微信游戏、面试题获取、图片处理、领域知识尝试等功能,后续多种功能持续集成中。

参考资料 








2017-04-22 10:18:33 hq0556 阅读数 220
  • 微信公众平台深度开发v2.0第1季——微信公众号基础...

    “微信公众平台深度开发Java版 v2.0”系列课程共有6季,使用JAVA语言,系统讲解微信公众平台订阅号、服务号官方列出的全部功能接口,包括:自定义菜单、个性化菜单(按需定制菜单)、群发消息、客服消息(有限次消息推送)、模板消息接(无限次消息推送)、微信网页开发(微信WEB开发、微信游戏)、微信JSSDK开发、用户管理、获取用户基本信息、网页授权获取用户基本信息(通过WEB得到用户信息)、二维码(临时二维码、永久二维码)、事件推送、接收普通消息、被动回复用户消息,等知识点。 以及,针对微信公众号开发的服务端架构设计方案。课程以微信公众号开发视角,讲解JAVA开发微信公众号所需的框架、第三方工具。 购买套餐还赠送经典微信开发课程——[微信公众号_独立知识点]环境搭建。该课程针对各种复杂的网络环境,讲解如何构建开发环境,已解决“没有服务器”、“没有固定IP”等开发者遇到的窘境。 课程采用独立知识点讲解,一个知识点,一组课程,真正做到“简单、高效、”以短的时间、实现的学习。更多课程信息请访问CSDN。网址:http://edu.csdn.net/lecturer/631 “微信公众平台企业号开发Java版”陆续上线。 详情 qq2326321088

    79059 人正在学习 去看看 翟东平

本例中有些引用的类与方法不做过多介绍,之后会提供完整源码下载,请自行查看。

本篇根据开发者文档-接收普通消息编写。请对照查看,一些传入与返回参数就不过多介绍。地址为:https://mp.weixin.qq.com/wiki/14/f79bdec63116f376113937e173652ba2.html


当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。请注意:

  • 关于重试的消息排重,推荐使用msgid排重。
  • 微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。
  • 为了保证更高的安全保障,开发者可以在公众平台官网的开发者中心处设置消息加密。开启加密后,用户发来的消息会被加密,公众号被动回复用户的消息也需要加密(但开发者通过客服接口等API调用形式向用户发送消息,则不受影响)。

消息类型有:

  public static final String REQ_MESSAGE_TYPE_TEXT            = "text";                   //请求消息类型:文本
    public static final String REQ_MESSAGE_TYPE_IMAGE           = "image";              //请求消息类型:图片
    public static final String REQ_MESSAGE_TYPE_VOICE           = "voice";              //请求消息类型:语音
    public static final String REQ_MESSAGE_TYPE_VIDEO           = "video";              //请求消息类型:视频
    public static final String REQ_MESSAGE_TYPE_SHORTVIDEO      = "shortvideo"; //请求消息类型:小视频
    public static final String REQ_MESSAGE_TYPE_LINK            = "link";                   //请求消息类型:链接
    public static final String REQ_MESSAGE_TYPE_LOCATION        = "location";           //请求消息类型:地理位置
    public static final String REQ_MESSAGE_TYPE_EVENT           = "event";              //请求消息类型:推送
/*
 * 接收普通消息
 * http://mp.weixin.qq.com/wiki/10/79502792eef98d6e0c6e1739da387346.html
 */
@XmlRootElement
public class BaseReqMsg {

    @XmlElement(name = "ToUserName")  
    private String ToUserName;          // 开发者微信号

    @XmlElement(name = "FromUserName")  
    private String FromUserName;        // 发送方帐号(一个OpenID)

    @XmlElement(name = "CreateTime")  
    private long CreateTime;            // 消息创建时间 (整型)

    @XmlElement(name = "MsgType")  
    private String MsgType;             // 消息类型(text/image/location/link)

    @XmlElement(name = "MsgId")  
    private long MsgId;                 // 消息id,64位整型
}

文本消息

/*
 * MsgType--->
 * text:文本消息
 */
@XmlRootElement
public class TextReqMsg extends BaseReqMsg {

    @XmlElement(name = "Content") 
    private String Content;     //文本消息内容

    public String getContent() {
        return Content;
    }
    public void setContent(String content) {
        Content = content;
    }

    /*
     * 接收到的文本示例
     * <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>
     */
    public static TextReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "textReqMsg");
        JAXBContext context = JAXBContext.newInstance(TextReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (TextReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

图片消息

/*
 * MsgType--->
 * image:图片消息
 */
@XmlRootElement
public class ImageReqMsg extends BaseReqMsg {

    @XmlElement(name = "PicUrl")  
    private String PicUrl ;     //图片链接(由系统生成)

    @XmlElement(name = "MediaId")  
    private String MediaId ;    //  图片消息媒体id,可以调用多媒体文件下载接口拉取数据。

    public String getPicUrl() {
        return PicUrl;
    }
    public void setPicUrl(String picUrl) {
        PicUrl = picUrl;
    }

    public String getMediaId() {
        return MediaId;
    }
    public void setMediaId(String mediaId) {
        MediaId = mediaId;
    }

    /*
     * 接收到的文本示例
     * <xml>
     *   <ToUserName><![CDATA[toUser]]></ToUserName>
     *   <FromUserName><![CDATA[fromUser]]></FromUserName>
     *   <CreateTime>1348831860</CreateTime>
     *   <MsgType><![CDATA[image]]></MsgType>
     *   <PicUrl><![CDATA[this is a url]]></PicUrl>
     *   <MediaId><![CDATA[media_id]]></MediaId>
     *   <MsgId>1234567890123456</MsgId>
     * </xml>
     */
    public static ImageReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "imageReqMsg");
        JAXBContext context = JAXBContext.newInstance(ImageReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (ImageReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

语音消息

/*
 * MsgType--->
 * voice:语音消息
 */
@XmlRootElement
public class VoiceReqMsg extends BaseReqMsg {

    @XmlElement(name = "MediaId")
    private String MediaId;     //语音消息媒体id,可以调用多媒体文件下载接口拉取该媒体

    @XmlElement(name = "Format")
    private String Format;      //  语音格式:amr

    @XmlElement(name = "Recognition")
    private String Recognition; //  语音识别结果,UTF8编码.需开通开通语音识别

    public String getMediaID() {
        return MediaId;
    }
    public void setMediaID(String mediaID) {
        MediaId = mediaID;
    }

    public String getFormat() {
        return Format;
    }
    public void setFormat(String format) {
        Format = format;
    }

    public String getRecognition() {
        return Recognition;
    }
    public void setRecognition(String recognition) {
        Recognition = recognition;
    }

    /*
     * 接收到的文本示例
     * <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>
     */
    public static VoiceReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "voiceReqMsg");
        JAXBContext context = JAXBContext.newInstance(VoiceReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (VoiceReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

视频消息/小视频消息

/*
 * MsgType--->
 * shortvideo:小视频消息
 * video:视频消息
 */
@XmlRootElement
public class VideoReqMsg extends BaseReqMsg {

    @XmlElement(name = "MediaId") 
    private String MediaId;     //视频消息媒体id,可以调用多媒体文件下载接口拉取数据。

    @XmlElement(name = "ThumbMediaId") 
    private String ThumbMediaId;//视频消息缩略图的媒体id,可以调用多媒体文件下载接口拉取数据。

    public String getMediaId() {
        return MediaId;
    }
    public void setMediaId(String mediaId) {
        MediaId = mediaId;
    }

    public String getThumbMediaId() {
        return ThumbMediaId;
    }
    public void setThumbMediaId(String thumbMediaId) {
        ThumbMediaId = thumbMediaId;
    }

    /*
     * 接收到的文本示例
     * <xml>
     *  <ToUserName><![CDATA[toUser]]></ToUserName>
     *  <FromUserName><![CDATA[fromUser]]></FromUserName>
     *  <CreateTime>1357290913</CreateTime>
     *  <MsgType><![CDATA[video|shortvideo ]]></MsgType>
     *  <MediaId><![CDATA[media_id]]></MediaId>
     *  <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
     *  <MsgId>1234567890123456</MsgId>
     * </xml>
     */
    public static VideoReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "videoReqMsg");
        JAXBContext context = JAXBContext.newInstance(VideoReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (VideoReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

地理位置消息

/*
 * MsgType--->
 * location:地理位置消息
 */
@XmlRootElement
public class LocationReqMsg extends BaseReqMsg {

    @XmlElement(name = "Location_X") 
    private float Location_X;       //地理位置维度

    @XmlElement(name = "Location_Y") 
    private float Location_Y;       //地理位置经度

    @XmlElement(name = "Scale") 
    private float Scale;            //地图缩放大小

    @XmlElement(name = "Label") 
    private String Label;           //地理位置信息

    public float getLocation_X() {
        return Location_X;
    }
    public void setLocation_X(float location_X) {
        Location_X = location_X;
    }

    public float getLocation_Y() {
        return Location_Y;
    }
    public void setLocation_Y(float location_Y) {
        Location_Y = location_Y;
    }

    public float getScale() {
        return Scale;
    }
    public void setScale(float scale) {
        Scale = scale;
    }

    public String getLabel() {
        return Label;
    }
    public void setLabel(String label) {
        Label = label;
    }

    /*
     * 接收到的文本示例
     * <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>
     */
    public static LocationReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "locationReqMsg");
        JAXBContext context = JAXBContext.newInstance(LocationReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (LocationReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}

链接消息

/*
 * MsgType--->
 * link:链接消息
 */
@XmlRootElement
public class LinkReqMsg extends BaseReqMsg {

    @XmlElement(name = "Title") 
    private String Title;       //消息标题

    @XmlElement(name = "Description") 
    private String Description; //消息描述

    @XmlElement(name = "Url") 
    private String Url;         //消息链接

    public String getTitle() {
        return Title;
    }
    public void setTitle(String title) {
        Title = title;
    }

    public String getDescription() {
        return Description;
    }
    public void setDescription(String description) {
        Description = description;
    }

    public String getUrl() {
        return Url;
    }
    public void setUrl(String url) {
        Url = url;
    }

    /*
     * 接收到的文本示例
     * <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>
     */
    public static LinkReqMsg requestMessage(String xmlStr) throws JAXBException {
        xmlStr = xmlStr.replace("xml", "linkReqMsg");
        JAXBContext context = JAXBContext.newInstance(LinkReqMsg.class);  
        Unmarshaller unmarshaller = context.createUnmarshaller();  
        return (LinkReqMsg)unmarshaller.unmarshal(new StringReader(xmlStr));
    }
}
没有更多推荐了,返回首页