玩过微信公众号的都清楚,微信公众号的项目栏是可以在里面生成的,今天就来说一下使用Java接入微信平台提供的第三方接口。
打开微信公众平台,打开开发者模式,里面有一个介入指南,下面有三款:1.填写服务器配置。2.验证服务器地址的有效性。3依据接口文档实现业务逻辑。
1.填写服务器配置:截图如下(我的已经验证过了)
其中URL为http://rocky1996.tunnel.echomod.cn/weixin02/weixin.do,前面是用ngrok做的内网穿透的一个外链,后面是自己写的一个接口,
令牌Token,是我随机写的,是我们实验室的名称,他的作用就是认证的时候生成一个签名
EncodingAESKey,随机生成的一个字符串,用作消息加密,相当于一个密钥
2.验证服务器地址的有效性(验证的时候有四个参数,分别是signature,timestamp,nonce,echostr)
signature:微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数,nonce参数
timestamp:时间戳
nonce:随机数
echostr:随机字符串
微信服务器会发一个get请求到你填写的服务器上面,传递这四个参数。
3.据接口文档实现业务逻辑。
这是普通消息需要的几个参数,后面还有图片消息,语音消息等,都有官方的API文档。需要之一的是传递过来的消息是以xml的形式,所以需要解析
一下是所有的代码:
package com.acat.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.acat.po.TextMessage;
import com.acat.util.CheckUtil;
import com.acat.util.MessageUtil;
import com.acat.util.getNowTime;
public class WeixinServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
if(CheckUtil.checkSignature(signature, timestamp, nonce)){
out.println(echostr);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
try {
Map<String, String> map = MessageUtil.xmlToMap(request);
String fromUserName = map.get("FromUserName");
String toUserName = map.get("ToUserName");
String msgType = map.get("MsgType");
String content = map.get("Content");
String message = null;
if("text".equals(msgType)){
TextMessage text = new TextMessage();
text.setFromUserName(toUserName);
text.setToUserName(toUserName);
text.setMsgType("text");
text.setCreateTime(getNowTime.getTime());
text.setContent("您发送的消息是:"+content);
message = MessageUtil.textMessageToXml(text);
System.out.println(message);
}
out.print(message);
} catch (Exception e) {
e.printStackTrace();
}finally {
out.close();
}
}
}
package com.acat.util;
import java.security.MessageDigest;
import java.util.Arrays;
public class CheckUtil {
private static final String token = "acat";
public static boolean checkSignature(String signature,String timestamp,String nonce){
String[] arr = new String[]{token,timestamp,nonce};
//排序
Arrays.sort(arr);
//生成字符串
StringBuffer content = new StringBuffer();
for(int i=0;i<arr.length;i++){
content.append(arr[i]);
}
//sha1加密
String temp = getSha1(content.toString());
return temp.equals(signature);
}
public static String getSha1(String str){
if(str==null || str.length()==0){
return null;
}
char hexDigits[] = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
try{
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char buf[] = new char[j*2];
int k = 0;
for(int i=0;i<j;i++){
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
}catch(Exception e){
return null;
}
}
}
package com.acat.util; import java.text.SimpleDateFormat; import java.util.Date; public class getNowTime { public static String getTime() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String value = sdf.format(new Date()); return value; } }
package com.acat.po; public class TextMessage { private String ToUserName; private String FromUserName; private String CreateTime; private String MsgType; private String Content; private String MsgId; public String getToUserName() { return ToUserName; } public String getFromUserName() { return FromUserName; } public String getMsgType() { return MsgType; } public String getContent() { return Content; } public String getMsgId() { return MsgId; } public void setToUserName(String toUserName) { ToUserName = toUserName; } public void setFromUserName(String fromUserName) { FromUserName = fromUserName; } public String getCreateTime() { return CreateTime; } public void setCreateTime(String createTime) { CreateTime = createTime; } public void setMsgType(String msgType) { MsgType = msgType; } public void setContent(String content) { Content = content; } public void setMsgId(String msgId) { MsgId = msgId; } }
package com.acat.util; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import com.acat.po.TextMessage; import com.thoughtworks.xstream.XStream; public class MessageUtil { /** * xml转成集合 * @param request * @return * @throws Exception */ public static Map<String, String> xmlToMap(HttpServletRequest request) throws Exception { Map<String, String> map = new HashMap<String, String>(); SAXReader reader = new SAXReader(); InputStream ins = request.getInputStream(); Document doc = reader.read(ins); Element root = doc.getRootElement(); List<Element> list = root.elements(); for(Element e:list){ map.put(e.getName(), e.getText()); } ins.close(); return map; } /** * 将文本消息转为xml * @return */ public static String textMessageToXml(TextMessage textMessage){ XStream stream = new XStream(); stream.alias("xml", textMessage.getClass()); return stream.toXML(textMessage); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> <display-name>weixin02</display-name> <servlet> <servlet-name>WeixinServlet</servlet-name> <servlet-class>com.acat.servlet.WeixinServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>WeixinServlet</servlet-name> <url-pattern>/weixin.do</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>
示例如下: