自定义菜单需要我们以POST的方式去请求接口,并且需要携带按钮信息(格式为json)。
由于自定义菜单较为简单,这里使用微信官方提供的接口测试工具对按钮增加接口进行测试:
我们为微信消息的回复制定以下规则:
即当用户输入关键字"这是为什么呢",即可回复"咱也不知道,咱也不敢问"。这个过程需要进行微信接入,步骤是:
1. 微信接入:要求我们提供接入URL以及token,微信会自动请求我们的服务,并携带参数(signature,timestaml,nonce,echostr)如果请求成功,我们原样回复echostr。至此我们就接入成功。这里,我们在微信端配置好的url为(http://0.0.0.0/verify),token为(evan)。[0.0.0.0替换为自己服务器IP)。
参数说明: signature - 微信将配置好的token以及生成的timestamp,nonce进行SHA1HEX加密,最终用于我们要验证微信提供的数据的完整性和正确性。
@GetMapping("/verify")
private void verify (HttpServletRequest request, HttpServletResponse response){
log.info("微信接入服务器");
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String token = "evan";
String echostr = request.getParameter("echostr");
if (wxService.verifyInfo(signature,timestamp,nonce,token)){
log.info("参数为:{}",echostr);
if (!StringUtils.isEmpty(echostr)){
try {
response.getWriter().write(echostr);
} catch (IOException e) {
e.printStackTrace();
}
}else{
log.info("signature为:{}", signature);
log.info("timestamp为:{}", timestamp);
log.info("nonce为:{}", nonce);
log.info("token为:{}", token);
}
}
}
/**
* 判断签名是否一致
* @param signature
* @param timestamp
* @param nonce
* @param token
* @return
*/
public boolean verifyInfo(String signature, String timestamp, String nonce, String token) {
TreeSet<String> set = new TreeSet<String>();
set.add(token);
set.add(timestamp);
set.add(nonce);
StringBuilder sb = new StringBuilder();
for (String item : set) {
sb.append(item);
}
String sign = DigestUtils.sha1Hex(sb.toString());
return signature.equalsIgnoreCase(sign);
}
@PostMapping("/verify")
private String sendMessage(HttpServletRequest request, HttpServletResponse response){
BufferedReader reader = null;
String message = "";
try{
reader = request.getReader();
String str = "";
while((str=reader.readLine()) != null) {
message += str;
}
}catch (Exception e){
e.printStackTrace();
}
return wxService.replyMessage(message);
}
public static Map<String, String> xmlParser(String str){
Map<String, String> map = new HashMap<>();
try {
Document document = DocumentHelper.parseText(str);
Element e = document.getRootElement();
map.put("ToUserName",e.elementText("ToUserName"));
map.put("FromUserName",e.elementText("FromUserName"));
map.put("Content", e.elementText("Content"));
}catch (Exception e) {
e.printStackTrace();
}
return map;
}
public String replyMessage(String str){
Map<String, String> map = XMLUtils.xmlParser(str);
Date date = new Date();
String content = "";
try {
content = replyDao.selectByKeyword(map.get("Content"));
}catch (Exception e) {
e.printStackTrace();
}
log.info("返回内容是" + content);
String message = "\n" +
" + map.get("FromUserName")+"]]> \n" +
" + map.get("ToUserName")+"]]> \n" +
" " + date.toString() +"\n" +
" \n" +
" +content+ "]]> \n" +
"";
return message;
}
@Mapper
public interface ReplyDao extends BaseDao<Reply> {
String selectByKeyword(String keyword) throws Exception;
}
<mapper namespace="com.lanou.wechat.dao.ReplyDao">
<select id="selectByKeyword" parameterType="java.lang.String"
resultType="java.lang.String">
select reply from tb_reply where keyword=#{keyword}
select>
mapper>