java开发微信公众号,公众号与java后台获取连接,自动回复,关注获取用户信息,取消关注删除用户信息

controller:

@RequestMapping(method = { RequestMethod.GET })
public void gget(HttpServletRequest request, HttpServletResponse response) throws IOException {
// // 将请求、响应的编码均设置为UTF-8(防止中文乱码)
// request.setCharacterEncoding("UTF-8");
// //微信服务器POST消息时用的是UTF-8编码,在接收时也要用同样的编码,否则中文会乱码;
// response.setCharacterEncoding("UTF-8");
// //在响应消息(回复消息给用户)时,也将编码方式设置为UTF-8,原理同上;boolean isGet =
// request.getMethod().toLowerCase().equals("get");
PrintWriter print = response.getWriter();
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if (signature != null && CheckoutUtil.checkSignature(signature, timestamp, nonce)) {//下方工具类验证
try {
print = response.getWriter();
print.write(echostr);
print.flush();
} catch (IOException e) {
e.printStackTrace();
}
}


}


@RequestMapping(method = { RequestMethod.POST })
public void ppost(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 当你用微信给平台发送信息时就会到这里
// 回复音乐和图文消息,我都写死了,自己可以根据自己的需要加相应的处理
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
String wxMsgXml = IOUtils.toString(request.getInputStream(), "utf-8");
RequestTextMessage textMsg = new RequestTextMessage();
String event = null;
StringBuffer replyMsg = new StringBuffer();
String returnXml = null;
//UserPro p = new UserPro();
try {
textMsg = ReplyMessage.getRequestTextMessage(wxMsgXml);
event = textMsg.getEvent();
String openID = textMsg.getFromUserName().toString();


if (textMsg.getEvent() != null) {
// 获取用户基本信息
if (textMsg != null && event.equals("subscribe")) {
//Info info = p.userProcessing(openID);
// 保存微信用户基本信息
//chatService.savaUserInfo(info);
// 保存微信用户openid到用户管理
sysUserService.saveOpenid(openID);

List<Enter> chatList = new ArrayList<Enter>();
chatList = chatService.queryChat();
replyMsg.append("欢迎使用微信平台!");
// 查询数据库,关注回复欢迎语
for (int i = 0; i < chatList.size(); i++) {
replyMsg.append(
"\r\n" + chatList.get(i).getKeyWord() + "、" + chatList.get(i).getEnterContent() + "");
returnXml = ReplyMessage.getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),
textMsg.getToUserName());
}
} else {//取消关注删除用户信息
//chatService.deleteUserInfo(textMsg.getFromUserName());
sysUserService.deleteUserByOpenId(openID);
}
}

} catch (Exception e) {
e.printStackTrace();
}

if (textMsg.getContent() != null) {


//StringBuffer replyMsg = new StringBuffer();
String receive = textMsg.getContent().trim();
//String returnXml = null;
if (receive.equals("1")) {
// 回复音乐信息
returnXml = ReplyMessage.getReplyMusicMessage(textMsg.getFromUserName(), textMsg.getToUserName());


} else if (receive.equals("3")) {
// 回复图文
returnXml = ReplyMessage.getReplyTuwenMessager(textMsg.getFromUserName(), textMsg.getToUserName());


} else if (receive.equals("2")) {
// 回复时间
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");


replyMsg.append("当前时间\r\n" + df.format(new Date()));
returnXml = ReplyMessage.getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),
textMsg.getToUserName());
} else {
// 关键字查询
Item item = (Item) chatService.queryImgText(receive);
if (item == null) {
replyMsg.append("没有此关键字有关的内容,请重新输入");
returnXml = ReplyMessage.getReplyTextMessage(replyMsg.toString(), textMsg.getFromUserName(),
textMsg.getToUserName());
} else {
returnXml = ReplyMessage.getReplyTuwenMessage(textMsg.getFromUserName(), textMsg.getToUserName(),
item);
}
}
//pw.println(returnXml);
}
pw.println(returnXml);

}

CheckoutUtil 工具类验证token:

package io.renren.modules.fol.util;


import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
 * 
 * @author hp
 *token验证
 */
public class CheckoutUtil {
    // 与接口配置信息中的Token要一致
    private static String token = "sxxnhService";


    /**
     * 验证签名
     * 
     * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
    public static boolean checkSignature(String signature, String timestamp, String nonce) {
        String[] arr = new String[] { token, timestamp, nonce };
        // 将token、timestamp、nonce三个参数进行字典序排序
        // Arrays.sort(arr);
        sort(arr);
        StringBuilder content = new StringBuilder();
        for (int i = 0; i < arr.length; i++) {
            content.append(arr[i]);
        }
        MessageDigest md = null;
        String tmpStr = null;


        try {
            md = MessageDigest.getInstance("SHA-1");
            // 将三个参数字符串拼接成一个字符串进行sha1加密
            byte[] digest = md.digest(content.toString().getBytes());
            tmpStr = byteToStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        content = null;
        // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
        return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
    }


    /**
     * 将字节数组转换为十六进制字符串
     * 
     * @param byteArray
     * @return
     */
    private static String byteToStr(byte[] byteArray) {
        String strDigest = "";
        for (int i = 0; i < byteArray.length; i++) {
            strDigest += byteToHexStr(byteArray[i]);
        }
        return strDigest;
    }


    /**
     * 将字节转换为十六进制字符串
     * 
     * @param mByte
     * @return
     */
    private static String byteToHexStr(byte mByte) {
        char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
        char[] tempArr = new char[2];
        tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
        tempArr[1] = Digit[mByte & 0X0F];
        String s = new String(tempArr);
        return s;
    }
    public static void sort(String a[]) {
        for (int i = 0; i < a.length - 1; i++) {
            for (int j = i + 1; j < a.length; j++) {
                if (a[j].compareTo(a[i]) < 0) {
                    String temp = a[i];
                    a[i] = a[j];
                    a[j] = temp;
                }
            }
        }
    }

}

ReplyMessage :获取推送消息


package io.renren.modules.fol.util;


import java.util.Date;




import org.springframework.beans.factory.annotation.Autowired;


import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;


import io.renren.modules.fol.message.Articles;
import io.renren.modules.fol.message.Item;
import io.renren.modules.fol.message.Music;
import io.renren.modules.fol.message.ReplyMusicMessage;
import io.renren.modules.fol.message.ReplyTextMessage;
import io.renren.modules.fol.message.ReplyTuwenMessage;
import io.renren.modules.fol.message.RequestTextMessage;
import io.renren.modules.fol.service.ChatService;






public class ReplyMessage {
@Autowired
private static ChatService chatService;
// 获取推送文本消息
public static RequestTextMessage getRequestTextMessage(String xml) {


XStream xstream = new XStream(new DomDriver());


xstream.alias("xml", RequestTextMessage.class);
xstream.aliasField("ToUserName", RequestTextMessage.class, "toUserName");
xstream.aliasField("FromUserName", RequestTextMessage.class, "fromUserName");
xstream.aliasField("CreateTime", RequestTextMessage.class, "createTime");
xstream.aliasField("MsgType", RequestTextMessage.class, "messageType");
xstream.aliasField("Content", RequestTextMessage.class, "content");
xstream.aliasField("MsgId", RequestTextMessage.class, "msgId");
xstream.aliasField("Event", RequestTextMessage.class, "event");
xstream.aliasField("EventKey", RequestTextMessage.class, "eventKey");

RequestTextMessage requestTextMessage = (RequestTextMessage) xstream.fromXML(xml);
return requestTextMessage;
}


// 回复文本消息
public static String getReplyTextMessage(String content, String fromUserName, String toUserName) {


ReplyTextMessage we = new ReplyTextMessage();
we.setMessageType("text");
we.setFuncFlag("0");
we.setCreateTime(new Long(new Date().getTime()).toString());
we.setContent(content);
we.setToUserName(fromUserName);
we.setFromUserName(toUserName);
XStream xstream = new XStream(new DomDriver());
xstream.alias("xml", ReplyTextMessage.class);
xstream.aliasField("ToUserName", ReplyTextMessage.class, "toUserName");
xstream.aliasField("FromUserName", ReplyTextMessage.class, "fromUserName");
xstream.aliasField("CreateTime", ReplyTextMessage.class, "createTime");
xstream.aliasField("MsgType", ReplyTextMessage.class, "messageType");
xstream.aliasField("Content", ReplyTextMessage.class, "content");
xstream.aliasField("FuncFlag", ReplyTextMessage.class, "funcFlag");
String xml = xstream.toXML(we);
return xml;
}


// 回复音乐消息
public static String getReplyMusicMessage(String fromUserName, String toUserName) {


ReplyMusicMessage we = new ReplyMusicMessage();
Music music = new Music();


we.setMessageType("music");
we.setCreateTime(new Long(new Date().getTime()).toString());
we.setToUserName(fromUserName);
we.setFromUserName(toUserName);
we.setFuncFlag("0");
music.setTitle("大壮");
music.setDescription("我们不一样");
String url = "http://sc1.111ttt.cn/2017/1/11/11/304112002493.mp3";
String url2 = "http://sc1.111ttt.cn/2017/1/11/11/304112002493.mp3";
music.setMusicUrl(url);
music.setHqMusicUrl(url2);


we.setMusic(music);


XStream xstream = new XStream(new DomDriver());
xstream.alias("xml", ReplyMusicMessage.class);
xstream.aliasField("ToUserName", ReplyMusicMessage.class, "toUserName");
xstream.aliasField("FromUserName", ReplyMusicMessage.class, "fromUserName");
xstream.aliasField("CreateTime", ReplyMusicMessage.class, "createTime");
xstream.aliasField("MsgType", ReplyMusicMessage.class, "messageType");
xstream.aliasField("FuncFlag", ReplyMusicMessage.class, "funcFlag");
xstream.aliasField("Music", ReplyMusicMessage.class, "Music");


xstream.aliasField("Title", Music.class, "title");
xstream.aliasField("Description", Music.class, "description");
xstream.aliasField("MusicUrl", Music.class, "musicUrl");
xstream.aliasField("HQMusicUrl", Music.class, "hqMusicUrl");


String xml = xstream.toXML(we);
return xml;
}


// 回复图文消息
public static String getReplyTuwenMessager(String fromUserName, String toUserName) {


ReplyTuwenMessage we = new ReplyTuwenMessage();


Articles articles = new Articles();


Item item = new Item();


we.setMessageType("news");
we.setCreateTime(new Long(new Date().getTime()).toString());
we.setToUserName(fromUserName);
we.setFromUserName(toUserName);
we.setFuncFlag("0");
we.setArticleCount(1);


item.setTitle("周杰伦");
item.setDescription("周杰伦(Jay Chou),1979年1月18日出生于台湾省新北市,中国台湾流行乐男歌手、音乐人、演员、导演、编剧、监制、商人。");
item.setPicUrl("http://cimg2.163.com/catchimg/20090930/8458904_45.jpg");
item.setUrl("https://baike.baidu.com/item/%E5%91%A8%E6%9D%B0%E4%BC%A6");


articles.setItem(item);
we.setArticles(articles);


XStream xstream = new XStream(new DomDriver());
xstream.alias("xml", ReplyTuwenMessage.class);
xstream.aliasField("ToUserName", ReplyTuwenMessage.class, "toUserName");
xstream.aliasField("FromUserName", ReplyTuwenMessage.class, "fromUserName");
xstream.aliasField("CreateTime", ReplyTuwenMessage.class, "createTime");
xstream.aliasField("MsgType", ReplyTuwenMessage.class, "messageType");
xstream.aliasField("Articles", ReplyTuwenMessage.class, "Articles");


xstream.aliasField("ArticleCount", ReplyTuwenMessage.class, "articleCount");
xstream.aliasField("FuncFlag", ReplyTuwenMessage.class, "funcFlag");


xstream.aliasField("item", Articles.class, "item");


xstream.aliasField("Title", Item.class, "title");
xstream.aliasField("Description", Item.class, "description");
xstream.aliasField("PicUrl", Item.class, "picUrl");
xstream.aliasField("Url", Item.class, "url");


String xml = xstream.toXML(we);
return xml;
}


// 回复图文消息2
public static String getReplyTuwenMessage(String fromUserName, String toUserName,Item it) {


ReplyTuwenMessage we = new ReplyTuwenMessage();


Articles articles = new Articles();


Item item = new Item();


we.setMessageType("news");
we.setCreateTime(new Long(new Date().getTime()).toString());
we.setToUserName(fromUserName);
we.setFromUserName(toUserName);
we.setFuncFlag("0");
we.setArticleCount(1);


item.setTitle(it.getTitle());
item.setDescription(it.getDescription());
item.setPicUrl(it.getPicUrl());
item.setUrl(it.getUrl());


articles.setItem(item);
we.setArticles(articles);


XStream xstream = new XStream(new DomDriver());
xstream.alias("xml", ReplyTuwenMessage.class);
xstream.aliasField("ToUserName", ReplyTuwenMessage.class, "toUserName");
xstream.aliasField("FromUserName", ReplyTuwenMessage.class, "fromUserName");
xstream.aliasField("CreateTime", ReplyTuwenMessage.class, "createTime");
xstream.aliasField("MsgType", ReplyTuwenMessage.class, "messageType");
xstream.aliasField("Articles", ReplyTuwenMessage.class, "Articles");


xstream.aliasField("ArticleCount", ReplyTuwenMessage.class, "articleCount");
xstream.aliasField("FuncFlag", ReplyTuwenMessage.class, "funcFlag");


xstream.aliasField("item", Articles.class, "item");


xstream.aliasField("Title", Item.class, "title");
xstream.aliasField("Description", Item.class, "description");
xstream.aliasField("PicUrl", Item.class, "picUrl");
xstream.aliasField("Url", Item.class, "url");


String xml = xstream.toXML(we);
return xml;
}
}

UserPro :获取用户基本信息

package io.renren.modules.fol.util;


import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;


import org.apache.http.client.ClientProtocolException;


import com.alibaba.fastjson.JSONObject;


import io.renren.modules.fol.entity.Info;


/**
 * 
 * @author hp
 *用戶基本信息
 */
public class UserPro {
public Info userProcessing(String openid) throws ClientProtocolException, IOException{
Info info = new Info();
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+ WXAuthUtil.APPID + "&secret=" + WXAuthUtil.APPSECRET;
System.out.println(url);
JSONObject refreshInfo = WXAuthUtil.doGetJson(url);
String url2 = "https://api.weixin.qq.com/cgi-bin/user/info?access_token="
+ refreshInfo.getString("access_token") + "&openid=" +openid
+ "&lang=zh_CN";
System.out.println(url2);
JSONObject refreshInfo2 = WXAuthUtil.doGetJson(url2);
if (refreshInfo2.getString("sex").equals("1")) {
info.setSex("男");
} else if (refreshInfo2.getString("sex").equals("2")) {
info.setSex("女");
;
} else {
info.setSex("未知");
}
Long time = Long.parseLong(refreshInfo2.getString("subscribe_time"));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String subtime = sdf.format(new Date(time * 1000L));
info.setCreattime(subtime);
if (refreshInfo2.getString("subscribe_scene").equals("ADD_SCENE_SEARCH")) {
info.setMode("公众号搜索");
} else if (refreshInfo2.getString("subscribe_scene").equals("ADD_SCENE_QR_CODE")) {
info.setMode("扫描二维码");
}
info.setOpenid(refreshInfo2.getString("openid"));
info.setConuntry(refreshInfo2.getString("country"));
info.setProvince(refreshInfo2.getString("province"));
info.setUrban(refreshInfo2.getString("city"));
info.setImg(refreshInfo2.getString("headimgurl"));
info.setLang(refreshInfo2.getString("language"));
info.setIname(refreshInfo2.getString("nickname"));
return info;
}
}

WXAuthUtil :访问网址获取信息,输入自己的APPID和APPSECRET 

package io.renren.modules.fol.util;




import java.io.IOException;


import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;




public class WXAuthUtil {
   public static final String APPID="wx06496765cdeb9090";//wx06496765cdeb9090
    public static final String APPSECRET ="0fed2c47cb8a0b62ebbe69487a376089";//0fed2c47cb8a0b62ebbe69487a376089
    public static JSONObject doGetJson(String url) throws ClientProtocolException, IOException {
          JSONObject jsonObject =null;
        DefaultHttpClient client = new DefaultHttpClient();
        HttpGet httpGet =new HttpGet(url);
        HttpResponse response =  client.execute(httpGet);
        HttpEntity entity =response.getEntity();
        if(entity!=null)
        {
            //转化为json对象
            String result =EntityUtils.toString(entity, "UTF-8");
            jsonObject =JSON.parseObject(result); 
        }
        
        return jsonObject;
    }
}


RequestTextMessage://文本类型


package io.renren.modules.fol.message;


public class RequestTextMessage {
     private String toUserName;
     private String fromUserName;
     private String createTime;
     private String messageType;
     private String content;
     private String event;
     private String eventKey;
     public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
private String msgId;
 //getters,setters   
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getMsgId() {
return msgId;
}
public void setMsgId(String msgId) {
this.msgId = msgId;
}
public String getEventKey() {
return eventKey;
}
public void setEventKey(String eventKey) {
this.eventKey = eventKey;
}
     
 }


ReplyTuwenMessage :图文类型

package io.renren.modules.fol.message;



//ͼ����Ϣ
 public class ReplyTuwenMessage {
 
     private String toUserName;
     private String fromUserName;
     private String createTime;
     private String messageType;
     private int articleCount;
     private Articles Articles;
     private String funcFlag;
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public int getArticleCount() {
return articleCount;
}
public void setArticleCount(int articleCount) {
this.articleCount = articleCount;
}

public Articles getArticles() {
return Articles;
}
public void setArticles(Articles articles) {
Articles = articles;
}
public String getFuncFlag() {
return funcFlag;
}
public void setFuncFlag(String funcFlag) {
this.funcFlag = funcFlag;
}
     

}


ReplyTextMessage :文本类型

package io.renren.modules.fol.message;


//�ı���Ϣ
 public class ReplyTextMessage {
 
         private String toUserName;
         private String fromUserName;
         private String createTime;
         private String messageType;
         private String content;
         private String funcFlag;
         private String event;
         private String eventKey;
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getFuncFlag() {
return funcFlag;
}
public void setFuncFlag(String funcFlag) {
this.funcFlag = funcFlag;
}
public String getEvent() {
return event;
}
public void setEvent(String event) {
this.event = event;
}
public String getEventKey() {
return eventKey;
}
public void setEventKey(String eventKey) {
this.eventKey = eventKey;
}
         

}


ReplyMusicMessage :音乐类型

package io.renren.modules.fol.message;


//������Ϣ
public class ReplyMusicMessage {


    private String toUserName;
    private String fromUserName;
    private String createTime;
    private String messageType;
    private Music Music;
    private String funcFlag;
public String getToUserName() {
return toUserName;
}
public void setToUserName(String toUserName) {
this.toUserName = toUserName;
}
public String getFromUserName() {
return fromUserName;
}
public void setFromUserName(String fromUserName) {
this.fromUserName = fromUserName;
}
public String getCreateTime() {
return createTime;
}
public void setCreateTime(String createTime) {
this.createTime = createTime;
}
public String getMessageType() {
return messageType;
}
public void setMessageType(String messageType) {
this.messageType = messageType;
}

public Music getMusic() {
return Music;
}
public void setMusic(Music music) {
Music = music;
}
public String getFuncFlag() {
return funcFlag;
}
public void setFuncFlag(String funcFlag) {
this.funcFlag = funcFlag;
}
    

 }

Music :

package io.renren.modules.fol.message;
//����
 public class Music {
 
     private String title;
     private String description;
     private String musicUrl;
     private String hqMusicUrl;
 //getters,setters    
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getMusicUrl() {
return musicUrl;
}
public void setMusicUrl(String musicUrl) {
this.musicUrl = musicUrl;
}
public String getHqMusicUrl() {
return hqMusicUrl;
}
public void setHqMusicUrl(String hqMusicUrl) {
this.hqMusicUrl = hqMusicUrl;
}

 }


Item :

package io.renren.modules.fol.message;


//ͼ��
 public class Item {
 
     private String title;
     private String description;
     private String picUrl;
     private String url;
 //getters,setters    
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPicUrl() {
return picUrl;
}
public void setPicUrl(String picUrl) {
this.picUrl = picUrl;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}

 }

Articles :

package io.renren.modules.fol.message;


//����
 public class Articles {
 
     private Item item;
 
     public Item getItem() {
         return item;
     }
 
     public void setItem(Item item) {
         this.item = item;
     }
     
     

}



猜你喜欢

转载自blog.csdn.net/qq_41579101/article/details/80634320