| @@ -78,9 +78,15 @@ public class WxConsts { | |||||
| public static final String EVT_UNSUBSCRIBE = "unsubscribe"; | public static final String EVT_UNSUBSCRIBE = "unsubscribe"; | ||||
| public static final String EVT_SCAN = "SCAN"; | public static final String EVT_SCAN = "SCAN"; | ||||
| public static final String EVT_LOCATION = "LOCATION"; | public static final String EVT_LOCATION = "LOCATION"; | ||||
| public static final String EVT_CLICK = "LOCATION"; | |||||
| public static final String EVT_CLICK = "CLICK"; | |||||
| public static final String EVT_VIEW = "VIEW"; | public static final String EVT_VIEW = "VIEW"; | ||||
| public static final String EVT_MASS_SEND_JOB_FINISH = "MASSSENDJOBFINISH"; | public static final String EVT_MASS_SEND_JOB_FINISH = "MASSSENDJOBFINISH"; | ||||
| public static final String EVT_SCANCODE_PUSH = "scancode_push"; | |||||
| public static final String EVT_SCANCODE_WAITMSG = "scancode_waitmsg"; | |||||
| public static final String EVT_PIC_SYSPHOTO = "pic_sysphoto"; | |||||
| public static final String EVT_PIC_PHOTO_OR_ALBUM = "pic_photo_or_album"; | |||||
| public static final String EVT_PIC_WEIXIN = "pic_weixin"; | |||||
| public static final String EVT_LOCATION_SELECT = "location_select"; | |||||
| /////////////////////// | /////////////////////// | ||||
| // 上传多媒体文件的类型 | // 上传多媒体文件的类型 | ||||
| @@ -98,4 +104,25 @@ public class WxConsts { | |||||
| public static final String FILE_ARM = "arm"; | public static final String FILE_ARM = "arm"; | ||||
| public static final String FILE_MP4 = "mp4"; | public static final String FILE_MP4 = "mp4"; | ||||
| /////////////////////// | |||||
| // 自定义菜单的按钮类型 | |||||
| /////////////////////// | |||||
| /** 点击推事件 */ | |||||
| public static final String BUTTON_CLICK = "click"; | |||||
| /** 跳转URL */ | |||||
| public static final String BUTTON_VIEW = "view"; | |||||
| /** 扫码推事件 */ | |||||
| public static final String BUTTON_SCANCODE_PUSH = "scancode_push"; | |||||
| /** 扫码推事件且弹出“消息接收中”提示框 */ | |||||
| public static final String BUTTON_SCANCODE_WAITMSG = "scancode_waitmsg"; | |||||
| /** 弹出系统拍照发图 */ | |||||
| public static final String PIC_SYSPHOTO = "pic_sysphoto"; | |||||
| /** 弹出拍照或者相册发图 */ | |||||
| public static final String PIC_PHOTO_OR_ALBUM = "pic_photo_or_album"; | |||||
| /** 弹出微信相册发图器 */ | |||||
| public static final String PIC_WEIXIN = "pic_weixin"; | |||||
| /** 弹出地理位置选择器 */ | |||||
| public static final String LOCATION_SELECT = "location_select"; | |||||
| } | } | ||||
| @@ -8,13 +8,12 @@ import me.chanjar.weixin.util.xml.XmlTransformer; | |||||
| import org.apache.commons.io.IOUtils; | import org.apache.commons.io.IOUtils; | ||||
| import javax.xml.bind.JAXBException; | import javax.xml.bind.JAXBException; | ||||
| import javax.xml.bind.annotation.XmlAccessType; | |||||
| import javax.xml.bind.annotation.XmlAccessorType; | |||||
| import javax.xml.bind.annotation.XmlElement; | |||||
| import javax.xml.bind.annotation.XmlRootElement; | |||||
| import javax.xml.bind.annotation.*; | |||||
| import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; | import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; | ||||
| import java.io.IOException; | import java.io.IOException; | ||||
| import java.io.InputStream; | import java.io.InputStream; | ||||
| import java.util.ArrayList; | |||||
| import java.util.List; | |||||
| /** | /** | ||||
| * <pre> | * <pre> | ||||
| @@ -149,6 +148,15 @@ public class WxXmlMessage { | |||||
| */ | */ | ||||
| private Integer ErrorCount; | private Integer ErrorCount; | ||||
| @XmlElement(name = "ScanCodeInfo") | |||||
| private ScanCodeInfo ScanCodeInfo = new ScanCodeInfo(); | |||||
| @XmlElement(name = "SendPicsInfo") | |||||
| private SendPicsInfo SendPicsInfo = new SendPicsInfo(); | |||||
| @XmlElement(name = "SendLocationInfo") | |||||
| private SendLocationInfo SendLocationInfo = new SendLocationInfo(); | |||||
| public String getToUserName() { | public String getToUserName() { | ||||
| return ToUserName; | return ToUserName; | ||||
| } | } | ||||
| @@ -454,4 +462,173 @@ public class WxXmlMessage { | |||||
| ErrorCount = errorCount; | ErrorCount = errorCount; | ||||
| } | } | ||||
| public WxXmlMessage.ScanCodeInfo getScanCodeInfo() { | |||||
| return ScanCodeInfo; | |||||
| } | |||||
| public void setScanCodeInfo(WxXmlMessage.ScanCodeInfo scanCodeInfo) { | |||||
| ScanCodeInfo = scanCodeInfo; | |||||
| } | |||||
| public WxXmlMessage.SendPicsInfo getSendPicsInfo() { | |||||
| return SendPicsInfo; | |||||
| } | |||||
| public void setSendPicsInfo(WxXmlMessage.SendPicsInfo sendPicsInfo) { | |||||
| SendPicsInfo = sendPicsInfo; | |||||
| } | |||||
| public WxXmlMessage.SendLocationInfo getSendLocationInfo() { | |||||
| return SendLocationInfo; | |||||
| } | |||||
| public void setSendLocationInfo(WxXmlMessage.SendLocationInfo sendLocationInfo) { | |||||
| SendLocationInfo = sendLocationInfo; | |||||
| } | |||||
| @XmlRootElement(name = "ScanCodeInfo") | |||||
| @XmlAccessorType(XmlAccessType.FIELD) | |||||
| public static class ScanCodeInfo { | |||||
| @XmlElement(name = "ScanType") | |||||
| @XmlJavaTypeAdapter(AdapterCDATA.class) | |||||
| private String ScanType; | |||||
| @XmlElement(name = "ScanResult") | |||||
| @XmlJavaTypeAdapter(AdapterCDATA.class) | |||||
| private String ScanResult; | |||||
| /** | |||||
| * 扫描类型,一般是qrcode | |||||
| * @return | |||||
| */ | |||||
| public String getScanType() { | |||||
| return ScanType; | |||||
| } | |||||
| public void setScanType(String scanType) { | |||||
| ScanType = scanType; | |||||
| } | |||||
| /** | |||||
| * 扫描结果,即二维码对应的字符串信息 | |||||
| * @return | |||||
| */ | |||||
| public String getScanResult() { | |||||
| return ScanResult; | |||||
| } | |||||
| public void setScanResult(String scanResult) { | |||||
| ScanResult = scanResult; | |||||
| } | |||||
| } | |||||
| @XmlRootElement(name = "SendPicsInfo") | |||||
| @XmlAccessorType(XmlAccessType.FIELD) | |||||
| public static class SendPicsInfo { | |||||
| private Long Count; | |||||
| @XmlElementWrapper(name="PicList") | |||||
| @XmlElement(name = "item") | |||||
| protected final List<Item> PicList = new ArrayList<Item>(); | |||||
| public Long getCount() { | |||||
| return Count; | |||||
| } | |||||
| public void setCount(Long count) { | |||||
| Count = count; | |||||
| } | |||||
| public List<Item> getPicList() { | |||||
| return PicList; | |||||
| } | |||||
| @XmlRootElement(name = "item") | |||||
| @XmlAccessorType(XmlAccessType.FIELD) | |||||
| @XmlType(name = "me.chanjar.weixin.bean.WxXmlMessage.SendPicsInfo.Item") | |||||
| public static class Item { | |||||
| @XmlElement(name = "PicMd5Sum") | |||||
| @XmlJavaTypeAdapter(AdapterCDATA.class) | |||||
| private String PicMd5Sum; | |||||
| public String getPicMd5Sum() { | |||||
| return PicMd5Sum; | |||||
| } | |||||
| public void setPicMd5Sum(String picMd5Sum) { | |||||
| PicMd5Sum = picMd5Sum; | |||||
| } | |||||
| } | |||||
| } | |||||
| @XmlRootElement(name = "SendLocationInfo") | |||||
| @XmlAccessorType(XmlAccessType.FIELD) | |||||
| public static class SendLocationInfo { | |||||
| @XmlElement(name = "Location_X") | |||||
| @XmlJavaTypeAdapter(AdapterCDATA.class) | |||||
| private String Location_X; | |||||
| @XmlElement(name = "Location_Y") | |||||
| @XmlJavaTypeAdapter(AdapterCDATA.class) | |||||
| private String Location_Y; | |||||
| @XmlElement(name = "Scale") | |||||
| @XmlJavaTypeAdapter(AdapterCDATA.class) | |||||
| private String Scale; | |||||
| @XmlElement(name = "Label") | |||||
| @XmlJavaTypeAdapter(AdapterCDATA.class) | |||||
| private String Label; | |||||
| @XmlElement(name = "Poiname") | |||||
| @XmlJavaTypeAdapter(AdapterCDATA.class) | |||||
| private String Poiname; | |||||
| public String getLocation_X() { | |||||
| return Location_X; | |||||
| } | |||||
| public void setLocation_X(String location_X) { | |||||
| Location_X = location_X; | |||||
| } | |||||
| public String getLocation_Y() { | |||||
| return Location_Y; | |||||
| } | |||||
| public void setLocation_Y(String location_Y) { | |||||
| Location_Y = location_Y; | |||||
| } | |||||
| public String getScale() { | |||||
| return Scale; | |||||
| } | |||||
| public void setScale(String scale) { | |||||
| Scale = scale; | |||||
| } | |||||
| public String getLabel() { | |||||
| return Label; | |||||
| } | |||||
| public void setLabel(String label) { | |||||
| Label = label; | |||||
| } | |||||
| public String getPoiname() { | |||||
| return Poiname; | |||||
| } | |||||
| public void setPoiname(String poiname) { | |||||
| Poiname = poiname; | |||||
| } | |||||
| } | |||||
| } | } | ||||
| @@ -44,12 +44,12 @@ public class WxMenuAPITest { | |||||
| public Object[][] getMenu() throws JAXBException { | public Object[][] getMenu() throws JAXBException { | ||||
| WxMenu menu = new WxMenu(); | WxMenu menu = new WxMenu(); | ||||
| WxMenuButton button1 = new WxMenuButton(); | WxMenuButton button1 = new WxMenuButton(); | ||||
| button1.setType("click"); | |||||
| button1.setType(WxConsts.BUTTON_CLICK); | |||||
| button1.setName("今日歌曲"); | button1.setName("今日歌曲"); | ||||
| button1.setKey("V1001_TODAY_MUSIC"); | button1.setKey("V1001_TODAY_MUSIC"); | ||||
| WxMenuButton button2 = new WxMenuButton(); | WxMenuButton button2 = new WxMenuButton(); | ||||
| button2.setType("click"); | |||||
| button2.setType(WxConsts.BUTTON_CLICK); | |||||
| button2.setName("歌手简介"); | button2.setName("歌手简介"); | ||||
| button2.setKey("V1001_TODAY_SINGER"); | button2.setKey("V1001_TODAY_SINGER"); | ||||
| @@ -61,17 +61,17 @@ public class WxMenuAPITest { | |||||
| menu.getButton().add(button3); | menu.getButton().add(button3); | ||||
| WxMenuButton button31 = new WxMenuButton(); | WxMenuButton button31 = new WxMenuButton(); | ||||
| button31.setType("view"); | |||||
| button31.setType(WxConsts.BUTTON_VIEW); | |||||
| button31.setName("搜索"); | button31.setName("搜索"); | ||||
| button31.setUrl("http://www.soso.com/"); | button31.setUrl("http://www.soso.com/"); | ||||
| WxMenuButton button32 = new WxMenuButton(); | WxMenuButton button32 = new WxMenuButton(); | ||||
| button32.setType("view"); | |||||
| button32.setType(WxConsts.BUTTON_VIEW); | |||||
| button32.setName("视频"); | button32.setName("视频"); | ||||
| button32.setUrl("http://v.qq.com/"); | button32.setUrl("http://v.qq.com/"); | ||||
| WxMenuButton button33 = new WxMenuButton(); | WxMenuButton button33 = new WxMenuButton(); | ||||
| button33.setType("click"); | |||||
| button33.setType(WxConsts.BUTTON_CLICK); | |||||
| button33.setName("赞一下我们"); | button33.setName("赞一下我们"); | ||||
| button33.setKey("V1001_GOOD"); | button33.setKey("V1001_GOOD"); | ||||
| @@ -33,6 +33,25 @@ public class WxXmlMessageTest { | |||||
| + "<Latitude>23.137466</Latitude>" | + "<Latitude>23.137466</Latitude>" | ||||
| + "<Longitude>113.352425</Longitude>" | + "<Longitude>113.352425</Longitude>" | ||||
| + "<Precision>119.385040</Precision>" | + "<Precision>119.385040</Precision>" | ||||
| + "<ScanCodeInfo>" | |||||
| + " <ScanType><![CDATA[qrcode]]></ScanType>" | |||||
| + " <ScanResult><![CDATA[1]]></ScanResult>" | |||||
| + "</ScanCodeInfo>" | |||||
| + "<SendPicsInfo>" | |||||
| + " <Count>1</Count>\n" | |||||
| + " <PicList>" | |||||
| + " <item>" | |||||
| + " <PicMd5Sum><![CDATA[1b5f7c23b5bf75682a53e7b6d163e185]]></PicMd5Sum>" | |||||
| + " </item>" | |||||
| + " </PicList>" | |||||
| + "</SendPicsInfo>" | |||||
| + "<SendLocationInfo>" | |||||
| + " <Location_X><![CDATA[23]]></Location_X>\n" | |||||
| + " <Location_Y><![CDATA[113]]></Location_Y>\n" | |||||
| + " <Scale><![CDATA[15]]></Scale>\n" | |||||
| + " <Label><![CDATA[ 广州市海珠区客村艺苑路 106号]]></Label>\n" | |||||
| + " <Poiname><![CDATA[wo de poi]]></Poiname>\n" | |||||
| + "</SendLocationInfo>" | |||||
| + "</xml>"; | + "</xml>"; | ||||
| WxXmlMessage wxMessage = WxXmlMessage.fromXml(xml); | WxXmlMessage wxMessage = WxXmlMessage.fromXml(xml); | ||||
| Assert.assertEquals(wxMessage.getToUserName(), "toUser"); | Assert.assertEquals(wxMessage.getToUserName(), "toUser"); | ||||
| @@ -58,6 +77,15 @@ public class WxXmlMessageTest { | |||||
| Assert.assertEquals(wxMessage.getLatitude(), new Double(23.137466)); | Assert.assertEquals(wxMessage.getLatitude(), new Double(23.137466)); | ||||
| Assert.assertEquals(wxMessage.getLongitude(), new Double(113.352425)); | Assert.assertEquals(wxMessage.getLongitude(), new Double(113.352425)); | ||||
| Assert.assertEquals(wxMessage.getPrecision(), new Double(119.385040)); | Assert.assertEquals(wxMessage.getPrecision(), new Double(119.385040)); | ||||
| Assert.assertEquals(wxMessage.getScanCodeInfo().getScanType(), "qrcode"); | |||||
| Assert.assertEquals(wxMessage.getScanCodeInfo().getScanResult(), "1"); | |||||
| Assert.assertEquals(wxMessage.getSendPicsInfo().getCount(), new Long(1l)); | |||||
| Assert.assertEquals(wxMessage.getSendPicsInfo().getPicList().get(0).getPicMd5Sum(), "1b5f7c23b5bf75682a53e7b6d163e185"); | |||||
| Assert.assertEquals(wxMessage.getSendLocationInfo().getLocation_X(), "23"); | |||||
| Assert.assertEquals(wxMessage.getSendLocationInfo().getLocation_Y(), "113"); | |||||
| Assert.assertEquals(wxMessage.getSendLocationInfo().getScale(), "15"); | |||||
| Assert.assertEquals(wxMessage.getSendLocationInfo().getLabel(), " 广州市海珠区客村艺苑路 106号"); | |||||
| Assert.assertEquals(wxMessage.getSendLocationInfo().getPoiname(), "wo de poi"); | |||||
| } | } | ||||
| } | } | ||||