配置:
wx.token.key=dev
wx.domain=
wx.appId=
wx.appsecret=
wx.token=
wx.aesKey=
wx.templateId=
wx.templateUrl=
定义基类:
Controller
public abstract class WxPortalController {
private Logger logger = LoggerFactory.getLogger(WxPortalController.class);
/**
* 绑定微信服务器方法
*
* @param sign
* @return
*/
@RequestMapping(method = RequestMethod.GET)
public String checkSignature(WxSign sign) {
if (SignUtil.checkSignature(getToken(), sign.getSignature(), sign.getTimestamp(), sign.getNonce())) {
logger.info("接入成功");
return sign.getEchostr();
}
logger.error("接入失败");
return "";
}
/**
* 处理微信服务器发来的请求方法
*
* @param req
* @return
*/
@RequestMapping(method = RequestMethod.POST)
public String post(HttpServletRequest req) {
String respMessage = processRequest(req);
return respMessage;
}
// 核心处理微信消息--子类可以重写
public String processRequest(HttpServletRequest request){
String respMessage = null;
try {
// 默认返回的文本消息内容
String respContent = "请求处理异常,请稍候尝试!";
// xml请求解析
Map<String, String> requestMap = MessageUtil.parseXml(request);
// 发送方帐号(open_id)
String fromUserName = requestMap.get("FromUserName");
// 公众帐号
String toUserName = requestMap.get("ToUserName");
// 消息类型
String msgType = requestMap.get("MsgType");
// 点击菜单id
String EventKey = requestMap.get("EventKey");
// 接收文本消息内容
String content = requestMap.get("Content");
// 回复文本消息
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
textMessage.setFuncFlag(0);
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
}// 图片消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
respContent = "您发送的是图片消息!";
textMessage.setContent(respContent);
// 将文本消息对象转换成xml字符串
respMessage = MessageUtil.textMessageToXml(textMessage);
}
// 地理位置消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
respContent = "您发送的是地理位置消息!";
textMessage.setContent(respContent);
// 将文本消息对象转换成xml字符串
respMessage = MessageUtil.textMessageToXml(textMessage);
}
// 链接消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
respContent = "您发送的是链接消息!";
textMessage.setContent(respContent);
// 将文本消息对象转换成xml字符串
respMessage = MessageUtil.textMessageToXml(textMessage);
}
// 音频消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
respContent = "您发送的是音频消息!";
textMessage.setContent(respContent);
// 将文本消息对象转换成xml字符串
respMessage = MessageUtil.textMessageToXml(textMessage);
}// 事件推送
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
// 事件类型
String eventType = requestMap.get("Event");
// 自定义菜单点击事件
if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
}
// 点击菜单转网页
else if (eventType.equals(MessageUtil.EVENT_TYPE_VIEW)) {
}
// 订阅
else if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
StringBuffer buffer = new StringBuffer();
buffer.append("您好,欢迎关注");
respContent = String.valueOf(buffer);
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
} else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN)) {
}
// 取消订阅
else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
}
}
} catch (Exception e) {
logger.error(e.getMessage().toString());
e.printStackTrace();
}
return respMessage;
}
/**
* 子类提供token用于绑定微信公众平台
*
* @return token值
*/
protected abstract String getToken();
/**
* 公众号APPID,使用消息加密模式时用户自行设置
*
* @return 微信公众平台提供的appid
*/
protected String getAppId() {
return null;
}
/**
* 加密的密钥,使用消息加密模式时用户自行设置
*
* @return 用户自定义的密钥
*/
protected String getAESKey() {
return null;
}
使用:
@RestController
@RequestMapping("/wechat/portal")
public class WeChatController extends WxPortalController{
@Value("${wx.token}")
private String TOKEN;
@Override
protected String getToken() {
return TOKEN;
}
}