在成为开发者之后,我们便可以用微信提供的接口实现简单的数据通信了。
要解决的问题有两步:
1.获取微信服务器推送过来的用户信息
2.处理信息并将反馈信息推送到微信服务器
第一步中,微信推送过来的信息是发送过来的post请求,请求地址就是第二步中的地址,只不过方式是post,内容为一个包含用户发送的信息的xml。我们要做的就是获取这个xml,读取出其中每个元素值,代码如下
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
XmlParser xml = new XmlParser(request.getInputStream());//获取xml输入流并解析
//以下变量的定义根据微信公众平台开发文档中给出的属性进行定义,这个五个属性是每种信息类型都有的基本属性
String ToUserName = xml.getValueByName("ToUserName");
String FromUserName = xml.getValueByName("FromUserName");
String CreateTime = xml.getValueByName("CreateTime");
String MsgType= xml.getValueByName("MsgType");
String MsgId = xml.getValueByName("MsgId");
if(MsgType.equals("text"))//判断获取的信息是文本信息后进行回复,回复格式也是根据微信公众平台开发文档给出的定义
{
String Content = xml.getValueByName("Content");
String txtMsg = "<xml>"
+"<ToUserName><![CDATA["+FromUserName+"]]></ToUserName>"
+"<FromUserName><![CDATA["+ToUserName+"]]></FromUserName> "
+"<CreateTime>"+12345678+"</CreateTime>"
+"<MsgType><![CDATA[text]]></MsgType>"
+"<Content><![CDATA[這是一條文本信息"+Content+"]]></Content>"
+"</xml>";
response.getWriter().print(txtMsg);
}
else if(MsgType.equals("image"))//判断并回复图像信息
{
String PicUrl = xml.getValueByName("PicUrl");
String MediaId = xml.getValueByName("MediaId");
String txtMsg = "<xml>"
+"<ToUserName><![CDATA["+FromUserName+"]]></ToUserName>"
+"<FromUserName><![CDATA["+ToUserName+"]]></FromUserName> "
+"<CreateTime>"+12345678+"</CreateTime>"
+"<MsgType><![CDATA[text]]></MsgType>"
+"<Content><![CDATA[這是一條圖片信息 url="+PicUrl+" mediaId="+MediaId+" "+"]]></Content>"
+"</xml>";
response.getWriter().print(txtMsg);
}
}
以上两步只给出了处理文本信息和图像信息的方法,还有voice,location,video等格式,处理方式基本相同,请自己实践。
其中<![CDATA[内容]]>是xml标记,表示将内容部分进行原样输出,类似于html中的<pre> 标签,里面的内容保持原样。
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
public class XmlParser {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;
Document doc = null;
public XmlParser(InputStream input)
{
try {
builder = factory.newDocumentBuilder();
doc = builder.parse(input);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public String getValueByName(String name)
{
return doc.getElementsByTagName(name).item(0).getFirstChild().getNodeValue();
}
}
将程序部署后便可以测试了,发送信息给该公共号,便会返回相应的信息。
新手入门,请多关照!