开发校验程序必须能够处理HTTP GET请求
请求校验流程
获取GET请求中的4个参数 signature、timestamp、nonce和echostr;
将token、timestamp、nonce3个参数按照字典排序
将排序后的3个参数按顺序拼接成一个字符串,并对该字符串进行SHA1加密
将加密后的字符串与参数signature进行对比,如果相等则证明该请求是来自微信服务器的,需要原样返回参数echostr.
String signature = request.getParameter("signature");//获取signature
String token ="";//用户自定义
String timestamp = request.getParameter("timestamp");//获取timestamp
String echostr = request.getParameter("echostr");//获取echostr
String [] paramstr = new String[] {token,timestamp,nonce};
Arrays.sort(paramstr);
String content = paramstr[0].concat(paramstr[1]).concat(paramstr[2]);
MessageDigset md = MessageDigset.getInstance("SHA-1");
byte[] digset = md.digset(content.getBytes());
String ciphertext = byteToStr(digset);
PrintWriter out = response.getWriter();
if(cipertext.equals(signature.toUpperCase())){
out.print(echostr);
}
out.close();
将byte数组转换成十六进制字符串
private static String byteToStr(byte[] byteArray){
String strDigSet = "";
for(int i=0;i<bytesArray.length;i++){
strDigSet + byteToHexStr(byteArray[i]);
}
return strDigSet;
}
private static String byteToHexStr(byte ib){
char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] ob = new Char[2];
ob[0]=Digit[(ib>>>4)&0x0f];
ob[1]=Digit(ib&0x0f);
String s = new String(ob);
return s;
}
微信信息交互过程:
接收消息:普通微信用户向公众账号发送消息时,微信服务器将POST消息的XML数据包发送到开发者填写的URL上
发送消息: 对于每一个POST请求,开发者在响应包中返回特定的响应结构,并对该消息进行响应(支持回复文本,图片,图文,语音、视频、音乐)
信息交互模型:
用户发送消息到微信服务器,微信服务器收到消息,根据开发者在接口配置中填写URL,将消息通过HTTP POST 方式传递到公众号服务器;
公众号服务器接收到消息后,会按照业务逻辑进行相应的处理
处理完成后,公众账号服务器会将处理结果返回微信服务器,
微信服务器将公众号服务器内容返回给用户