package com.epalmpay.controller.apiweixin;import com.epalmpay.commom.BaseController;import com.epalmpay.entity.GroupWxKeyword;import com.epalmpay.entity.GroupWxconfig;import com.epalmpay.enumdef.BizEnum;import com.epalmpay.mapper.GroupWxconfigMapper;import com.epalmpay.plugin.MyWxMpConfigStorage;import com.epalmpay.service.group.IGroupService;import com.epalmpay.service.management.ITemplateMailSendService;import com.epalmpay.service.weixin.IWxApiMemberService;import com.epalmpay.service.weixin.IWxBaseService;import com.epalmpay.service.weixin.impl.WxService;import com.epalmpay.util.PageData;import me.chanjar.weixin.common.util.crypto.SHA1;import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Lazy;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import javax.annotation.Resource;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.OutputStream;import java.net.URLEncoder;/** * 類名稱:WechatController.java * 類描述: 微信公衆號開發入口 * * @author zsj * 建立時間:2017年5月18日 */@Controller@RequestMapping(value = "/wechat")public class WechatController extends BaseController { @Autowired protected WxService wxService; @Autowired protected IWxBaseService wxBaseService; @Autowired private IGroupService groupService; @Autowired private GroupWxconfigMapper groupWxconfigMapper; @Autowired @Lazy private ITemplateMailSendService templateMailSendService; @Resource private IWxApiMemberService wxApiMemberService; @RequestMapping(value = "serverno", method = {RequestMethod.GET, RequestMethod.POST}) public void index(HttpServletRequest request, HttpServletResponse response ) throws Exception { logBefore(logger, "------------------------------------微信入口------------------------------------"); PageData pd = new PageData(); response.setContentType("text/html;charset=UTF-8"); pd = this.getPageData(); String signature = pd.getString("signature"); //微信加密簽名 String timestamp = pd.getString("timestamp"); //時間戳 String nonce = pd.getString("nonce"); //隨機數 String echostr = pd.getString("echostr"); //字符串 String groupId = pd.getString("groupId"); //全部使用wxService 前 設置 WxMpInMemoryConfigStorage if (StringUtils.isBlank(groupId)) { return; } logger.info("校驗開始======================="); try { GroupWxconfig groupWxconfig = groupWxconfigMapper.selectByGroupId(Long.parseLong(groupId)); if(groupWxconfig != null){ logger.info("獲取到配置了+=============================="); String desSignature = SHA1.gen(groupWxconfig.getAccessToken(), timestamp, nonce); if(StringUtils.isNotEmpty(desSignature) && desSignature.equals(signature) && StringUtils.isNotEmpty(echostr)){ logger.info("進入返回階段"); OutputStream os=response.getOutputStream(); os.write(URLEncoder.encode(echostr,"UTF-8").getBytes()); os.flush(); os.close(); }else{ logger.info("進入關鍵字____________________________________________"); MyWxMpConfigStorage wxMpConfigStorage= wxBaseService.getTokenByGroupId(Long.parseLong(groupId)); if(wxMpConfigStorage==null){ return ; }else{ logger.info("已從緩存中獲取到token"); } wxService.setWxMpConfigStorage(wxMpConfigStorage); String encryptType = StringUtils.isBlank(pd.getString("encrypt_type")) ? "raw" : request.getParameter("encrypt_type"); request.getInputStream(); if ("raw".equals(encryptType)) { // 明文傳輸的消息 String inMessageXml = readContent(request); WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(inMessageXml); String toUser = inMessage.getToUser(); String content = inMessage.getContent(); String fromUser = inMessage.getFromUser(); GroupWxconfig groupWxconfig2 = groupService.selectByTxidKey(toUser); WxMpXmlOutMessage outMessage = this.wxService.route(inMessage); if(outMessage!=null){ logger.info(outMessage+"------------"+"這是outMessage"); }else{ logger.info("------------"+"這是outMessage空"); } if (groupWxconfig2 != null) { Long groupid = groupWxconfig2.getGroupId(); GroupWxKeyword groupWxKeyword = new GroupWxKeyword(); groupWxKeyword.setGroupId(groupid); groupWxKeyword.setKeyword(content); GroupWxKeyword groupWxKeyword1 = groupService.getWxKeywordByKey(groupWxKeyword); if (groupWxKeyword1 != null) {//若是該關鍵字有對應的回覆 int replytype = groupWxKeyword1.getReplyType(); if (replytype == 0) {//文本回復 outMessage = WxMpXmlOutMessage.TEXT().content(groupWxKeyword1.getReply()) .fromUser(toUser) .toUser(fromUser) .build(); } else if (replytype == 1) {//圖片回覆 outMessage = WxMpXmlOutMessage.IMAGE().mediaId(groupWxKeyword1.getReply()) .fromUser(toUser) .toUser(fromUser) .build(); } else if (replytype == 2) {//圖文消息 outMessage = WxMpXmlOutMessage.NEWS().addArticle(wxApiMemberService.sendArticlesMessage(groupWxKeyword1.getReply(), groupid)) .fromUser(toUser) .toUser(fromUser) .build(); } } } String outXml = outMessage.toXml(); System.out.println(outXml); response.getWriter().write(outXml); return; } if ("aes".equals(encryptType)) { // 是aes加密的消息 String msgSignature = pd.getString("msg_signature"); String inMessageXml = readContent(request); WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml( inMessageXml, wxService.getWxMpConfigStorage(), timestamp, nonce, msgSignature); logBefore(logger, "消息解密後內容爲" + inMessage.toString()); WxMpXmlOutMessage outMessage = this.wxService.route(inMessage); response.getWriter().write(outMessage.toEncryptedXml(wxService.getWxMpConfigStorage())); return; } logger.info("開發入口======================="); } } logger.info("校驗結束======================="); } catch (Exception e) { e.printStackTrace(); logger.info("這是異常消息"+e); } response.getWriter().println("不可識別的加密類型"); return; } private String readContent(HttpServletRequest request) throws IOException { ServletInputStream sis = request.getInputStream(); // 取HTTP請求流長度 int size = request.getContentLength(); // 用於緩存每次讀取的數據 byte[] buffer = new byte[size]; // 用於存放結果的數組 byte[] xmldataByte = new byte[size]; int count = 0; int rbyte = 0; // 循環讀取 while (count < size) { // 每次實際讀取長度存於rbyte中 rbyte = sis.read(buffer); for (int i = 0; i < rbyte; i++) { xmldataByte[count + i] = buffer[i]; } count += rbyte; } return new String(xmldataByte, "UTF-8"); } @RequestMapping(value = "test", method = {RequestMethod.GET, RequestMethod.POST}) public void test(HttpServletRequest request, HttpServletResponse response, String memberId) throws Exception { try { templateMailSendService.sendMemberTemplate(Long.valueOf(memberId), BizEnum.WebTemplateType.template1.getType(), ROOT_HOME_URL, null); } catch (Exception e) { System.out.println("模板消息發送失敗" + e); e.printStackTrace(); } return; }}