微信官方账号收到普通消息
1。配置开发服务器
微信公众平台->开发->开发者工具->公共平台测试账号
appid:通过与appsecret验证,是微信微信官方账号唯一的标识。URL:开发服务器路径,接收微信服务器发送的数据。Token:自设token与开发服务器中验证的token保持一致。微信微信官方账号用户、微信服务器与开发服务器的关系:微信微信官方账号用户发送信息时,发送到微信服务器,微信服务器通过xml格式将信息转发给开发服务器。如果使用本地tomcat,可以使用natapp等内网穿透工具生成外网域名,通过域名访问本地localhost:8080.
注册链接
登录之后 ,购买免费通道
需要修改自己项目的ip和端口
运行natapp
config.ini方式 (推荐)
根据操作系统下载不同的config.ini文件到刚刚下载的natapp.exe同级目录下载链接
填写免费通道获得的authtoken (其他地方不填),保存
windows下,直接双击natapp.exe 即可.
开发人员提交信息后,微信服务器将GET请求发送到填写的服务器地址URL,GET请求携带参数如下表所示:
参数
描述
signature
结合开发人员填写的token参数和请求中的timestamp参数、nonce参数,微信加密签名。
timestamp
时间戳
nonce
随机数
echostr
随机字符串
wei-java-依赖tools
<dependency> <groupId>me.chanjar</groupId> <artifactId>weixin-java-mp</artifactId> <version>1.3.3</version> </dependency> <dependency> <groupId>me.chanjar</groupId> <artifactId>weixin-java-common</artifactId> <version>1.3.3</version> </dependency>
代码:
///微信配置服务器 验证 @RequestMapping(value="/wxserver",method={RequestMethod.GET}) public void check(HttpServletRequest request, HttpServletResponse response) { //////微信服务器传输的参数 String signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); String echostr = request.getParameter("echostr"); ///微信工具服务 WxMpService wxService=new WxMpServiceImpl(); ////注入token的配置参数 /** * 生产环境 建议WxmpinmemoryconfigStorage持久化 */ WxMpInMemoryConfigStorage wxConfigProvider=new WxMpInMemoryConfigStorage(); ///注入token值 wxConfigProvider.setToken("weixin"); wxService.setWxMpConfigStorage(wxConfigProvider); boolean flag=wxService.checkSignature(timestamp, nonce, signature); ////验证token是否与微信配置相同 PrintWriter out= null; try { out = response.getWriter(); } catch (IOException e) { e.printStackTrace(); } if(flag){ out.print(echostr); } out.close(); }
signature: signature结合了开发者填写的token参数、请求中的timestamp参数和nonce参数。这三个参数用sha1算法加密.
boolean flag=wxService.checkSignature(timestamp, nonce, signature)
根据这三个参数,在开发服务器中重新加密sha1算法,生成新的signature,然后与请求参数中的signature进行比较,验证相同,成功后返回随机字符串。配置阶段成功。
2.简单实现文本回复的操作URL:在验证过程中,参数将通过GET请求URL。验证成功后,微信官方账号用户发送数据时,微信服务器会通过POST将数据发送到URL。
所以我们应该写两条相同的路径,要求不同方法的controller。
@RequestMapping(value="/wxserver",method={RequestMethod.GET}); @RequestMapping(value="/wxserver",produces={"application/xml;charset=UTF-8;"},method={RequestMethod.POST})
普通消息
文本新闻案例
<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
消息类型,文本为textt
Content
文本新闻内容
MsgId
消息id,64位整形手术
MsgType:新闻类型,文本为text,图片为image,语音为voice等官方文档
推送事件单击菜单中的事件事例
用户点击自定义菜单后,微信会将点击事件推送给开发者。请注意,点击菜单弹出子菜单,不会产生报告。
点击菜单拉取消息时的事件推送
推XML数据包示例:
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[FromUser]]></FromUserName> <CreateTime>123456789</CreateTime> <MsgType><![CDATA[event]]></MsgType> <Event><![CDATA[CLICK]]></Event> <EventKey><![CDATA[EVENTKEY]]></EventKey></xml>
参数说明:
代码:
@ResponseBody() @RequestMapping(value="/wxserver",produces={"application/xml;charset=UTF-8;"},method={RequestMethod.POST}) public String receive(HttpServletRequest request, HttpServletResponse response) throws Exception{ ///因为微信服务器返回xml 所以我们需要分析 //获取消息流 WxMpXmlMessage message=WxMpXmlMessage.fromXml(request.getInputStream()); String fromUserName = message.getFromUserName(); String toUserName = message.getToUserName(); logger.info(【猎人MM微信官方账号】被要求,用户openid:"+fromUserName); ///消息类型 String messageType=message.getMsgType(); if("text".equals(messageType)){ // String res= wxTextReceiveService.receiveText(message); String str=""; ///文本新闻 文本内容 String content = message.getContent(); ///将回复信息按格式包装成xml //toUser(fromUserName).fromUser(toUserName) 发送者成为接受者 WxMpXmlOutTextMessage text = WxMpXmlOutTextMessage.TEXT().toUser(fromUserName).fromUser(toUserName).content(”你发送的消息是\n"+content ).build(); str = text.toXml(); return str; }else if("event".equals(messageType)){ String str=""; WxMpXmlOutTextMessage text = WxMpXmlOutTextMessage.TEXT().toUser(fromUserName).fromUser(toUserName).content(”欢迎关注\n" ).build(); str = text.toXml(); return str; } return ""; }
messagetpe类型 官方文档