申请公众号,申请服务器,申请域名这些都是基础步骤,跳过不说了。
如果是第一次开发,即使按照微信的接入指南操作,也要花费很长时间,这里说一下注意事项:
1. 服务器的url地址必须是域名!ip不行。而且url接口只能有一个!否则,频繁的token验证失败会烦死你。
2. 微信开发文档给的例子是python的,我用的tomcat+java,token验证时是从网上找的java代码,确实可用,但接口必须严格按照微信的来,否则。。。多几个回车都不行,微信不会单独给你trim,自己想办法吧。
3. get和post接口调试工具是必须的,我下载了一个postman客户端,才找到问题。
4. url接口只能有一个带来的问题就是:token验证和消息接口只能用一个,只好用get和post方式来区分。这个微信开发文档里没写,后来在简书上才找到一篇文章,难道这个问题太低级?很多人不好意思说? tmd
5. 我要处理xml和json串,需要导入一堆的jar包:
<%@ page import="java.io.*,java.util.*,java.net.*,java.security.MessageDigest,java.security.NoSuchAlgorithmException"%><%@ page import="org.apache.commons.httpclient.*,org.apache.commons.httpclient.methods.PostMethod,org.apache.commons.httpclient.methods.RequestEntity,org.apache.commons.httpclient.methods.StringRequestEntity"%><%@ page import="com.alibaba.fastjson.*,org.dom4j.Document,org.dom4j.DocumentHelper,org.dom4j.DocumentException"%><%@ page import="org.dom4j.io.OutputFormat,org.dom4j.io.XMLWriter"%><%@ page import="org.dom4j.Element,org.dom4j.io.SAXReader,org.xml.sax.InputSource"%><%@ page import="javax.xml.parsers.DocumentBuilder,javax.xml.parsers.DocumentBuilderFactory,javax.xml.parsers.ParserConfigurationException"%><%@ page import="javax.xml.transform.Transformer,javax.xml.transform.TransformerConfigurationException"%><%@ page import="javax.xml.transform.TransformerException,javax.xml.transform.TransformerFactory,javax.xml.transform.dom.DOMSource,javax.xml.transform.stream.StreamResult"%>
眼晕吗? 凑合看吧,我可是一个一个贴上去的。
6. 记得写日志,便于调试。
公开一部分源码:
String postToNlu(String in_url,String in_data){
//关闭
//创建httpclient工具对象
HttpClient client = new HttpClient();
//创建post请求方法
PostMethod myPost = new PostMethod(in_url);
//设置请求超时时间
client.setConnectionTimeout(5*1000);
String responseString = "start postToNlu...";
try{
//设置请求头部类型
myPost.setRequestHeader("Accept","text/plain");
//myPost.setRequestHeader("Content-Type","text/xml");
//myPost.setRequestHeader("charset","utf-8");
//设置请求体,即xml文本内容,注:这里写了两种方式,一种是直接获取xml内容字符串,一种是读取xml文件以流的形式
//myPost.setRequestBody(in_data);
//responseString = "set setRequestBody...";
//InputStream body=this.getClass().getResourceAsStream("/data/"+xmlFileName);
//myPost.setRequestBody(body);
myPost.setRequestEntity(new StringRequestEntity(in_data,"application/json","utf-8"));
responseString = "set setRequestEntity...";
long len = myPost.getRequestEntity().getContentLength();
responseString = "set getContentLength:" + len;
myPost.setRequestHeader("Content-Length", len + "");
int statusCode = client.executeMethod(myPost);
if(statusCode == HttpStatus.SC_OK){
responseString = "statusCode:" + statusCode;
BufferedInputStream bis = new BufferedInputStream(myPost.getResponseBodyAsStream());
byte[] bytes = new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int count = 0;
while((count = bis.read(bytes))!= -1){
bos.write(bytes, 0, count);
}
byte[] strByte = bos.toByteArray();
responseString = new String(strByte,0,strByte.length,"utf-8");
bos.close();
bis.close();
}
else
{responseString = "nlu http error: " + statusCode;}
}catch (Exception e) {
e.printStackTrace();
responseString = responseString + "---"+ e.toString();
}
myPost.releaseConnection();
return responseString;
}
其它的就不公开了,代码很乱,我又不是很精通java,没用任何框架,也没封装, 我喜欢用手。。。。。。
调通以后,出现第一个回复还是很兴奋的,现在已经可以自动回复了,下一步是增加图文、语音回复,路漫漫。。。。。。