Java微信二次开发(三)
各种类型消息的封装
第一步:找到com.wtz.message.response包,新建类Image.java
package com.wtz.message.response; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午8:38:37
* <p>version:1.0</p>
* <p>description:图片的实体类</p>
*/
public class Image {
//图片媒体ID
private String MediaId; public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
}
第二步:找到com.wtz.message.response包,新建类ImageMessage.java
package com.wtz.message.response; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午8:49:57
* <p>version:1.0</p>
* <p>description:图片消息类</p>
*/
public class ImageMessage extends BaseMessage {
//图片对象
private Image image; public Image getImage() {
return image;
} public void setImage(Image image) {
this.image = image;
}
}
第三步:找到com.wtz.message.response包,新建类Video.java
package com.wtz.message.response; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午9:02:14
* <p>version:1.0</p>
* <p>description:视频的实体类</p>
*/
public class Video {
//视频消息的媒体ID
private String MediaId;
//视频消息的标题
private String Title;
//视频消息的描述
private String Description; public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
}
第四步:找到com.wtz.message.response包,新建类VideoMessage.java
package com.wtz.message.response; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午9:10:14
* <p>version:1.0</p>
* <p>description:视频消息类</p>
*/
public class VideoMessage extends BaseMessage{
//视频对象
private Video video; public Video getVideo() {
return video;
} public void setVideo(Video video) {
this.video = video;
}
}
第五步:找到com.wtz.message.response包,新建类Voice.java
package com.wtz.message.response; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午9:21:47
* <p>version:1.0</p>
* <p>description:语音消息实体类</p>
*/
public class Voice {
//语音媒体编号
private String MediaId; public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
}
第六步:找到com.wtz.message.response包,新建类VoiceMessage.java
package com.wtz.message.response; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午9:44:58
* <p>version:1.0</p>
* <p>description:语音消息类</p>
*/
public class VoiceMessage extends BaseMessage{
//语音对象
private Voice voice; public Voice getVoice() {
return voice;
} public void setVoice(Voice voice) {
this.voice = voice;
}
}
第七步:找到com.wtz.message.response包,新建类Music.java
package com.wtz.message.response; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午9:48:11
* <p>version:1.0</p>
* <p>description:音乐消息实体类</p>
*/
public class Music {
//音乐标题
private String Title;
//音乐描述
private String Description;
//音乐链接
private String MusicUrl;
//高品质音乐链接
private String HQMusicUrl;
//缩略图的媒体ID
private String ThumbMediaId; public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public String getMusicUrl() {
return MusicUrl;
}
public void setMusicUrl(String musicUrl) {
MusicUrl = musicUrl;
}
public String getHQMusicUrl() {
return HQMusicUrl;
}
public void setHQMusicUrl(String hQMusicUrl) {
HQMusicUrl = hQMusicUrl;
}
public String getThumbMediaId() {
return ThumbMediaId;
}
public void setThumbMediaId(String thumbMediaId) {
ThumbMediaId = thumbMediaId;
}
}
第八步:找到com.wtz.message.response包,新建类MusicMessage.java
package com.wtz.message.response; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午9:58:21
* <p>version:1.0</p>
* <p>description:音乐消息类</p>
*/
public class MusicMessage extends BaseMessage{
//音乐对象
private Music music; public Music getMusic() {
return music;
} public void setMusic(Music music) {
this.music = music;
}
}
第九步:找到com.wtz.message.response包,新建类Article.java
package com.wtz.message.response; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午10:05:29
* <p>version:1.0</p>
* <p>description:图文实体类</p>
*/
public class Article {
//图文标题
private String Title;
//图文描述
private String Description;
//图片链接,支持JPG,PNG格式,较好的效果为大图
private String PicUrl;
//图文消息跳转链接
private String Url; public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public String getPicUrl() {
return PicUrl;
}
public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}
public String getUrl() {
return Url;
}
public void setUrl(String url) {
Url = url;
}
}
第十步:找到com.wtz.message.response包,新建类NewsMessage.java
package com.wtz.message.response; import java.util.List; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午10:16:22
* <p>version:1.0</p>
* <p>description:图文消息类</p>
*/
public class NewsMessage extends BaseMessage{
//图文条数
private int ArticleCount;
//多条图文消息信息,默认第一个item为大图
private List<Article> Articles; public int getArticleCount() {
return ArticleCount;
}
public void setArticleCount(int articleCount) {
ArticleCount = articleCount;
}
public List<Article> getArticles() {
return Articles;
}
public void setArticles(List<Article> articles) {
Articles = articles;
}
}
第十一步:新建包com.wtz.message.request,新建类BaseMessage.java
package com.wtz.message.request; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午10:53:23
* <p>version:1.0</p>
* <p>description:请求消息基类(普通用户->公众账号)</p>
* <p>站在服务器端的视角:接收信息</p>
*/
public class BaseMessage {
//开发者微信号
private String ToUserName;
//发送方账号(一个OpenId)
private String FromUserName;
//消息创建时间(整型)
private long CreateTime;
//消息类型
private String MsgType;
//消息ID,64位整型
private long MsgId; public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public long getMsgId() {
return MsgId;
}
public void setMsgId(long msgId) {
MsgId = msgId;
}
}
第十二步:找到com.wtz.message.request包,新建类TextMessage.java
package com.wtz.message.request; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午11:04:35
* <p>version:1.0</p>
* <p>description:文本消息</p>
*/
public class TextMessage extends BaseMessage{
//消息内容
private String Content; public String getContent() {
return Content;
} public void setContent(String content) {
Content = content;
}
}
第十三步:找到com.wtz.message.request包,新建类ImageMessage.java
package com.wtz.message.request; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午11:20:50
* <p>version:1.0</p>
* <p>description:图片消息</p>
*/
public class ImageMessage extends BaseMessage{
//图片链接
private String PicUrl;
//图片消息媒体ID
private String MediaId; public String getPicUrl() {
return PicUrl;
}
public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}
public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
}
第十四步:找到com.wtz.message.request包,新建类VoiceMessage.java
package com.wtz.message.request; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午11:27:40
* <p>version:1.0</p>
* <p>description:语音消息类</p>
*/
public class VoiceMessage extends BaseMessage {
//媒体ID
private String MediaId;
//语音格式
private String Format; public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
public String getFormat() {
return Format;
}
public void setFormat(String format) {
Format = format;
}
}
第十五步:找到com.wtz.message.request包,新建类VideoMessage.java
package com.wtz.message.request; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 下午3:28:03
* <p>version:1.0</p>
* <p>description:视频消息类</p>
*/
public class VideoMessage extends BaseMessage {
//视频消息媒体ID
private String MediaId;
//视频消息缩略图的媒体ID
private String ThumbMediaId; public String getMediaId() {
return MediaId;
}
public void setMediaId(String mediaId) {
MediaId = mediaId;
}
public String getThumbMediaId() {
return ThumbMediaId;
}
public void setThumbMediaId(String thumbMediaId) {
ThumbMediaId = thumbMediaId;
}
}
第十六步:找到com.wtz.message.request包,新建类LocatonMessage.java
package com.wtz.message.request; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 下午3:27:40
* <p>version:1.0</p>
* <p>description:地理位置消息类</p>
*/
public class LocationMessage extends BaseMessage {
//地理位置纬度
private String Location_X;
//地理位置经度
private String Location_Y;
//地图缩放大小
private String Scale;
//地理位置信息
private String Label; 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;
}
}
第十七步:找到com.wtz.message.request包,新建类LinkMessage.java
package com.wtz.message.request; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 下午1:58:04
* <p>version:1.0</p>
* <p>description:链接消息类</p>
*/
public class LinkMessage extends BaseMessage {
//消息标题
private String Title;
//消息描述
private String Description;
//消息链接
private String Url; public String getTitle() {
return Title;
}
public void setTitle(String title) {
Title = title;
}
public String getDescription() {
return Description;
}
public void setDescription(String description) {
Description = description;
}
public String getUrl() {
return Url;
}
public void setUrl(String url) {
Url = url;
}
}
第十八步:新建包com.wtz.message.event,新建类BaseEventMessage.java
package com.wtz.message.event; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 上午10:44:09
* <p>version:1.0</p>
* <p>description:基础事件消息类</p>
*/
public class BaseEventMessage {
//开发者微信号
private String ToUserName;
//发送方账号(一个OpenID)
private String FromUserName;
//消息创建时间(整型)
private long CreateTime;
//消息类型
private String MsgType;
//事件类型
private String Event; public String getToUserName() {
return ToUserName;
}
public void setToUserName(String toUserName) {
ToUserName = toUserName;
}
public String getFromUserName() {
return FromUserName;
}
public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
}
public long getCreateTime() {
return CreateTime;
}
public void setCreateTime(long createTime) {
CreateTime = createTime;
}
public String getMsgType() {
return MsgType;
}
public void setMsgType(String msgType) {
MsgType = msgType;
}
public String getEvent() {
return Event;
}
public void setEvent(String event) {
Event = event;
}
}
第十九步:找到包com.wtz.message.event,新建类QRCodeEventMessage.java
package com.wtz.message.event; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 下午3:24:30
* <p>version:1.0</p>
* <p>description:扫描带参数二维码事件类</p>
*/
public class QRCodeEventMessage extends BaseEventMessage{
//事件Key值
private String EventKey;
//用于换取二维码图片
private String Ticket; public String getEventKey() {
return EventKey;
}
public void setEventKey(String eventKey) {
EventKey = eventKey;
}
public String getTicket() {
return Ticket;
}
public void setTicket(String ticket) {
Ticket = ticket;
}
}
第二十步:找到包com.wtz.message.event,新建类SubscribeEventMessage.java
package com.wtz.message.event; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 下午3:27:11
* <p>version:1.0</p>
* <p>description:关注/取消关注事件类</p>
*/
public class SubscribeEventMessage extends BaseEventMessage{ }
第二十一步:找到包com.wtz.message.event,新建类MenuEventMessage.java
package com.wtz.message.event; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 下午3:32:42
* <p>version:1.0</p>
* <p>description:自定义菜单事件类</p>
*/
public class MenuEventMessage extends BaseEventMessage{
//事件Key值,与自定义菜单接口中Key值对应
private String EventKey; public String getEventKey() {
return EventKey;
} public void setEventKey(String eventKey) {
EventKey = eventKey;
}
}
第二十二步:找到包com.wtz.message.event,新建类LocationEventMessage.java
package com.wtz.message.event; /**
* @author wangtianze QQ:864620012
* @date 2017年4月20日 下午3:37:50
* <p>version:1.0</p>
* <p>description:上报地理位置事件类</p>
*/
public class LocationEventMessage extends BaseEventMessage{
//地理位置纬度
private String Latitude;
//地理位置经度
private String Longitude;
//地理位置精度
private String Precision; public String getLatitude() {
return Latitude;
}
public void setLatitude(String latitude) {
Latitude = latitude;
}
public String getLongitude() {
return Longitude;
}
public void setLongitude(String longitude) {
Longitude = longitude;
}
public String getPrecision() {
return Precision;
}
public void setPrecision(String precision) {
Precision = precision;
}
}
第二十三步:找到包com.wtz.util下的MessageUtil.java类,修改这个类添加请求和回复的各种消息类型,事件类型,添加将各种类型消息转换成XML格式的方法
package com.wtz.util; import java.io.IOException;
import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.wtz.message.response.ImageMessage;
import com.wtz.message.response.MusicMessage;
import com.wtz.message.response.NewsMessage;
import com.wtz.message.response.TextMessage;
import com.wtz.message.response.VideoMessage;
import com.wtz.message.response.VoiceMessage; /**
* @author wangtianze QQ:864620012
* @date 2017年4月19日 下午3:29:58
* <p>version:1.0</p>
* <p>description:消息处理工具类</p>
*/
public class MessageUtil {
//请求消息类型:文本
public static final String REQ_MESSAGE_TYPE_TEXT = "text";
//请求消息类型:图片
public static final String REQ_MESSAGE_TYPE_IMAGE = "image";
//请求消息类型:语音
public static final String REQ_MESSAGE_TYPE_VOICE = "voice";
//请求消息类型:视频
public static final String REQ_MESSAGE_TYPE_VIDEO = "video";
//请求消息类型:地理位置
public static final String REQ_MESSAGE_TYPE_LOCATION = "location";
//请求消息类型:链接
public static final String REQ_MESSAGE_TYPE_LINK = "link";
//请求消息类型:事件推送
public static final String REQ_MESSAGE_TYPE_EVENT = "event"; //--------------------------------------------------------------- //事件类型:subscribe(订阅)
public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";
//事件类型:unsubscribe(取消订阅)
public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";
//事件类型:scan(用户已关注时的扫描带参数的二维码)
public static final String EVENT_TYPE_SCAN = "scan";
//事件类型:LOCATION(上报地理位置)
public static final String EVENT_TYPE_LOCATION = "LOCATION";
//事件类型:CLICK(自定义菜单)
public static final String EVENT_TYPE_CLICK = "CLICK"; //--------------------------------------------------------------- //响应消息类型:文本
public static final String RESP_MESSAGE_TYPE_TEXT = "text";
//响应详细类型:图片
public static final String RESP_MESSAGE_TYPE_IMAGE = "image";
//响应消息类型:语音
public static final String RESP_MESSAGE_TYPE_VOICE = "voice";
//响应消息类型:视频
public static final String RESP_MESSAGE_TYPE_VIDEO = "video";
//响应详细类型:音乐
public static final String RESP_MESSAGE_TYPE_MUSIC = "music";
//响应消息类型:图文
public static final String RESP_MESSAGE_TYPE_NEWS = "news"; //--------------------------------------------------------------- //从流中解析出每个节点的内容
public static Map<String,String> parseXml(HttpServletRequest request) throws IOException{
Map<String,String> map = new HashMap<String,String>(); //从输入流中获取流对象
InputStream in = request.getInputStream(); //构建SAX阅读器对象
SAXReader reader = new SAXReader();
try {
//从流中获得文档对象
Document doc = reader.read(in); //获得根节点
Element root = doc.getRootElement(); //获取根节点下的所有子节点
List<Element> children = root.elements(); for(Element e:children){
//遍历每一个节点,并按照节点名--节点值放入map中
map.put(e.getName(), e.getText());
System.out.println("用户发送的消息XML解析为:" + e.getName() + e.getText());
} //关闭流
in.close();
in = null;
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return map;
} /**
* 用于扩展节点数据按照<ToUserName><![CDATA[toUser]]></ToUserName>,中间加了CDATA段
*/
private static XStream xstream = new XStream(new XppDriver(){
public HierarchicalStreamWriter createWriter(Writer out){
return new PrettyPrintWriter(out){
boolean cdata = true;
public void startNode(String name,Class clazz){
super.startNode(name,clazz);
} protected void writeText(QuickWriter writer,String text){
if(cdata){
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
}else{
writer.write(text);
}
}
};
}
}); /**
* 将文本消息对象转换成XML格式
* params:textMessage 文本消息对象
* return:xml
*/
public static String messageToXml(TextMessage textMessage){
xstream.alias("xml",textMessage.getClass());
return xstream.toXML(textMessage);
} /**
* 将图片消息对象转换成XML格式
* params:imageMessage
* return:xml
*/
public static String messageToXml(ImageMessage imageMessage){
xstream.alias("xml", imageMessage.getClass());
return xstream.toXML(imageMessage);
} /**
* 将语音消息对象转换成XML格式
* params:voiceMessage
* return:xml
*/
public static String messageToXml(VoiceMessage voiceMessage){
xstream.alias("xml",voiceMessage.getClass());
return xstream.toXML(voiceMessage);
} /**
* 将视频消息对象转换成XML格式
* params:videoMessage
* return:xml
*/
public static String messageToXml(VideoMessage videoMessage){
xstream.alias("xml",videoMessage.getClass());
return xstream.toXML(videoMessage);
} /**
* 将音乐消息对象转换成XML格式
* params:musicMessage
* return:xml
*/
public static String messageToXml(MusicMessage musicMessage){
xstream.alias("xml",musicMessage.getClass());
return xstream.toXML(musicMessage);
} /**
* 将图文消息对象转换成XML格式
* params:newsMessage
* return:xml
*/
public static String messageToXml(NewsMessage newsMessage){
xstream.alias("xml",newsMessage.getClass());
return xstream.toXML(newsMessage);
}
}
第二十四步:找到包com.wtz.util下的ProcessService.java类,修改dealRequest方法响应各种类型的消息
package com.wtz.util; import java.io.IOException;
import java.util.Date;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.wtz.message.response.TextMessage; /**
* @author wangtianze QQ:864620012
* @date 2017年4月19日 下午8:04:14
* <p>version:1.0</p>
* <p>description:核心服务类</p>
*/
public class ProcessService {
public static String dealRequest(HttpServletRequest request){
//XML格式的消息数据
String respXml = "";
//默认返回的文本消息内容
String respContent = "未知的消息类型";
//调用parseXml方法解析请求消息
Map<String, String> requestMap;
try {
requestMap = MessageUtil.parseXml(request);
//发送方账号
String fromUserName = requestMap.get("FromUserName");
//开发者微信号
String toUserName = requestMap.get("ToUserName");
//消息类型
String MsgType = requestMap.get("MsgType"); //回复文本消息
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(fromUserName);
textMessage.setFromUserName(toUserName);
textMessage.setCreateTime(new Date().getTime());
textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)){
respContent = "您发送的是文本消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)){
respContent = "您发送的是图片消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)){
respContent = "您发送的是语音消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VIDEO)){
respContent = "您发送的是视频消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)){
respContent = "您发送的是地理位置消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)){
respContent = "您发送的是链接消息";
}else if(MsgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)){
//事件类型
String eventType = requestMap.get("Event");
if(eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)){
respContent = "感谢您的关注";
}else if(eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)){
//TODO 取消订阅后用户不会再收到公众号发送的消息,因此不需要回复
}else if(eventType.equals(MessageUtil.EVENT_TYPE_SCAN)){
//TODO 处理扫描带参数二维码事件
}else if(eventType.equals(MessageUtil.EVENT_TYPE_LOCATION)){
//TODO 处理上报地理位置事件
}else if(eventType.equals(MessageUtil.EVENT_TYPE_CLICK)){
//TODO 处理菜单点击事件
}
}
//设置文本消息的内容
textMessage.setContent(respContent);
//将文本消息对象转换成xml
respXml = MessageUtil.messageToXml(textMessage);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return respXml;
}
}
各种类型消息封装完成。
Java微信二次开发(三)的更多相关文章
- Java微信二次开发(一)
准备用Java做一个微信二次开发项目,把流程写在这里吧. 第一天,做微信请求验证 需要导入库:servlet-api.jar 第一步:新建包com.wtz.service,新建类LoginServle ...
- Java微信二次开发(五)
消息加密 需要到入库:commons-io-2.4.jar,commons-codec-1.9.jar(在官网的Java微信加密demo下) 第一步:访问https://mp.weixin.qq.co ...
- Java微信二次开发(十)
生成带参数的二维码以及长链接转短链接 第一步:找到包com.wtz.vo,新建类WeixinQRCode.java package com.wtz.vo; /** * @author wangtian ...
- Java微信二次开发(七)
自定义菜单 第一步:新建包com.wtz.menu,新建类Button.java package com.wtz.menu; /** * @author wangtianze QQ:864620012 ...
- Java微信公众平台开发(三)--接收消息的分类及实体的创建
转自:http://www.cuiyongzhi.com/post/41.html 前面一篇有说道应用服务器和腾讯服务器是通过消息进行通讯的,并简单介绍了微信端post的消息类型,这里我们将建立消息实 ...
- Java微信二次开发(八)
高级接口,先做了两个(获取用户信息和获取关注者列表) 第一步:找到包com.wtz.vo,新建类UserInfo.java package com.wtz.vo; /** * @author wang ...
- Java微信二次开发(六)
Token定时获取 需要导入库:添加log4j(slf4j-api-1.5.10.jar,slf4j-log4j12-1.5.10.jar,log4j-1.2.15.jar,并且在src下添加log4 ...
- Java微信二次开发(二)
第二天,做微信文本消息接口请求与发送 需要导入库:dom4j-1.6.1.jar,xstream-1.3.1.jar 第一步:新建包com.wtz.message.response,新建类BaseMe ...
- Java微信二次开发(九)
多媒体文件上传与下载 第一步:找到包com.wtz.vo,新建类WeixinMedia.java package com.wtz.vo; /** * @author wangtianze QQ:864 ...
随机推荐
- MATLAB中的FOR循环问题
做量化操作的时候经常需要使用到matlab编写策略或者计算多因子,for循环非常慢,自己找了一些matlab中for循环的优化方法,for的部分每处理一个大矩阵都要花费大量的时间,这是不可避免需要遇到 ...
- docker容器启动设置固定IP
docker安装以后的网络类型 [root@insure updev]# docker network ls NETWORK ID NAME DRIVER SCOPE 14da40175b01 bri ...
- AI 最小二乘法
最小二乘法 参考链接: https://zhuanlan.zhihu.com/p/27204466
- node.js 基础二 开启服务器监听
1.server.js 2.监听 一 server.js 二 监听 运行server.js后,浏览器打开:http://localhost:8888/ //====================== ...
- Android 利用属ObjectAnimator,AnimatorSet性动画绘制一个弹球,加速下落,到底部时挤压,然后减速上弹
属性动画主要的几个类介绍: 1.ValueAnimator:这个类提供了一个简单的计时引擎运行动画动画计算值和设置目标对象.注意:使用该类时一般都是用:ObjectAnimator,而基于Object ...
- 8-51单片机ESP8266学习-AT指令(单片机采集温湿度数据通过8266发送给C#TCP客户端显示)
http://www.cnblogs.com/yangfengwu/p/8785516.html 先写单片机端的程序 先把源码和资料链接放到这里 链接: https://pan.baidu.com/s ...
- maven 基础
maven安装链接 maven基础命令: 编译命令:mvn compile 测试命令:mvn test 清空命令:mvn clean 打包命令:mvn package 打包命令:mvn install ...
- Multiple “order by” in LINQ(转载)
问: I have two tables, movies and categories, and I get an ordered list by categoryID first and then ...
- 字符串中去除多余的空格保留一个(C#)
在C#的字符串,其中有许多空格,现要求是把多余的空格去除保留一个.原理是使用Split()方法进行分割,分割有一个选项是RemoveEmptyEntries,然后再把分割后的字符串Join起来. st ...
- Caffe源码中math_functions文件分析
Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下math_functions文件. 1. include文件: ...