ActionMapping->abstract
This commit is contained in:
parent
0427716348
commit
2d5d65ff0b
@ -17,6 +17,11 @@ weixin4j
|
||||
|
||||
2).weixin4j-mp:用netty构建http服务器并支持消息分发
|
||||
|
||||
* 2014-10-28
|
||||
|
||||
1).weixin4j-mp:调整ActionMapping抽象化
|
||||
|
||||
|
||||
接下来
|
||||
------
|
||||
公众号支付模块引入
|
||||
|
||||
@ -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消息转换为消息对象
|
||||
*
|
||||
|
||||
@ -57,3 +57,7 @@ tencent weixin platform java sdk 微信公众平台开发工具包 http://mp.wei
|
||||
* 2014-10-27
|
||||
|
||||
1).用netty构建http服务器并支持消息分发
|
||||
|
||||
* 2014-10-28
|
||||
|
||||
1).调整ActionMapping抽象化
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user