luckystar +
send mail to luckystar sina weibo
关于订阅 luckystar's blog » Project »
分类:
标签:

一、回复文本消息
二、回复链接消息
三、回复音乐消息
四、回复图文消息
五、事件-订阅
六、事件-取消订阅
PS:当然还包括表情。参考:http://www.360doc.com/content/13/0803/13/13350344_304465190.shtml

完整代码:
微信接口配置的回调地址对应的Controller:

import org.apache.commons.lang.StringUtils;  
import org.apache.log4j.Logger;  
import org.springframework.beans.factory.annotation.Autowired;  
import org.springframework.stereotype.Controller;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RequestMethod;  
  
  
import com.company.project.service.WeixinService;  
import com.company.project.util.Util;  
  
  
import javacommon.base.BaseRestSpringController;  
  
  
@Controller  
@RequestMapping("/wxapi")  
public class WeixinApiController extends BaseRestSpringController<Object, java.lang.Long>{  
    public static final Logger log = Logger.getLogger(WeixinApiController.class);  
    public static final String WX_TOKEN = "weixin";  
    @Autowired  
    private WeixinService wxService;  
    /** 
    * 微信回调地址 
    * 
    * @author qincd 
    * @throws IOException  
    * @date Nov 3, 2014 4:01:42 PM 
    */  
    @RequestMapping(method=RequestMethod.GET)  
    public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {  
        // 微信会在配置的回调地址上加上signature,nonce,timestamp,echostr4个参数  
        String signature = request.getParameter("signature");  
        String timestamp = request.getParameter("timestamp");  
        String nonce = request.getParameter("nonce");  
        String echostr = request.getParameter("echostr");  
          
        log.info("微信传递的参数:");  
        log.info("signature:"+signature);  
        log.info("timestamp:"+timestamp);  
        log.info("nonce:"+nonce);  
        log.info("echostr:"+echostr);  
          
        if (StringUtils.isEmpty(signature)) {  
            return;  
        }  
        // 1).排序  
        String sortString = sort(WX_TOKEN, timestamp, nonce);  
        // 2).加密  
        String mytoken = Util.sha1(sortString);  
        // 3).校验签名  
        if (StringUtils.isNotEmpty(mytoken) && mytoken.equals(signature)) {  
            log.info("签名校验通过。");  
            response.getWriter().println(echostr);  
        }  
        else {  
            log.warn("签名校验失败。");  
        }  
    }  
      
    @RequestMapping(method=RequestMethod.POST)  
    public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {  
        // 处理请求、响应  
        request.setCharacterEncoding("utf-8");  
        response.setCharacterEncoding("utf-8");  
        String message = wxService.processRequest(request);  
        response.getWriter().println(message);  
    }  
      
    /** 
    * 将token,timestamp,nonce按字典序排序,并返回拼接的字符串 
    * 
    * @author qincd 
    * @date Nov 3, 2014 4:09:43 PM 
    */  
    public static String sort(String token,String timestamp,String nonce) {  
        String[] strArray = {token,timestamp,nonce};  
        Arrays.sort(strArray);  
          
        StringBuilder sbuilder = new StringBuilder();  
        for (String str : strArray) {  
            sbuilder.append(str);  
        }  
      
        return sbuilder.toString();  
    }  
      
      
    }  
      
      
    import java.util.ArrayList;  
    import java.util.List;  
    import java.util.Map;  
      
      
    import javax.servlet.http.HttpServletRequest;  
      
      
    import org.apache.log4j.Logger;  
    import org.springframework.stereotype.Service;  
      
      
    import com.company.project.model.resp.Articles;  
    import com.company.project.model.resp.Music;  
    import com.company.project.model.resp.MusicMessage;  
    import com.company.project.model.resp.NewsMessage;  
    import com.company.project.model.resp.TextMessage;  
    import com.company.project.util.MessageUtil;  
      
      
    @Service  
    public class WeixinService {  
    public static Logger log = Logger.getLogger(WeixinService.class);  
      
    public String processRequest(HttpServletRequest req) {  
    // 解析微信传递的参数  
    String str = null;  
    try {  
        Map<String,String> xmlMap = MessageUtil.parseXml(req);  
        str = "请求处理异常,请稍后再试!";  
          
        String ToUserName = xmlMap.get("ToUserName");  
        String FromUserName = xmlMap.get("FromUserName");  
        String MsgType = xmlMap.get("MsgType");  
          
        if (MsgType.equals(MessageUtil.MESSAGG_TYPE_TEXT)) {  
            // 用户发送的文本消息  
            String content = xmlMap.get("Content");  
            log.info("用户:[" + FromUserName + "]发送的文本消息:" + content);  
              
            // 链接  
            if (content.contains("csdn")) {  
                TextMessage tm = new TextMessage();  
                tm.setToUserName(FromUserName);  
                tm.setFromUserName(ToUserName);  
                tm.setMsgType(MessageUtil.MESSAGG_TYPE_TEXT);  
                tm.setCreateTime(System.currentTimeMillis());  
                tm.setContent("我的CSDN博客:<a href=\"http://my.csdn.net/qincidong\">我的CSDN博客</a>\n");  
                return MessageUtil.textMessageToXml(tm);  
            }  
          
            if (content.contains("图文")) {  
                NewsMessage nm = new NewsMessage();  
                nm.setFromUserName(ToUserName);  
                nm.setToUserName(FromUserName);  
                nm.setCreateTime(System.currentTimeMillis());  
                nm.setMsgType(MessageUtil.MESSAGG_TYPE_NEWS);  
                List<Articles> articles = new ArrayList<Articles>();  
                Articles e1 = new Articles();  
                e1.setTitle("马云接受外媒专访:中国的五大银行想杀了“我”");  
                e1.setDescription("阿里巴巴集团上市大获成功,《华尔街日报》日前就阿里巴巴集团、支付宝等话题采访了马云,马云也谈到了与苹果Apple Pay建立电子支付联盟的可能性。本文摘编自《华尔街日报》,原文标题:马云谈阿里巴巴将如何帮助美国出口商,虎嗅略有删节。");  
                e1.setPicUrl("http://img1.gtimg.com/finance/pics/hv1/29/53/1739/113092019.jpg");  
                e1.setUrl("http://finance.qq.com/a/20141105/010616.htm?pgv_ref=aio2012&ptlang=2052");  
                  
                Articles e2 = new Articles();  
                e2.setTitle("史上最牛登机牌:姓名竟是微博名 涉事航空公司公开致歉");  
                e2.setDescription("世上最遥远的距离是飞机在等你登机,你却过不了安检。");  
                e2.setPicUrl("http://p9.qhimg.com/dmfd/328_164_100/t011946ff676981792d.png");  
                e2.setUrl("http://www.techweb.com.cn/column/2014-11-05/2093128.shtml");  
                articles.add(e1);  
                articles.add(e2);  
                  
                nm.setArticles(articles);  
                nm.setArticleCount(articles.size());  
                  
                String newsXml = MessageUtil.NewsMessageToXml(nm);  
                log.info("\n"+newsXml);  
                return newsXml;  
            }  
            if (content.contains("音乐")) {  
                MusicMessage mm =  new MusicMessage();  
                mm.setFromUserName(ToUserName);  
                mm.setToUserName(FromUserName);  
                mm.setMsgType(MessageUtil.MESSAGG_TYPE_MUSIC);  
                mm.setCreateTime(System.currentTimeMillis());  
                Music music = new Music();  
                music.setTitle("Maid with the Flaxen Hair");  
                music.setDescription("测试音乐");  
                music.setMusicUrl("http://yinyueshiting.baidu.com/data2/music/123297915/1201250291415073661128.mp3?xcode=e2edf18bbe9e452655284217cdb920a7a6a03c85c06f4409");  
                music.setHQMusicUrl("http://yinyueshiting.baidu.com/data2/music/123297915/1201250291415073661128.mp3?xcode=e2edf18bbe9e452655284217cdb920a7a6a03c85c06f4409");  
                mm.setMusic(music);  
                  
                String musicXml = MessageUtil.MusicMessageToXml(mm);  
                log.info("musicXml:\n" + musicXml);  
                return musicXml;  
            }  
          
            // 响应  
            TextMessage tm = new TextMessage();  
            tm.setToUserName(FromUserName);  
            tm.setFromUserName(ToUserName);  
            tm.setMsgType(MessageUtil.MESSAGG_TYPE_TEXT);  
            tm.setCreateTime(System.currentTimeMillis());  
            tm.setContent("你好,你发送的内容是:\n" + content);  
              
            String xml = MessageUtil.textMessageToXml(tm);  
            log.info("xml:" + xml);  
            return xml;  
        }  
        else if (MsgType.equals(MessageUtil.MESSAGG_TYPE_EVENT)) {  
            String event = xmlMap.get("Event");  
            if (event.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {  
                // 订阅  
                TextMessage tm = new TextMessage();  
                tm.setToUserName(FromUserName);  
                tm.setFromUserName(ToUserName);  
                tm.setMsgType(MessageUtil.MESSAGG_TYPE_TEXT);  
                tm.setCreateTime(System.currentTimeMillis());  
                tm.setContent("你好,欢迎关注[程序员的生活]公众号![愉快]/呲牙/玫瑰\n目前可以回复文本消息");  
                return MessageUtil.textMessageToXml(tm);  
            }  
            else if (event.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {  
                // 取消订阅  
                log.info("用户【" + FromUserName + "]取消关注了。");  
            }  
        }  
    } catch (Exception e) {  
        e.printStackTrace();  
        log.error("处理微信请求时发生异常:");  
    }  
      
    return str;  
    }  
}
作者:qincidong
出处:http://qincidong.github.io/blog/2014/11/25/weixin-develop-3rd.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。
分类: 标签:
友荐云推荐