package com.xbr518.api.wechat;
import java.io.IOException;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.xbr518.annotation.api.IgnoreAuth;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.session.WxSessionManager;
import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
import me.chanjar.weixin.mp.api.WxMpMessageHandler;
import me.chanjar.weixin.mp.api.WxMpMessageRouter;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutNewsMessage.Item;
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutTextMessage;
/**
* 微信公众号Controller
* @author wp 2018-12-03
*/
@RestController
@RequestMapping("/api/wechat")
public class WeChatController {

/*@Autowired
@Qualifier("textHandler")
private WxMpMessageHandler textHandler;
@Autowired
@Qualifier("viewHandler")
private WxMpMessageHandler viewHandler;
@Autowired
@Qualifier("clickHandler")
private WxMpMessageHandler clickHandler;
@Autowired
@Qualifier("subscribeHandler")
private WxMpMessageHandler subscribeHandler;
@Autowired
@Qualifier("unsubscribeHandler")
private WxMpMessageHandler unsubscribeHandler; */

protected WxMpInMemoryConfigStorage config;
protected WxMpService wxMpService;
protected WxMpMessageRouter wxMpMessageRouter;
String PUBLIC_APPID = "**********************”;
String PUBLIC_APPSECRET = "**********************”;
String PUBLIC_TOKEN = "**********************”;
String EncodingAESKey = "**********************”;

public static final String textResponseMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%d</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content></xml>";
public static final String GraphicResponseMsg = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[%s]]></FromUserName><CreateTime>%d</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount>1</ArticleCount><Articles><item><Title><![CDATA[%s]]></Title><Description><![CDATA[%s]]></Description><PicUrl><![CDATA[%s]]></PicUrl><Url><![CDATA[%s]]></Url></item></Articles></xml>";
public static String welcomeContent = "哈喽,亲爱的{name},恭喜您正在进入人工智能前沿阵地!\n小白人餐桌智媒体,\n打造中国首家餐桌智媒体,\n有你,有我,\n有它"+"👉🏻"+"<a href='https://u.eqxiu.com/s/VtXZMsR6'>3.5万元让你站在人工智能的风口上!</a>";
public static final String defaultWelcomeContent = "哈喽,恭喜您正在进入人工智能前沿阵地!\n小白人餐桌智媒体,\n打造中国首家餐桌智媒体,\n有你,有我,\n有它"+"👉🏻"+"<a href='https://u.eqxiu.com/s/VtXZMsR6'>3.5万元让你站在人工智能的风口上!</a>";

public static final String commonContent = "我就知道你需要我的指点/:,@P\n回复【扭蛋】,开启你的王者之路\n回复【表白】,获得你的撩妹神器\n回复【美食】,搜索全城美食信息\n回复【定制】,定制私人场景表白\n回复【客服】,一键呼唤客服姐姐";
public static final String defaultContent = "正在疯狂研究的路上……";
public static final String serviceContent = "在的呢,有什么可以帮助到你的呢?\n如有需要,可以拨打全国客服热线\n电话:400-082-0518";

/**
* get
* @author wp 2018-12-03
* @throws IOException
*/
@IgnoreAuth
@GetMapping("msg_event")
public void msg_eventGet(HttpServletRequest request, HttpServletResponse response) throws IOException{

config = new WxMpInMemoryConfigStorage();
config.setAppId(PUBLIC_APPID); // 设置微信公众号的appid
config.setSecret(PUBLIC_APPSECRET); // 设置微信公众号的app corpSecret
config.setToken(PUBLIC_TOKEN); // 设置微信公众号的token
config.setAesKey(EncodingAESKey); // 设置微信公众号的EncodingAESKey
wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(config);
response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
String signature = request.getParameter("signature");
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");

if (!wxMpService.checkSignature(timestamp, nonce, signature)) {
// 消息签名不正确,说明不是公众平台发过来的消息
response.getWriter().println("非法请求");

return;
}
String echostr = request.getParameter("echostr");

if (StringUtils.isNotBlank(echostr)) {
// 说明是一个仅仅用来验证的请求,回显echostr
response.getWriter().println(echostr);

return;
}
}

/**
* post
* @author wp 2018-12-03
* @throws IOException
*/
@IgnoreAuth
@PostMapping("msg_event")
public void msg_eventPost(HttpServletRequest request, HttpServletResponse response) throws IOException{

config = new WxMpInMemoryConfigStorage();
config.setAppId("**********************”;); // 设置微信公众号的appid
config.setSecret("**********************”;); // 设置微信公众号的app corpSecret
config.setToken("**********************”;); // 设置微信公众号的token
config.setAesKey("**********************”;); // 设置微信公众号的EncodingAESKey

wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(config);

response.setContentType("text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
String nonce = request.getParameter("nonce");
String timestamp = request.getParameter("timestamp");

WxMpMessageHandler handler = new WxMpMessageHandler() {

@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> context,
WxMpService wxMpService, WxSessionManager arg3) throws WxErrorException {
WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content(commonContent).fromUser(wxMessage.getToUser())
.toUser(wxMessage.getFromUser()).build();
return m;
}
};

wxMpMessageRouter = new WxMpMessageRouter(wxMpService);
wxMpMessageRouter.rule().async(false).content("小白")
.handler(handler).end()
.rule().async(false).content("扭蛋")
.handler(new WxMpMessageHandler() {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> arg1, WxMpService arg2,
WxSessionManager arg3) throws WxErrorException {
Item item = new Item();
item.setUrl("http://bbm.xbr518.cn/MyXbrSystem/404.html");
item.setPicUrl("http://bbm.xbr518.cn/LittleWhiteService/images/nddzz.jpg");
item.setDescription("点击进入扭蛋大作战!!");
item.setTitle("扭蛋大作战");
WxMpXmlOutMessage m = WxMpXmlOutMessage.NEWS()
.fromUser(wxMessage.getToUser())
.toUser(wxMessage.getFromUser())
.addArticle(item)
.build();
return m;
}
}).end()
.rule().async(false).content("表白")
.handler(new WxMpMessageHandler() {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> arg1, WxMpService arg2,
WxSessionManager arg3) throws WxErrorException {
Item item = new Item();
item.setUrl("http://bbm.xbr518.cn/MyXbrSystem/404.html");
item.setPicUrl("http://bbm.xbr518.cn/LittleWhiteService/images/bbsk.jpg");
item.setDescription("点击进入表白时刻!!");
item.setTitle("表白时刻");
WxMpXmlOutMessage m = WxMpXmlOutMessage.NEWS()
.fromUser(wxMessage.getToUser())
.toUser(wxMessage.getFromUser())
.addArticle(item)
.build();
return m;
}
}).end()
.rule().async(false).content("美食")
.handler(new WxMpMessageHandler() {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> arg1, WxMpService arg2,
WxSessionManager arg3) throws WxErrorException {
Item item = new Item();
item.setUrl("http://bbm.xbr518.cn/MyXbrSystem/404.html");
item.setPicUrl("http://bbm.xbr518.cn/LittleWhiteService/images/mslm.jpg");
item.setDescription("点击进入美食联盟!!");
item.setTitle("美食联盟");
WxMpXmlOutMessage m = WxMpXmlOutMessage.NEWS()
.fromUser(wxMessage.getToUser())
.toUser(wxMessage.getFromUser())
.addArticle(item)
.build();
return m;
}
}).end()
.rule().async(false).content("订制")
.handler(new WxMpMessageHandler() {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> arg1, WxMpService arg2,
WxSessionManager arg3) throws WxErrorException {
Item item = new Item();
item.setUrl("http://bbm.xbr518.cn/MyXbrSystem/404.html");
item.setPicUrl("http://bbm.xbr518.cn/LittleWhiteService/images/srdz.jpg");
item.setDescription("点击进入私人订制!!");
item.setTitle("私人订制");
WxMpXmlOutMessage m = WxMpXmlOutMessage.NEWS()
.fromUser(wxMessage.getToUser())
.toUser(wxMessage.getFromUser())
.addArticle(item)
.build();
return m;
}
}).end()
.rule().async(false)
.handler(new WxMpMessageHandler() {
@Override
public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map<String, Object> arg1, WxMpService arg2,
WxSessionManager arg3) throws WxErrorException {
WxMpXmlOutTextMessage m = WxMpXmlOutMessage.TEXT().content(serviceContent).fromUser(wxMessage.getToUser()).toUser(wxMessage.getFromUser()).build();
return m;
}
}).end();

String encryptType = StringUtils.isBlank(request.getParameter("encrypt_type")) ? "raw": request.getParameter("encrypt_type");

if ("raw".equals(encryptType)) {
// 明文传输的消息
WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(request.getInputStream());
WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage);

if (outMessage == null) {
// 为null,说明路由配置有问题,需要注意
response.getWriter().write("");
}
response.getWriter().write(outMessage.toXml());

return;
}
if ("aes".equals(encryptType)) {
// 是aes加密的消息
String msgSignature = request.getParameter("msg_signature");
WxMpXmlMessage inMessage = WxMpXmlMessage.fromEncryptedXml(request.getInputStream(), config, timestamp,
nonce, msgSignature);
WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage);

if (outMessage == null) {
// 为null,说明路由配置有问题,需要注意
response.getWriter().write("");
}
response.getWriter().write(outMessage.toEncryptedXml(config));

return;
}
response.getWriter().println("不可识别的加密类型");

return;
}
}

posted on 2018-12-04 17:12  维也纳的忧伤  阅读(2178)  评论(0编辑  收藏  举报