公众号配置

后端代码编写
package com.app.api.controller.wx;
import com.app.api.utils.WxUtil;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;
@RestController
@RequestMapping("/wx/mp/")
public class MpController {
@PostMapping(value = "callback")
public void postCallBack(HttpServletRequest request, HttpServletResponse response, @RequestBody String xmldata) throws IOException {
System.out.println("响应了");
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 (WxUtil.checkSignature(signature, timestamp, nonce)) {
doSomething(xmldata);
out.print(echostr);
} else {
System.out.println("不是微信发来的请求!");
}
}
@GetMapping(value = "callback")
public void getCallBack(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println("响应了");
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 (WxUtil.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);
} else {
System.out.println("不是微信发来的请求!");
}
}
private void doSomething(String xmldata) {
Map<String, String> map = WxUtil.readStringXmlOut(xmldata);
String event = map.get("Event");
System.out.println(event);
String fromUserName = map.get("FromUserName");
System.out.println(fromUserName);
}
}
package com.app.api.utils;
import org.apache.commons.codec.digest.DigestUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class WxUtil {
public static Map<String,String> readStringXmlOut(String xml) {
Map<String,String> map = new HashMap<String,String>();
Document doc = null;
try {
doc = DocumentHelper.parseText(xml);
Element rootElt = doc.getRootElement();
List<Element> list = rootElt.elements();
for (Element element : list) {
map.put(element.getName(), element.getText());
}
} catch (DocumentException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
private static final String token = "diezhong";
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[]{token, timestamp, nonce};
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
String temp = getSHA1String(content.toString());
return temp.equals(signature);
}
private static String getSHA1String(String data) {
return DigestUtils.shaHex(data);
}
}
消息内容
<xml>
<ToUserName><![CDATA[toUser]]></ToUserName>
<FromUserName><![CDATA[FromUser]]></FromUserName>
<CreateTime>123456789</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[subscribe]]></Event>
</xml>
| 参数 | 描述 |
|---|
| ToUserName | 开发者微信号 |
| FromUserName | 发送方账号(一个OpenID) |
| CreateTime | 消息创建时间 (整型) |
| MsgType | 消息类型,event |
| Event | 事件类型,subscribe(订阅)、unsubscribe(取消订阅) |
注意事项
- 公众号上提交服务器配置接口时,http协议只能用80端口,https协议只能用443端口
- 验证接口只调用一次后续就没有调用了