package com.feetao.web.service.impl;
import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.annotation.Resource;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.beans.BeanUtils;
import com.feetao.web.dao.WechatDao;
import com.feetao.web.model.WechatDO;
import com.feetao.web.service.WechatService;
import com.feetao.web.support.UrlContainer;
import com.feetao.web.wx.vo.Article;
import com.feetao.web.wx.vo.MessageEventReceiveVO;
import com.feetao.web.wx.vo.MessageImageReceiveVO;
import com.feetao.web.wx.vo.MessageLinkReceiveVO;
import com.feetao.web.wx.vo.MessageLocationReceiveVO;
import com.feetao.web.wx.vo.MessageNewsSendVO;
import com.feetao.web.wx.vo.MessageReceiveVO;
import com.feetao.web.wx.vo.MessageSendVO;
import com.feetao.web.wx.vo.MessageTextReceiveVO;
import com.feetao.web.wx.vo.MessageTextSendVO;
import com.feetao.web.wx.vo.MessageVideoReceiveVO;
import com.feetao.web.wx.vo.MessageVoiceReceiveVO;
public class WechatServiceImpl implements WechatService {
@Resource
private WechatDao wechatDao;
@Resource
private UrlContainer urlContainer;
@Override
public MessageReceiveVO parse(InputStream in) throws DocumentException {
SAXReader reader = new SAXReader();
Document doc = reader.read(in);
Element root = doc.getRootElement();
String msgType = root.element("MsgType").getTextTrim();
MessageReceiveVO message = null;
if(msgType.equalsIgnoreCase("text")) {
message = new MessageTextReceiveVO();
} else if(msgType.equalsIgnoreCase("image")) {
message = new MessageImageReceiveVO();
} else if(msgType.equalsIgnoreCase("voice")) {
message = new MessageVoiceReceiveVO();
} else if(msgType.equalsIgnoreCase("video")) {
message = new MessageVideoReceiveVO();
} else if(msgType.equalsIgnoreCase("location")) {
message = new MessageLocationReceiveVO();
} else if(msgType.equalsIgnoreCase("link")) {
message = new MessageLinkReceiveVO();
} else if(msgType.equalsIgnoreCase("event")) {
message = new MessageEventReceiveVO();
}
message.setProperties(root);
return message;
}
@Override
public MessageSendVO hander(Long userId , MessageReceiveVO receiver) {
List<WechatDO> chatList = wechatDao.getWechatList(userId);
if(chatList != null && chatList.size() > 0) {
MessageSendVO sender = null;
WechatDO wdo = null;
for(int i = 0 ; i < chatList.size() ; i++) {
WechatDO cdo = chatList.get(i);
if(cdo.getMsgKey().equals(".*")) {
wdo = cdo;
continue;
}
Matcher matcher = Pattern.compile(cdo.getMsgKey()).matcher(receiver.toString());
if(matcher.find()) {
wdo = cdo;
break;
}
}
if(wdo != null) {
if(wdo.getMsgType().equals("news")) {
sender = new MessageNewsSendVO();
Article article = new Article();
BeanUtils.copyProperties(wdo, article);
if(StringUtils.isBlank(article.getUrl()))
article.setUrl(urlContainer.createComingLink(wdo.getPlugin(), userId, receiver.getFromUserName(), receiver.getToUserName()));
((MessageNewsSendVO)sender).addArticle(article);
} else if(wdo.getMsgType().equals("text")) {
sender = new MessageTextSendVO();
((MessageTextSendVO)sender).setContent(wdo.getDescription());
}
sender.setFromUserName(receiver.getToUserName());
sender.setToUserName(receiver.getFromUserName());
sender.setCreateTime((int)(System.currentTimeMillis()/1000));
sender.setMsgType(wdo.getMsgType());
}
return sender;
}
return null;
}
@Override
public boolean checkSign(String signature, String timestamp, String nonce) {
String[] arr = new String[]{"qwerty",timestamp,nonce};
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++)
content.append(arr[i]);
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
content = null;
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
/**
* 将字节转换为十六进制字符
* @param ib
* @return
*/
private 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;
}
/**
* 将字节数组转换为十六进制字符串
* @param bytearray
* @return
*/
private String byteToStr(byte[] bytearray) {
String strDigest = "";
for (int i = 0; i < bytearray.length; i++)
strDigest += byteToHexStr(bytearray[i]);
return strDigest;
}
}