当前位置: 首页 > 图灵资讯 > 技术篇> 微信公众号开发---基础消息能力开发

微信公众号开发---基础消息能力开发

来源:图灵教育
时间:2023-05-30 09:40:26

微信官方账号收到普通消息
1。配置开发服务器

微信公众平台->开发->开发者工具->公共平台测试账号

微信公众号开发---基础消息能力开发_服务器

appid:通过与appsecret验证,是微信微信官方账号唯一的标识。URL:开发服务器路径,接收微信服务器发送的数据。Token:自设token与开发服务器中验证的token保持一致。微信微信官方账号用户、微信服务器与开发服务器的关系:微信微信官方账号用户发送信息时,发送到微信服务器,微信服务器通过xml格式将信息转发给开发服务器。如果使用本地tomcat,可以使用natapp等内网穿透工具生成外网域名,通过域名访问本地localhost:8080.

注册链接

登录之后 ,购买免费通道

微信公众号开发---基础消息能力开发_服务器_02

需要修改自己项目的ip和端口

微信公众号开发---基础消息能力开发_xml_03

运行natapp

config.ini方式 (推荐)

根据操作系统下载不同的config.ini文件到刚刚下载的natapp.exe同级目录下载链接

填写免费通道获得的authtoken (其他地方不填),保存

微信公众号开发---基础消息能力开发_服务器_04

windows下,直接双击natapp.exe 即可.

开发人员提交信息后,微信服务器将GET请求发送到填写的服务器地址URL,GET请求携带参数如下表所示:

参数

描述

signature

结合开发人员填写的token参数和请求中的timestamp参数、nonce参数,微信加密签名。

timestamp

时间戳

nonce

随机数

echostr

随机字符串

wei-java-依赖tools

<dependency>            <groupId>me.chanjar</groupId>            <artifactId>weixin-java-mp</artifactId>            <version>1.3.3</version>        </dependency>        <dependency>            <groupId>me.chanjar</groupId>            <artifactId>weixin-java-common</artifactId>            <version>1.3.3</version>        </dependency>

代码:

///微信配置服务器 验证    @RequestMapping(value="/wxserver",method={RequestMethod.GET})    public  void check(HttpServletRequest request, HttpServletResponse response)  {        //////微信服务器传输的参数        String signature = request.getParameter("signature");        String timestamp = request.getParameter("timestamp");        String nonce = request.getParameter("nonce");        String echostr = request.getParameter("echostr");         ///微信工具服务        WxMpService wxService=new WxMpServiceImpl();        ////注入token的配置参数        /**         * 生产环境 建议WxmpinmemoryconfigStorage持久化         */        WxMpInMemoryConfigStorage wxConfigProvider=new WxMpInMemoryConfigStorage();        ///注入token值        wxConfigProvider.setToken("weixin");        wxService.setWxMpConfigStorage(wxConfigProvider);        boolean flag=wxService.checkSignature(timestamp, nonce, signature); ////验证token是否与微信配置相同        PrintWriter out= null;        try {            out = response.getWriter();        } catch (IOException e) {            e.printStackTrace();        }        if(flag){            out.print(echostr);        }        out.close();    }

signature: signature结合了开发者填写的token参数、请求中的timestamp参数和nonce参数。这三个参数用sha1算法加密.

boolean flag=wxService.checkSignature(timestamp, nonce, signature)

根据这三个参数,在开发服务器中重新加密sha1算法,生成新的signature,然后与请求参数中的signature进行比较,验证相同,成功后返回随机字符串。配置阶段成功。

2.简单实现文本回复的操作

微信公众号开发---基础消息能力开发_xml_05

URL:在验证过程中,参数将通过GET请求URL。验证成功后,微信官方账号用户发送数据时,微信服务器会通过POST将数据发送到URL。

所以我们应该写两条相同的路径,要求不同方法的controller。

@RequestMapping(value="/wxserver",method={RequestMethod.GET}); @RequestMapping(value="/wxserver",produces={"application/xml;charset=UTF-8;"},method={RequestMethod.POST})
普通消息

文本新闻案例

<xml>  <ToUserName><![CDATA[toUser]]></ToUserName>  <FromUserName><![CDATA[fromUser]]></FromUserName>  <CreateTime>1348831860</CreateTime>  <MsgType><![CDATA[text]]></MsgType>  <Content><![CDATA[this is a test]]></Content>  <MsgId>1234567890123456</MsgId></xml>

参数

描述

ToUserName

开发者微信号

FromUserName

发送方帐号(OpenID)

CreateTime

创建新闻的时间 (整型)

MsgType

消息类型,文本为textt

Content

文本新闻内容

MsgId

消息id,64位整形手术

MsgType:新闻类型,文本为text,图片为image,语音为voice等官方文档

推送事件

单击菜单中的事件事例

用户点击自定义菜单后,微信会将点击事件推送给开发者。请注意,点击菜单弹出子菜单,不会产生报告。

点击菜单拉取消息时的事件推送

推XML数据包示例:

<xml>  <ToUserName><![CDATA[toUser]]></ToUserName>  <FromUserName><![CDATA[FromUser]]></FromUserName>  <CreateTime>123456789</CreateTime>  <MsgType><![CDATA[event]]></MsgType>  <Event><![CDATA[CLICK]]></Event>  <EventKey><![CDATA[EVENTKEY]]></EventKey></xml>

参数说明:

微信公众号开发---基础消息能力开发_微信_06

代码:

@ResponseBody()    @RequestMapping(value="/wxserver",produces={"application/xml;charset=UTF-8;"},method={RequestMethod.POST})    public  String  receive(HttpServletRequest request, HttpServletResponse response)  throws  Exception{        ///因为微信服务器返回xml  所以我们需要分析        //获取消息流        WxMpXmlMessage message=WxMpXmlMessage.fromXml(request.getInputStream());        String fromUserName = message.getFromUserName();        String toUserName = message.getToUserName();        logger.info(【猎人MM微信官方账号】被要求,用户openid:"+fromUserName);        ///消息类型        String messageType=message.getMsgType();        if("text".equals(messageType)){          //  String res= wxTextReceiveService.receiveText(message);            String str="";            ///文本新闻  文本内容            String content = message.getContent();            ///将回复信息按格式包装成xml            //toUser(fromUserName).fromUser(toUserName)  发送者成为接受者            WxMpXmlOutTextMessage text = WxMpXmlOutTextMessage.TEXT().toUser(fromUserName).fromUser(toUserName).content(”你发送的消息是\n"+content ).build();            str = text.toXml();            return str;        }else if("event".equals(messageType)){            String str="";            WxMpXmlOutTextMessage text = WxMpXmlOutTextMessage.TEXT().toUser(fromUserName).fromUser(toUserName).content(”欢迎关注\n" ).build();            str = text.toXml();            return str;        }        return "";    }

messagetpe类型 官方文档