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. Linux软件包的管理

    RPM软件包 RPM软件包一般的安装位置(分散): 管理程序:/sbin/* /usr/sbin/* 普通用户程序:/bin/* /usr/bin/* rpm -q ===> rpm -quer ...

  2. 使用GeoServer+OpenLayers发布和调用WMTS、Vector Tile矢量切片服务 | Publishing and Calling WMTS, Vector Tile Service Using GeoServer + OpenLayers

    Web GIS系列: 1.搭建简易Web GIS网站:使用GeoServer+PostgreSQL+PostGIS+OpenLayers3 2.使用GeoServer+QGIS发布WMTS服务 3.使 ...

  3. 编写高质量代码改善C#程序的157个建议——建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间

    建议112:将现实世界中的对象抽象为类,将可复用对象圈起来就是命名空间 在我们身边的世界中,对象是什么?对象就是事物,俗称“东西”.那么,什么东西算得上是一个对象呢?对象有属性.有行为.以动物为例,比 ...

  4. git 恢复被修改的文件

    恢复到最后一次提交的改动:   git checkout filename 如果该文件已经 add 到暂存队列中,恢复文件:   git reset HEAD filename

  5. [Mac][转] ports命令

    [Mac][转] ports命令 安装路径:/opt/local/lib/ 常用命令 port -d selfupdate #升级macport, 如同:cd /usr/ports && ...

  6. 带你玩转Visual Studio——带你高效开发

    VassistX的简单介绍与下载安装 简单介绍 VassistX的全称是Visual Assist X,是whole tomato开发的一个非常好用的插件,可用于VC6.0及Visual Studio ...

  7. 【OCP|052】052考试题库又变了,最新052题库收集整理-第15题

    15.Which two are true about space management in tablespaces? A) Locally managed tablespaces have eit ...

  8. “全栈2019”Java第七十八章:内部类可以继承其他类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. jquery源码解析:expando,holdReady,ready详解

    jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的. jQuery.extend({       //当只有一个对象时,就把这个对象 ...

  10. 什么是cluster(群集)

    一.群集的概念 在互联网应用中,随着站点对硬件性能.相应速度.服务稳定性.数据可靠性等要求越来越高,单台服务器力不从心,使用小型机或大型机价格还太昂贵,因此我们使用普通服务器来构建服务群集显然最划算. ...