package net.tooan.ynpay.wechat.agent.helper;
import net.tooan.ynpay.commons.helper.Encrypt;
import net.tooan.ynpay.third.jfinal.log.Logger;
import net.tooan.ynpay.wechat.agent.model.Article;
import net.tooan.ynpay.wechat.agent.model.Msg;
import net.tooan.ynpay.wechat.agent.model.Server;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import javax.servlet.ServletInputStream;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
/**
* Created with IntelliJ IDEA.
* User: Jing
* Date: 13-10-19
* Time: 下午8:26
* <p/>
* 微信工具集,提供 请求校验,xml2Object 等功能
*/
public class MsgTools {
private static Logger logger = Logger.getLogger(MsgTools.class);
private static HashMap<String, Server> tokenCache = new HashMap<String, Server>();
/**
* 校验 signature 是否合法
*
* @param signature 签名
* @param timestamp 时间戳
* @param nonce 噪点
* @return 成功后返回 true
*/
public static Boolean check(String signature, String timestamp, String nonce, String token) {
if (StringUtils.isBlank(signature)) {
return false;
}
String[] arr = new String[]{token, timestamp, nonce};
Arrays.sort(arr);
String str = StringUtils.join(arr, StringUtils.EMPTY);
return signature.equals(Encrypt.sha1(str));
}
public static Msg parse(ServletInputStream is) throws Exception {
Msg msg = new Msg();
Document document = DocumentHelper.parseText(IOUtils.toString(is));
Element root = document.getRootElement();
msg.setToUserName(root.elementText("ToUserName"));
msg.setFromUserName(root.elementText("FromUserName"));
msg.setCreateTime(Long.valueOf(root.elementText("CreateTime")));
msg.setType(root.elementText("MsgType"));
msg.setMsgId(Long.valueOf(root.elementText("MsgId")));
switch (MsgType._(root.elementText("MsgType"))) {
case EVENT:
msg.setEvent(root.elementText("Event"));
msg.setEventKey(root.elementText("EventKey"));
break;
case IMAGE:
msg.setUrl(root.elementText("PicUrl"));
break;
case LINK:
msg.setTitle(root.elementText("Title"));
msg.setContent(root.elementText("Description"));
msg.setUrl(root.elementText("Url"));
break;
case LOCATION:
msg.setLocationX(Float.valueOf(root.elementText("Location_X")));
msg.setLocationY(Float.valueOf(root.elementText("Location_Y")));
msg.setScale(Integer.valueOf(root.elementText("Scale")));
msg.setContent(root.elementText("Label"));
break;
default:
msg.setContent(root.elementText("Content"));
break;
}
return msg;
}
public static Long getCurrentTime() {
return Long.valueOf(String.valueOf(System.currentTimeMillis() / 1000));
}
public static Msg renderTextMsg(String content) {
Msg replyMsg = new Msg();
replyMsg.setType(MsgType.TEXT.name().toLowerCase());
replyMsg.setContent(content);
return replyMsg;
}
public static Msg renderMusicMsg(String musicUrl) {
return renderMusicMsg(StringUtils.EMPTY, StringUtils.EMPTY, musicUrl, musicUrl);
}
public static Msg renderMusicMsg(String title, String description, String musicUrl, String hQMusicUrl) {
Msg replyMsg = new Msg();
replyMsg.setType(MsgType.MUSIC.name().toLowerCase());
replyMsg.setTitle(title);
replyMsg.setContent(description);
replyMsg.setUrl(musicUrl);
replyMsg.setUrl2(hQMusicUrl);
return replyMsg;
}
public static Msg renderNewsMsg(List<Article> articles) {
Msg replyMsg = new Msg();
replyMsg.setType(MsgType.NEWS.name().toLowerCase());
replyMsg.setArticles(articles);
return replyMsg;
}
}