在上一篇文章写了如何配置服务器:
今天我就给大家说下如何获取用户发送消息并实现回复,自己在弄这个过程走了许多坑。
要实现消息获取和自动回复,需要了解微信是怎么实现这个过程:
我从微信官方文档摘取了下面比较重要的信息
接收普通消息
当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上。
文本消息在请求的输出流中,而不是参数位置,参数是对xml中标签的解释。
文本消息
< ![CDATA[toUser] ]>
< ![CDATA[fromUser] ]>1348831860
< ![CDATA[text] ]>
< ![CDATA[this is a test] ]>
1234567890123456
参数描述
ToUserName
开发者微信号
FromUserName
发送方帐号(一个OpenID)
CreateTime
消息创建时间 (整型)
MsgType
text
Content
文本消息内容
MsgId
消息id,64位整型
被动回复用户消息
当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。
回复文本消息
< ![CDATA[toUser] ]>
< ![CDATA[fromUser] ]>12345678
< ![CDATA[text] ]>
< ![CDATA[你好] ]>
参数是否必须描述
ToUserName
是
接收方帐号(收到的OpenID)
FromUserName
是
开发者微信号
CreateTime
是
消息创建时间 (整型)
MsgType
是
text
Content
是
回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
在网上看到这张图片很好理解
微信公众号开发文档说了,只有对服务器进行验证的时候才会使用到get请求到服务器的url中,其它一律使用post请求。
因此用户发送消息时,微信服务器是通过post请求到我们的服务器上。
可以看下我写的代码来理解这个过程,这个代码有部分利用上一篇文章说过的步骤:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;