mirror of
				https://gitee.com/binary/weixin-java-tools.git
				synced 2025-10-31 18:46:10 +08:00 
			
		
		
		
	🆕 #2142 【企业微信】被动回复消息内容新增任务卡片格式
This commit is contained in:
		| @ -44,6 +44,7 @@ public class WxConsts { | ||||
|     public static final String DEVICE_STATUS = "device_status"; | ||||
|     public static final String HARDWARE = "hardware"; | ||||
|     public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service"; | ||||
|     public static final String UPDATE_TASKCARD = "update_taskcard"; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|  | ||||
| @ -28,6 +28,8 @@ public class XStreamInitializer { | ||||
|         private static final String SUFFIX_CDATA = "]]>"; | ||||
|         private static final String PREFIX_MEDIA_ID = "<MediaId>"; | ||||
|         private static final String SUFFIX_MEDIA_ID = "</MediaId>"; | ||||
|         private static final String PREFIX_REPLACE_NAME = "<ReplaceName>"; | ||||
|         private static final String SUFFIX_REPLACE_NAME = "</ReplaceName>"; | ||||
|  | ||||
|         @Override | ||||
|         protected void writeText(QuickWriter writer, String text) { | ||||
| @ -35,6 +37,8 @@ public class XStreamInitializer { | ||||
|             writer.write(text); | ||||
|           } else if (text.startsWith(PREFIX_MEDIA_ID) && text.endsWith(SUFFIX_MEDIA_ID)) { | ||||
|             writer.write(text); | ||||
|           } else if (text.startsWith(PREFIX_REPLACE_NAME) && text.endsWith(SUFFIX_REPLACE_NAME)){ | ||||
|             writer.write(text); | ||||
|           } else { | ||||
|             super.writeText(writer, text); | ||||
|           } | ||||
|  | ||||
| @ -0,0 +1,8 @@ | ||||
| package me.chanjar.weixin.common.util.xml; | ||||
|  | ||||
| public class XStreamReplaceNameConverter extends XStreamCDataConverter { | ||||
|   @Override | ||||
|   public String toString(Object obj) { | ||||
|     return "<ReplaceName>" + super.toString(obj) + "</ReplaceName>"; | ||||
|   } | ||||
| } | ||||
| @ -6,11 +6,7 @@ import com.thoughtworks.xstream.annotations.XStreamAlias; | ||||
| import com.thoughtworks.xstream.annotations.XStreamConverter; | ||||
| import lombok.Data; | ||||
| import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; | ||||
| import me.chanjar.weixin.cp.bean.outxmlbuilder.ImageBuilder; | ||||
| import me.chanjar.weixin.cp.bean.outxmlbuilder.NewsBuilder; | ||||
| import me.chanjar.weixin.cp.bean.outxmlbuilder.TextBuilder; | ||||
| import me.chanjar.weixin.cp.bean.outxmlbuilder.VideoBuilder; | ||||
| import me.chanjar.weixin.cp.bean.outxmlbuilder.VoiceBuilder; | ||||
| import me.chanjar.weixin.cp.bean.outxmlbuilder.*; | ||||
| import me.chanjar.weixin.cp.config.WxCpConfigStorage; | ||||
| import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil; | ||||
| import me.chanjar.weixin.cp.util.xml.XStreamTransformer; | ||||
| @ -76,6 +72,12 @@ public abstract class WxCpXmlOutMessage implements Serializable { | ||||
|     return new NewsBuilder(); | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * 获得任务卡片消息builder. | ||||
|    */ | ||||
|   public static TaskCardBuilder TASK_CARD() { | ||||
|     return new TaskCardBuilder(); | ||||
|   } | ||||
|   protected String toXml() { | ||||
|     return XStreamTransformer.toXml((Class) this.getClass(), this); | ||||
|   } | ||||
|  | ||||
| @ -0,0 +1,24 @@ | ||||
| package me.chanjar.weixin.cp.bean.message; | ||||
|  | ||||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | ||||
| import com.thoughtworks.xstream.annotations.XStreamConverter; | ||||
| import lombok.Data; | ||||
| import lombok.EqualsAndHashCode; | ||||
| import me.chanjar.weixin.common.api.WxConsts; | ||||
| import me.chanjar.weixin.common.util.xml.XStreamReplaceNameConverter; | ||||
|  | ||||
| @XStreamAlias("xml") | ||||
| @Data | ||||
| @EqualsAndHashCode(callSuper = false) | ||||
| public class WxCpXmlOutTaskCardMessage extends WxCpXmlOutMessage { | ||||
|   private static final long serialVersionUID = 7028014900972827324L; | ||||
|  | ||||
|   @XStreamAlias("TaskCard") | ||||
|   @XStreamConverter(value = XStreamReplaceNameConverter.class) | ||||
|   private String replaceName; | ||||
|  | ||||
|   public WxCpXmlOutTaskCardMessage() { | ||||
|     this.msgType = WxConsts.XmlMsgType.UPDATE_TASKCARD; | ||||
|   } | ||||
|  | ||||
| } | ||||
| @ -0,0 +1,27 @@ | ||||
| package me.chanjar.weixin.cp.bean.outxmlbuilder; | ||||
|  | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTaskCardMessage; | ||||
|  | ||||
| /** | ||||
|  * 任务卡片消息builder | ||||
|  * | ||||
|  * @author tao zhang | ||||
|  */ | ||||
| public final class TaskCardBuilder extends BaseBuilder<TaskCardBuilder, WxCpXmlOutTaskCardMessage> { | ||||
|  | ||||
|   private String replaceName; | ||||
|  | ||||
|   public TaskCardBuilder replaceName(String replaceName) { | ||||
|     this.replaceName = replaceName; | ||||
|     return this; | ||||
|   } | ||||
|  | ||||
|   @Override | ||||
|   public WxCpXmlOutTaskCardMessage build() { | ||||
|     WxCpXmlOutTaskCardMessage m = new WxCpXmlOutTaskCardMessage(); | ||||
|     setCommon(m); | ||||
|     m.setReplaceName(this.replaceName); | ||||
|     return m; | ||||
|   } | ||||
|  | ||||
| } | ||||
| @ -6,15 +6,8 @@ import java.util.Map; | ||||
|  | ||||
| import com.thoughtworks.xstream.XStream; | ||||
| import me.chanjar.weixin.common.util.xml.XStreamInitializer; | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpTpXmlMessage; | ||||
| import me.chanjar.weixin.cp.bean.message.*; | ||||
| import me.chanjar.weixin.cp.bean.WxCpTpXmlPackage; | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage; | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpXmlOutImageMessage; | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage; | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpXmlOutNewsMessage; | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTextMessage; | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpXmlOutVideoMessage; | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpXmlOutVoiceMessage; | ||||
|  | ||||
| public class XStreamTransformer { | ||||
|  | ||||
| @ -60,6 +53,7 @@ public class XStreamTransformer { | ||||
|     map.put(WxCpXmlOutImageMessage.class, configWxCpXmlOutImageMessage()); | ||||
|     map.put(WxCpXmlOutVideoMessage.class, configWxCpXmlOutVideoMessage()); | ||||
|     map.put(WxCpXmlOutVoiceMessage.class, configWxCpXmlOutVoiceMessage()); | ||||
|     map.put(WxCpXmlOutTaskCardMessage.class, configWxCpXmlOutTaskCardMessage()); | ||||
|     map.put(WxCpTpXmlPackage.class, configWxCpTpXmlPackage()); | ||||
|     map.put(WxCpTpXmlMessage.class, configWxCpTpXmlMessage()); | ||||
|     return map; | ||||
| @ -118,6 +112,14 @@ public class XStreamTransformer { | ||||
|     return xstream; | ||||
|   } | ||||
|  | ||||
|   private static XStream configWxCpXmlOutTaskCardMessage() { | ||||
|     XStream xstream = XStreamInitializer.getInstance(); | ||||
|  | ||||
|     xstream.processAnnotations(WxCpXmlOutMessage.class); | ||||
|     xstream.processAnnotations(WxCpXmlOutTaskCardMessage.class); | ||||
|     return xstream; | ||||
|   } | ||||
|  | ||||
|   private static XStream configWxCpTpXmlPackage() { | ||||
|     XStream xstream = XStreamInitializer.getInstance(); | ||||
|     xstream.processAnnotations(WxCpTpXmlPackage.class); | ||||
|  | ||||
| @ -0,0 +1,49 @@ | ||||
| package me.chanjar.weixin.cp.bean.message; | ||||
|  | ||||
| import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTaskCardMessage; | ||||
| import org.testng.Assert; | ||||
| import org.testng.annotations.Test; | ||||
|  | ||||
| @Test | ||||
| public class WxCpXmlOutTaskCardMessageTest { | ||||
|  | ||||
|   public void test() { | ||||
|     WxCpXmlOutTaskCardMessage m = new WxCpXmlOutTaskCardMessage(); | ||||
|     m.setReplaceName("已驳回"); | ||||
|     m.setCreateTime(1122L); | ||||
|     m.setFromUserName("from"); | ||||
|     m.setToUserName("to"); | ||||
|  | ||||
|     String expected = "<xml>" | ||||
|       + "<ToUserName><![CDATA[to]]></ToUserName>" | ||||
|       + "<FromUserName><![CDATA[from]]></FromUserName>" | ||||
|       + "<CreateTime>1122</CreateTime>" | ||||
|       + "<MsgType><![CDATA[update_taskcard]]></MsgType>" | ||||
|       + "<TaskCard><ReplaceName><![CDATA[已驳回]]></ReplaceName></TaskCard>" | ||||
|       + "</xml>"; | ||||
|     System.out.println(m.toXml()); | ||||
|     Assert.assertEquals(m.toXml().replaceAll("\\s", ""), expected.replaceAll("\\s", "")); | ||||
|   } | ||||
|  | ||||
|   public void testBuild() { | ||||
|     WxCpXmlOutTaskCardMessage m = WxCpXmlOutMessage.TASK_CARD().replaceName("已驳回").fromUser("from").toUser("to").build(); | ||||
|     String expected = "<xml>" | ||||
|       + "<ToUserName><![CDATA[to]]></ToUserName>" | ||||
|       + "<FromUserName><![CDATA[from]]></FromUserName>" | ||||
|       + "<CreateTime>1122</CreateTime>" | ||||
|       + "<MsgType><![CDATA[update_taskcard]]></MsgType>" | ||||
|       + "<TaskCard><ReplaceName><![CDATA[已驳回]]></ReplaceName></TaskCard>" | ||||
|       + "</xml>"; | ||||
|     System.out.println(m.toXml()); | ||||
|     Assert.assertEquals( | ||||
|       m | ||||
|         .toXml() | ||||
|         .replaceAll("\\s", "") | ||||
|         .replaceAll("<CreateTime>.*?</CreateTime>", ""), | ||||
|       expected | ||||
|         .replaceAll("\\s", "") | ||||
|         .replaceAll("<CreateTime>.*?</CreateTime>", "") | ||||
|     ); | ||||
|   } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 arthur0201
					arthur0201