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

最新文章

  1. RHEL6.3系统安装
  2. 4、ASP.NET MVC入门到精通——NHibernate构建一个ASP.NET MVC应用程序
  3. 转换,2D,3D
  4. sql server 基础教程[温故而知新三]
  5. scala 学习笔记(05) OOP(中)灵活的trait
  6. Java关键字this、super使用总结
  7. 代码演示用 .NET 4.5 (C# 5.0)自带的压缩类 ZipArchive 创建一个压缩文件
  8. Building microservices with Spring Cloud and Netflix OSS, part 2
  9. 字符集(CHARACTER SET)和校对集(COLLATE)
  10. Silverlight中DataGrid的显示指定列、修改默认列名和格式化日期数据和小数数据
  11. htm初学笔记
  12. Nis+Nfs+Autofs
  13. 基于hadoop的图书推荐
  14. css控制table的td宽度
  15. com.alibaba.druid.sql.parser.ParserException: syntax error, QUES %, pos 80 like报错解决
  16. 【Android应用开发】 推送原理解析 极光推送使用详解 (零基础精通推送)
  17. Docker笔记——搭建私有仓
  18. 装饰者模式vs适配器模式
  19. Notes of Daily Scrum Meeting(12.22)
  20. Jmeter测试实践:文件下载接口

热门文章

  1. sql server锁检测
  2. 在APP中集成iAd Banner展示广告盈利
  3. 编写高质量代码改善C#程序的157个建议——建议132:考虑用类名作为属性名
  4. c_c++基础问题(平时读书时笔记)
  5. S.O.L.I.D原则
  6. Major OSL changes to catch up
  7. FTP ftp部署遇到问题
  8. 手把手带你打造一个 Android 热修复框架
  9. adt-bundle-windows不显示ADK Manage和其它图标的解决方法?
  10. Selenium爬取元素下子元素方法