微信公众号开发(2)---消息的接收发送

在微信公众号开发(1)中,我们进行了GET请求方法的开发编写,能够使微信与我们的服务器进行了关系的绑定,接下来我们进行开发接收用户消息与一些事件的回复;

       开发必要了解:在我们微信与我们的服务器进行了关系的绑定后,微信会将用户所发过来的消息以及事件会以XML的格式POST请求的方式发送给我们的服务器,所以我们需要开发POST请求的接口,接收用户的消息,我们可以根据用户的消息进行一些关键字回复,以及关注后的回复推送,微信事件里有很多功能,这里只进行开发关键字回复以及关注事件,其他的顺藤摸瓜按照微信文档完全可以开发出来,一样的套路----

  1.为了方便开发,我先引入进来微信常用的接口和事件的常量,以及Xml转Map的工具类代码附上(红色部分我们需要配置成我们后台的参数):

package com.wx.project.util;

public class WxParamConfig {

    public static final String TOKEN="chenyuesong";//为微信后台配置的token
    public static final String APPID="wx426aad126775582c";//为微信后台的appid
    public static final String ACCESS_TOKEN="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";//微信获取TOKEN地址
    public static final String SEND_TEMPLATE="https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";//模板发送地址
    public static final String USER_INFO="https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";//获取用户信息
    public static final String MENU="https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";//微信菜单管理创建
    public static final String LOGIN="https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";//微信公众号login地址,获取code
    public static final String USER_TOKEN="https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";//通过code获取token票据

    /*
     * 微信提供的事件类型
     */
    public static final String MESSAGE_TEXT="text";
    public static final String MESSAGE_IMAGE="image";
    public static final String MESSAGE_NEWS="news";//图文消息
    public static final String MESSAGE_VIDEO="video";
    public static final String MESSAGE_VOICE="voice";
    public static final String MESSAGE_LINK="link";
    public static final String MESSAGE_LOCATION="location";
    public static final String MESSAGE_EVENT="event";
    public static final String MESSAGE_SUBSCRIBE="subscribe";//消息关注
    public static final String MESSAGE_UNSUBSCRIBE="unsubscribe";//取消关注
    public static final String MESSAGE_CLICK="click";//菜单点击
    public static final String MESSAGE_VIEW="view";//view菜单点击

}

  xml转Map 工具类(在我的常用工具类中有这个工具类):--->https://www.cnblogs.com/iscys/p/9501155.html

  

  2.进行POST方法的编写---->接收到微信的XML数据流---->xml转Map工具类进行数据的读取判断----->开发者自己的逻辑---->返回给微信数据----->发送成功

    <1>  Controller层的代码,我将业务逻辑的判断回复放在了Service层,来更加真实模拟开发环境  

/*
     * 微信消息事件配置逻辑,微信公众号用户发出的请求都会进入POST方法进行接收,我们可以进行消息的回复,以及图文消息等等
     * 需要注意的是数据的接收与回复都是XML的数据格式
     */
    @RequestMapping(value="/wxopen" ,method=RequestMethod.POST)
    public void MsgResponse(HttpServletRequest request,HttpServletResponse response) throws Exception {
        /*
         * 可以以来数据库内容进行动态的回复判断
         */
        //接收消息,将微信XML数据流消息转换为MAP数据格式
        Map<String,String> map=WxParseXmlUtil.xmlTOMap(request);
        String ToUserName =map.get("ToUserName");
        String FromUserName =map.get("FromUserName");//获取发送消息方的微信号
        String  MsgType =map.get("MsgType");//消息的类型
        String Content =map.get("Content");//消息内容,我们根据消息的内容与消息的类型进行动态的实现自己的业务逻辑
        //业务逻辑的实现在Service层,返回XML字符串
        String contentXml=msgResponse.autoResponse(map);
        System.out.println(contentXml);
        PrintWriter writer=null;
        try {
        writer=response.getWriter();
        writer.write(contentXml);
        }
        catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        finally {
            if(writer !=null) {
                writer.close();
            }
    }

    }

    <2>.service 层代码,为了方便我们这里不进行数据库内容的获取

public String autoResponse(Map<String, String> map) {

        String ToUserName =map.get("ToUserName");//接收方的微信公众号;
        String FromUserName =map.get("FromUserName");//获取发送消息方的微信号
        String  MsgType =map.get("MsgType");//消息的类型
        String Content =map.get("Content");//消息内容
        String xmlStr =null;
        //用户关注时候的事件,用户关注时候微信或给我们XML中带有<MsgType>event</MsgType><Event></Event>
         if(WxParamConfig.MESSAGE_EVENT.equals(MsgType)) {
             if(WxParamConfig.MESSAGE_SUBSCRIBE.equals(map.get("Event"))) {
                //List<Map> content= msgmapper.getContentByWxType(WxParamConfig.MESSAGE_SUBSCRIBE);
                if(StringUtils.isEmpty(content)) {
                    return xmlStr;
                }
                if("1".equals(content.get(0).get("type")+"")) {
                     xmlStr=textMessage(content.get(0).get("digest"),ToUserName,FromUserName);
                    }
                else if("0".equals(content.get(0).get("type")+"")) {
                     xmlStr=newsMessage(content,ToUserName,FromUserName);
                }

                 }
                 }

        return xmlStr;
    }

  

  

  

原文地址:https://www.cnblogs.com/iscys/p/9508953.html

时间: 2024-10-07 19:00:01

微信公众号开发(2)---消息的接收发送的相关文章

微信公众号开发之消息的接收与被动回复消息

原文:http://blog.csdn.net/qczxl/article/details/51580946 微信官方文档 接收普通消息(http://mp.weixin.qq.com/wiki/17/f298879f8fb29ab98b2f2971d42552fd.html) 接收事件推送(http://mp.weixin.qq.com/wiki/7/9f89d962eba4c5924ed95b513ba69d9b.html) 发送被动回复消息(http://mp.weixin.qq.com/

.net微信公众号开发——群发消息

作者:王先荣    本文将介绍微信公众号开发中用于群发消息的类MassMessage,包括:(1)MassMessage类:(2)群发:(3)删除:(4)预览:(5)查询发送状态:(6)接收推送群发结果事件.    源代码地址:http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/tree/master/PublicAccount/MassMessage    演示地址:http://www.xrwang.net/Example/M

.net微信公众号开发——模板消息

本文介绍微信公众号中的模板消息,包括以下内容:(1)TemplateMessage类简介:(2)设置所属行业:(3)获得模板id:(4)发送模板消息:(5)接收推送模板消息发送结果事件.    本文演示地址:http://xrwang.net/Example/TemplateMessage.aspx    本文源代码地址:    http://git.oschina.net/xrwang2/xrwang.weixin.PublicAccount/tree/master/PublicAccount

C#微信公众号开发系列教程(接收事件推送与消息排重)

微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这样一个场景:当用户关注微信账号时,获取当前用户信息,然后将信息写到数据库中.类似于pc端网站的注册.可能由于这个关注事件中,我们需要处理的业务逻辑比较复杂.如送积分啊,写用户日志啊,分配用户组啊.等等……一系列的逻辑需要执行,或者网络环境比较复杂,无法保证5秒内响应当前用户的操作,那如果当操作尚未完成,微信服务器又给我们的服务器推送了一条相同的关注事件,我们将再次执行我们的那些逻辑,这样就有可能导致

微信公众号开发(2)---接收订阅事件推送并回复消息

在thinkphp框架内完成的,下面是控制器页面(不涉及其他页面) <?PHP namespace Home\Controller;use Think\Controller; class IndexController extends Controller {    //token验证,微信服务器发送post请求过来    public function index(){      $timestamp = $_GET["timestamp"];//a时间戳      $nonc

微信公众号开发之消息自动回复

1.PHP示例代码下载 下载地址1:http://pan.baidu.com/s/1nvlhbnV. 下载地址2:https://mp.weixin.qq.com/wiki/home/index.html(开始开发->接入指南->PHP示例代码下载) 2.wx_sample.php初始代码 1 <?php 2 /** 3 * wechat php test 4 */ 5 6 //define your token 7 define("TOKEN", "wei

C#微信公众号开发系列教程五(接收事件推送与消息排重)

微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) 在上一篇的博文中讲到,微信的消息可以大体分为两种类型,一种是包括:文本,语音,图片等的普通消息,另一种就是本篇要将的事件类型.包括:关注/取消关注事件,扫描带参数二维码事件,上报地理位置事件,自定义菜

C#微信公众号开发系列教程三(消息体签名及加解密)

  C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太忙,样稿一直没有给他,感觉挺愧疚了.真心希望能帮一下迷茫的

微信公众号开发之自动消息回复和自定义菜单

(一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 前言 上一篇我们大致讲解了下微信公众号开发的基本原理和流程概述.本章主要是对文本消息回复和自定义菜单做一个记录和分解 消息回复 处理请求,并响应 1)关注 也可参考官网文档:https://mp.weixin.qq.com/wiki 当微信用户关注公众账号时,可以给其适当的提示.可以是欢迎词,可以是帮助提示.示例代码如下: class EventHandler : IHandler