package com.gx.core.wx.support;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.fangjian.framework.core.wx4j.lang.JaxbParser;
import com.fangjian.framework.core.wx4j.lang.StreamUtils;
import com.fangjian.framework.core.wx4j.event.EventType;
import com.fangjian.framework.core.wx4j.event.MsgType;
import com.fangjian.framework.core.wx4j.request.WechatRequest;
import com.fangjian.framework.core.wx4j.response.ArticleResponse;
import com.fangjian.framework.core.wx4j.response.ImageResponse;
import com.fangjian.framework.core.wx4j.response.MusicResponse;
import com.fangjian.framework.core.wx4j.response.TransInfoResponse;
import com.fangjian.framework.core.wx4j.response.VideoResponse;
import com.fangjian.framework.core.wx4j.response.VoiceResponse;
import com.fangjian.framework.core.wx4j.response.WechatResponse;
import com.fangjian.framework.core.wx4j.util.XmlHelper;
/**
* 类名称:WxChatSupportAction </br>
* 类描述: </br>
* 创建人:fangjian </br>
* 创建时间:2016年10月19日 上午10:36:03 </br>
* 修改人:fangjian </br>
* 修改时间:2016年10月19日 上午10:36:03 </br>
* 修改备注: </br>
* @version </br>
*/
public abstract class WxChatSupportAction {
Logger logger = Logger.getLogger(WxChatSupportAction.class);
private HttpServletRequest request;
protected WechatRequest wechatRequest;
protected WechatResponse wechatResponse;
/**
* 构建微信处理
* @param request 微信服务发过来的http请求
*/
public WxChatSupportAction(HttpServletRequest request){
logger.info("WechatSupport reading......");
this.request = request;
this.wechatRequest = new WechatRequest();
this.wechatResponse = new WechatResponse();
}
/**
* wechat调用入口,进行数据接收,事件分发
* @return
*/
public String execute(){
logger.info("WechatSupport execute.....");
//分发消息,得到响应
String result = dispatch();
logger.info("WechatSupport execute return msg:" + result);
return result;
}
/**
* 分发处理,得到响应
* @return
*/
private String dispatch() {
String postDataStr = null;
try {
postDataStr = StreamUtils.streamToString(request.getInputStream());
logger.info("postDataStr="+postDataStr);
} catch (IOException e) {
logger.error("post data deal failed!");
e.printStackTrace();
}
// 解析数据
setPostData(postDataStr);
// 消息分发处理
dispatchMessage();
// 响应事件
String result = response();
//返回对象解析出来的xml格式信息
return result;
}
/**
* 得到post数据,对象化
* @param xmlStr
*/
private void setPostData(String xmlStr){
try {
JaxbParser jaxbParser = new JaxbParser(WechatRequest.class);
this.wechatRequest = (WechatRequest)jaxbParser.toObj(xmlStr);
} catch (Exception e) {
logger.error("post data parse error");
e.printStackTrace();
}
}
/**
* 消息事件分发
*/
private void dispatchMessage(){
logger.info("distributeMessage start");
if(StringUtils.isBlank(wechatRequest.getMsgType())){
logger.info("msgType is null");
}
MsgType msgType = MsgType.valueOf(wechatRequest.getMsgType());
logger.info("msgType is " + msgType.name());
switch (msgType) {
case event:
//事件统一处理方法
dispatchEvent();
break;
case text:
onText();
break;
case image:
onImage();
break;
case voice:
onVoice();
break;
case video:
onVideo();
break;
case shortvideo:
onShortVideo();
break;
case location:
onLocation();
break;
case link:
onLink();
break;
default:
onUnknown();
break;
}
}
/**
* event事件分发
*/
private void dispatchEvent() {
logger.info("dispatchEvent start");
EventType event = EventType.valueOf(wechatRequest.getEvent());
logger.info("dispatch event,event is " + event.name());
switch (event) {
case CLICK:
click();
break;
case subscribe:
subscribe();
break;
case unsubscribe:
unSubscribe();
break;
case SCAN:
scan();
break;
case LOCATION:
location();
break;
case VIEW:
view();
break;
case TEMPLATESENDJOBFINISH:
templateMsgCallback();
break;
case scancode_push:
scanCodePush();
break;
case scancode_waitmsg:
scanCodeWaitMsg();
break;
case pic_sysphoto:
picSysPhoto();
break;
case pic_photo_or_album:
picPhotoOrAlbum();
break;
case pic_weixin:
picWeixin();
break;
case location_select:
locationSelect();
break;
case kf_create_session:
kfCreateSession();
break;
case kf_close_session:
kfCloseSession();
break;
case kf_switch_session:
kfSwitchSession();
break;
default:
break;
}
}
/**
* 返回响应数据
* @return
*/
private String response(){
String result = null;
try {
// JaxbParser jaxbParser = new JaxbParser(WechatResponse.class);
// //设置
// jaxbParser.setCdataNode(WechatResponse.CDATA_TAG);
// //输出xml格式
// result = jaxbParser.toXML(wechatResponse);
result = XmlHelper.objectToXML(WechatResponse.class, wechatResponse);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 响应数据基础构造
*/
private void responseBase(){
wechatResponse.setToUserName(this.wechatRequest.getFromUserName());
wechatResponse.setFromUserName(wechatRequest.getToUserName());
wechatResponse.setCreateTime(wechatRequest.getCreateTime());
}
/**
* 回复文本消息
* @param content 回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)
*/
public void responseText(String content){
responseBase();
wechatResponse.setMsgType(MsgType.text.name());
wechatResponse.setContent(content);
}
/**
* 回复图片消息
* @param mediaId 通过上传多媒体文件,得到的id
*/
public void responseImage(String mediaId){
responseBase();
wechatResponse.setMsgType(MsgType.image.name());
ImageResponse image = new ImageResponse();
image.setMediaId(mediaId);
wechatResponse.setImage(image);
}
/**
* 回复语音消息
* @param mediaId 通过上传多媒体文件,得到的id
*/
public void responseVoice(String mediaId){
responseBase();
wechatResponse.setMsgType(MsgType.voice.name());
VoiceResponse voice = new VoiceResponse();
voice.setMediaId(mediaId);
wechatResponse.setVoice(voice);
}
/**
* 回复视频消息
* @param mediaId 通过上传多媒体文件,得到的id
* @param title 视频消息的标题
* @param description 视频消息的描述
*/
public void responseVideo(String mediaId,String title,String description){
VideoResponse video = new VideoResponse();
video.setMediaId(mediaId);
video.setTitle(title);
video.setDescription(description);
responseVideo(video);
}
/**
* 回复视频消息
* @param video 视频消息
*/
public void responseVideo(VideoResponse video){
responseBase();
wechatResponse.setMsgType(MsgType.video.name());
wechatResponse.setVideo(video);
}
/**
* 回复音乐消息
* @param title 音乐标题
* @param description 音乐描述
* @param musicURL 音乐链接
* @param hQMusicUrl 高质量音乐链接,WIFI环境优先使用该链接播放音乐
* @param thumbMediaId 缩略图的媒体id,通过上传多媒体文件,得到的id
*/
public void responseMusic(String title,String description,
String musicURL,String hQMusicUrl,String
- 1
- 2
前往页