ActionMapping->abstract

This commit is contained in:
jy.hu 2014-10-28 16:45:47 +08:00
parent 0427716348
commit 2d5d65ff0b
28 changed files with 106 additions and 46 deletions

View File

@ -17,6 +17,11 @@ weixin4j
2).weixin4j-mp:用netty构建http服务器并支持消息分发
* 2014-10-28
1).weixin4j-mp:调整ActionMapping抽象化
接下来
------
公众号支付模块引入

View File

@ -71,24 +71,6 @@ public class MessageUtil {
}
}
/**
* 获取对应的mapping key
*
* @param xmlMsg
* @return
* @throws DocumentException
* @see com.foxinmy.weixin4j.server.WeixinActionMapping
*/
public static String getMappingKey(String xmlMsg) throws DocumentException {
Document doc = DocumentHelper.parseText(xmlMsg);
String msgType = doc.selectSingleNode("/xml/MsgType").getStringValue();
if (msgType.equalsIgnoreCase(MessageType.event.name())) {
msgType += "_"
+ doc.selectSingleNode("/xml/Event").getStringValue();
}
return msgType;
}
/**
* xml消息转换为消息对象
*

View File

@ -57,3 +57,7 @@ tencent weixin platform java sdk 微信公众平台开发工具包 http://mp.wei
* 2014-10-27
1).用netty构建http服务器并支持消息分发
* 2014-10-28
1).调整ActionMapping抽象化

View File

@ -7,12 +7,14 @@ import java.util.List;
import com.alibaba.fastjson.JSONObject;
import com.foxinmy.weixin4j.exception.WeixinException;
import com.foxinmy.weixin4j.http.BaseResult;
import com.foxinmy.weixin4j.model.WeixinAccountV2;
import com.foxinmy.weixin4j.mp.api.GroupApi;
import com.foxinmy.weixin4j.mp.api.HelperApi;
import com.foxinmy.weixin4j.mp.api.MassApi;
import com.foxinmy.weixin4j.mp.api.MediaApi;
import com.foxinmy.weixin4j.mp.api.MenuApi;
import com.foxinmy.weixin4j.mp.api.NotifyApi;
import com.foxinmy.weixin4j.mp.api.PayApi;
import com.foxinmy.weixin4j.mp.api.QrApi;
import com.foxinmy.weixin4j.mp.api.TmplApi;
import com.foxinmy.weixin4j.mp.api.UserApi;
@ -27,6 +29,7 @@ import com.foxinmy.weixin4j.mp.model.UserToken;
import com.foxinmy.weixin4j.mp.msg.model.Article;
import com.foxinmy.weixin4j.mp.msg.model.BaseMsg;
import com.foxinmy.weixin4j.mp.msg.notify.BaseNotify;
import com.foxinmy.weixin4j.mp.payment.Order;
import com.foxinmy.weixin4j.mp.response.TemplateMessage;
import com.foxinmy.weixin4j.token.FileTokenApi;
import com.foxinmy.weixin4j.token.TokenApi;
@ -51,6 +54,7 @@ public class WeixinProxy {
private final QrApi qrApi;
private final TmplApi tmplApi;
private final HelperApi helperApi;
private final PayApi payApi;
/**
* 默认采用文件存放Token跟配置文件中的appi信息
@ -79,6 +83,7 @@ public class WeixinProxy {
this.qrApi = new QrApi(tokenApi);
this.tmplApi = new TmplApi(tokenApi);
this.helperApi = new HelperApi(tokenApi);
this.payApi = new PayApi(tokenApi);
}
/**
@ -704,4 +709,44 @@ public class WeixinProxy {
public String getShorturl(String url) throws WeixinException {
return helperApi.getShorturl(url);
}
/**
* 发货通知
*
* @param weixinConfig
* V2版本
* @param transid
* 交易单号
* @param orderNo
* 订单号
* @param status
* 成功|失败
* @param statusMsg
* status为失败时携带的信息
* @return
* @throws WeixinException
* @see com.foxinmy.weixin4j.mp.api.PayApi
*/
public BaseResult deliverNotify(WeixinAccountV2 weixinConfig,
String transid, String orderNo, boolean status, String statusMsg)
throws WeixinException {
return payApi.deliverNotify(weixinConfig, transid, orderNo, status,
statusMsg);
}
/**
* 订单查询
*
* @param weixinConfig
* V2版本
* @param orderNo
* 订单号
* @return
* @throws WeixinException
* @see com.foxinmy.weixin4j.mp.api.PayApi
*/
public Order orderQuery(WeixinAccountV2 weixinConfig, String orderNo)
throws WeixinException {
return payApi.orderQuery(weixinConfig, orderNo);
}
}

View File

@ -1,5 +1,6 @@
package com.foxinmy.weixin4j.mp.action;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.ImageMessage;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,5 +1,6 @@
package com.foxinmy.weixin4j.mp.action;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.LinkMessage;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,5 +1,6 @@
package com.foxinmy.weixin4j.mp.action;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.LocationMessage;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -7,6 +7,7 @@ import java.util.Map;
import org.dom4j.DocumentException;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.type.MessageType;
import com.foxinmy.weixin4j.util.ConfigUtil;
import com.foxinmy.weixin4j.util.MessageUtil;

View File

@ -1,5 +1,6 @@
package com.foxinmy.weixin4j.mp.action;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.mp.response.TextResponse;
import com.foxinmy.weixin4j.msg.TextMessage;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,5 +1,6 @@
package com.foxinmy.weixin4j.mp.action;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.VideoMessage;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,5 +1,6 @@
package com.foxinmy.weixin4j.mp.action;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.VoiceMessage;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.LocationEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.MassEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.menu.MenuLocationEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.menu.MenuPhotoEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.menu.MenuScanEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.menu.MenuEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.ScanEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.ScribeEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.TemplatesendjobfinishMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,7 +1,7 @@
package com.foxinmy.weixin4j.mp.action.event;
import com.foxinmy.weixin4j.mp.action.Action;
import com.foxinmy.weixin4j.mp.action.DebugAction;
import com.foxinmy.weixin4j.mp.mapping.Action;
import com.foxinmy.weixin4j.msg.event.ScribeEventMessage;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;

View File

@ -1,4 +1,4 @@
package com.foxinmy.weixin4j.mp.action;
package com.foxinmy.weixin4j.mp.mapping;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@ -1,19 +1,29 @@
package com.foxinmy.weixin4j.mp.server;
package com.foxinmy.weixin4j.mp.mapping;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import com.foxinmy.weixin4j.mp.action.Action;
import org.dom4j.DocumentException;
import com.foxinmy.weixin4j.mp.action.WeixinAction;
import com.foxinmy.weixin4j.type.EventType;
import com.foxinmy.weixin4j.type.MessageType;
import com.foxinmy.weixin4j.util.ClassUtil;
public class WeixinActionMapping {
/**
* 注解实现的Mapping
*
* @className AnnotationActionMapping
* @author jy
* @date 2014年10月28日
* @since JDK 1.7
* @see com.foxinmy.weixin4j.mp.mapping.Action
*/
public class AnnotationActionMapping extends AbstractActionMapping {
private final Map<String, WeixinAction> actionMap;
public WeixinActionMapping() {
public AnnotationActionMapping() {
actionMap = new HashMap<String, WeixinAction>();
Set<Class<?>> weixinActions = ClassUtil.getClasses(WeixinAction.class
.getPackage());
@ -42,7 +52,8 @@ public class WeixinActionMapping {
}
}
public WeixinAction getAction(String key) {
return actionMap.get(key.toLowerCase());
public WeixinAction getAction(String xmlMsg) throws DocumentException {
String key = getMappingKey(xmlMsg);
return actionMap.get(key);
}
}

View File

@ -46,7 +46,7 @@ public class BaseResponse implements Serializable {
static {
Class<?>[] classes = ClassUtil.getClasses(
TextResponse.class.getPackage()).toArray(new Class[0]);
BaseResponse.class.getPackage()).toArray(new Class[0]);
xmlStream.ignoreUnknownElements();
xmlStream.autodetectAnnotations(true);

View File

@ -25,16 +25,16 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.foxinmy.weixin4j.mp.action.WeixinAction;
import com.foxinmy.weixin4j.util.MessageUtil;
import com.foxinmy.weixin4j.mp.mapping.ActionMapping;
public class WeixinServerHandler extends ChannelInboundHandlerAdapter {
private final Logger log = LoggerFactory.getLogger(getClass());
private final WeixinActionMapping weixinActionMapping;
private final ActionMapping actionMapping;
public WeixinServerHandler(WeixinActionMapping weixinActionMapping) {
this.weixinActionMapping = weixinActionMapping;
public WeixinServerHandler(ActionMapping actionMapping) {
this.actionMapping = actionMapping;
}
@Override
@ -54,8 +54,7 @@ public class WeixinServerHandler extends ChannelInboundHandlerAdapter {
String xmlMsg = req.content().toString(StandardCharsets.UTF_8);
log.info("\n=================message in=================\n{}",
xmlMsg);
String key = MessageUtil.getMappingKey(xmlMsg);
WeixinAction action = weixinActionMapping.getAction(key);
WeixinAction action = actionMapping.getAction(xmlMsg);
if (action == null) {
ctx.write(new DefaultFullHttpResponse(HttpVersion.HTTP_1_1,
HttpResponseStatus.NOT_FOUND));

View File

@ -6,12 +6,15 @@ import io.netty.channel.socket.SocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import com.foxinmy.weixin4j.mp.mapping.ActionMapping;
import com.foxinmy.weixin4j.mp.mapping.AnnotationActionMapping;
public class WeixinServerInitializer extends ChannelInitializer<SocketChannel> {
private final WeixinActionMapping weixinActionMapping;
private final ActionMapping actionMapping;
public WeixinServerInitializer() {
this.weixinActionMapping = new WeixinActionMapping();
this.actionMapping = new AnnotationActionMapping();
}
@Override
@ -19,6 +22,6 @@ public class WeixinServerInitializer extends ChannelInitializer<SocketChannel> {
ChannelPipeline pipeline = channel.pipeline();
pipeline.addLast(new HttpServerCodec());
pipeline.addLast(new HttpObjectAggregator(65536));
pipeline.addLast(new WeixinServerHandler(weixinActionMapping));
pipeline.addLast(new WeixinServerHandler(actionMapping));
}
}

View File

@ -69,6 +69,10 @@ shorturl_uri={api_base_url}/shorturl?access_token=%s
updateremark_uri={api_base_url}/user/info/updateremark?access_token=%s
# \u6a21\u677f\u6d88\u606f
template_send_uri={api_base_url}/message/template/send?access_token=%s
# \u67e5\u8be2\u8ba2\u5355
orderquery_uri={api_base_url}/pay/orderquery?access_token=%s
# \u53d1\u8d27\u901a\u77e5
delivernotify_uri={api_base_url}/pay/delivernotify?access_token=%s
# token\u5b58\u653e\u8def\u5f84
token_path=/tmp/weixin/token