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; } }