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

后台微信开发入口+关键字 回复等 关注公众号回复 注意获取随机Token 微信的对接校验Token保存到数据库的只是做第一次的校验 其他对微信公众号的操作是去缓存中获取7200S的随机Token的更多相关文章

  1. 5.2:缓存中获取单例bean

    5.2  缓存中获取单例bean 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了.前面已经提到过,单例在Spring的同一个容器内只会被创建一次,后续再获取bean直接从单例 ...

  2. Spring源码分析(十三)缓存中获取单例bean

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 介绍过FactoryBean的用法后,我们就可以了解bean加载的过程了 ...

  3. 【转载】[C#]枚举操作(从枚举中获取Description,根据Description获取枚举,将枚举转换为ArrayList)工具类

    关键代码: using System; using System.Collections; using System.Collections.Generic; using System.Compone ...

  4. asp.net微信开发第四篇----已关注用户管理

    公众号可通过本接口来获取帐号的关注者列表,关注者列表由一串OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的)组成.一次拉取调用最多拉取10000个关注者的OpenID,可以通过 ...

  5. SDWebImage从缓存中获取图片

      if ([[SDImageCache sharedImageCache] imageFromKey:sort.imageUrl]) {         [cell.photoImageView s ...

  6. volley6--CacheDispatcher从缓存中获取数据

    源码: /* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, V ...

  7. ftp 下载时防止从缓存中获取文件

    //http://baike.baidu.com/link?url=QucJiA_Fg_-rJI9D4G4Z4687HG4CfhtmBUd5TlXrcWCeIEXCZxIh0TD7ng1wROAzAu ...

  8. java微信开发(wechat4j)——wechat4j配置文件解读

    wechat4j的配置文件是wechat4j.properties.需要放置在项目src目录下.在wechat4j.jar中的META-INF下有一个wechat4j.properties.sampl ...

  9. 微信开发之如何使用开发工具--weixin-java-tools

    一.前沿 微信公众平台由于没有提供针对语言的开发包,只公布了一个基于Http协议的接口和加解密的算法sdk,这样给微信公众号的开发者带来很多工作量,除了实现业务逻辑外,还需要自己处理底层的接口协议细节 ...

随机推荐

  1. HDU 4352 XHXJ's LIS (数位DP+LIS+状态压缩)

    题意:给定一个区间,让你求在这个区间里的满足LIS为 k 的数的数量. 析:数位DP,dp[i][j][k] 由于 k 最多是10,所以考虑是用状态压缩,表示 前 i 位,长度为 j,状态为 k的数量 ...

  2. Hadoop压缩之CompressionCodecFactory

    1.CompressionCodecFactory简介 当在读取一个压缩文件的时候,可能并不知道压缩文件用的是哪种压缩算法,那么无法完成解压任务.在Hadoop中,CompressionCodecFa ...

  3. 金士顿DT100 G3 PS2251-07海力士U盘量产修复成功教程

    金士顿DT100 G3这款U盘.用了大概一年半没什么问题,前段时间拷贝大文件,无奈电脑突然断电,然后这个U盘在电脑上就读不出来了,只能显示盘符,所以有了修复过程.   最开始我也是菜鸟,不知道怎么搞, ...

  4. CodeForces 519E A and B and Lecture Rooms(倍增)

    A and B are preparing themselves for programming contests. The University where A and B study is a s ...

  5. [LeetCode 题解]: pow(x,n)

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Implement po ...

  6. Windows解决多版本python执行pip3时出错AttributeError: module 'enum' has no attribute 'IntFlag'?

    摘要: 本机装有python2.7和python3.6,执行pip和pip2时没有问题,执行pip3时提示: C:\Users\>pip3 Traceback (most recent call ...

  7. 启动类加注解@MapperScan spring boot mybatis 启动错误

    Description: Field userDao in com.gcy.springsecuritydemo.service.user.UserService required a bean of ...

  8. todolist作业涉及知识点

    window.event对象详细介绍 1.event代表事件的状态,例如触发event对象的元素.鼠标的位置及状态.按下的键等等.event对象只在事件发生的过程中才有效.event的某些属性只对特定 ...

  9. AOP之 Filter实用

    前言 开心一笑~~~ 一个年轻的程序员和一个项目经理登上了一列在山里行驶的火车,他们发现列车上几乎都坐满了,只有两个在一起的空位,这个空位的对面是一个老奶奶和一个年轻漂亮的姑娘.两个上前坐了下来.程序 ...

  10. 模拟实现STL库

    最近在复习STL,感觉再看的时候比刚开始学的时候通透很多.以前模拟实现了一个STL库,最近复习完又重构了一遍.代码放出来以供后面学习.如果有写的不好的地方欢迎大家批评指正. STL_List.h #p ...