一、申请一个微信公众号
https://mp.weixin.qq.com/

二、接口认证(证明你是一名合法的开发者)

在微信公众平台左侧菜单找到基本配置

微信开发者工具如何开发公众号页面 公众号开发者中心在哪_微信公众号


微信开发者工具如何开发公众号页面 公众号开发者中心在哪_System_02


开发者ID是注册完就有的,这里要注意的是开发者密码,非常重要,获取密码后,建议保存在文本文档里。还有一个IP白名单是干什么的呢?

开发者访问微信服务器时会携带ID和密码和IP地址,在服务器里IP白名单上的IP地址才允许访问。

微信开发者工具如何开发公众号页面 公众号开发者中心在哪_xml_03


点击修改配置

微信开发者工具如何开发公众号页面 公众号开发者中心在哪_xml_04


URL是访问地址,借助NATAPP工具获取

https://natapp.cn/ 下载64位ZIP,解压出来运行后出现命令窗口,需输入指令。

先在NATAPP网页上找到免费隧道(需注册)

购买一个免费隧道


在命令窗口中输入 natapp -authtoken=(authtoken下的内容)


成功后显示online,http://…cc即是内网穿透后的地址(付费与免费的区别就是免费的URL每次都是不一样的)。

回到微信公众平台的配置网页,复制地址到URL栏,地址后接controller地址。Token随意取名,随机生成,明文模式。点击提交,提示失败。

打开IDEA新建工程,创建maven项目,因为与controlller交互,所以需要springmvc相关配置文件
1.pom.xml中引入依赖

<dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.20.RELEASE</version>
    </dependency>

导入springmvc.xml配置文件
web.xml中初始化配置文件

<servlet>
    <servlet-name>oa</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>oa</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>

创建controller进行开发者认证

微信开发者工具如何开发公众号页面 公众号开发者中心在哪_微信开发者工具如何开发公众号页面_05

//1.按字典顺序排序
        TreeSet<String> set = new TreeSet<>();
        set.add(TOKEN);
        set.add(timestamp);
        set.add(nonce);

        //2.将三个参数拼接成一个字符串
        StringBuilder builder = new StringBuilder();
        for(String str:set){
            builder.append(str);
        }

        //3.通过SHA1加密
        String str = SHA1.encode(builder.toString());
        if(str.equals(signature)){
            System.out.println("接入成功");
            return echostr;
        }else {
            System.out.println("接入失败");
            return "failed";
        }

返回字符串需加@ResponseBody注解

再次点击提交,提交成功。

三、利用测试号进行测试
点击开发者工具,选择开发平台测试账号,微信扫码即可。

四、接收并回复用户发送的消息

//接收用户发送过来的信息(xml)
    @PostMapping(value="auth",produces = "text/xml;charset=utf-8")
    @ResponseBody
    public String receive(@RequestBody String strXml) throws DocumentException {
        System.out.println(strXml);

        //1.接收消息
        //sax  dom  dom4j
        //把xml数据变成document对象
        Document document = DocumentHelper.parseText(strXml);
        //得到根节点
        Element rootElement = document.getRootElement();
        //得到节点对象
        Element toUserNameElement = rootElement.element("ToUserName");
        Element fromUserNameElement = rootElement.element("FromUserName");
        //得到消息类型对象
        Element msgTypeElement = rootElement.element("MsgType");
        //得到节点中的数据
        String userNameText = toUserNameElement.getText();
        String fromUserNameElementText = fromUserNameElement.getText();
        String msgTypeElementText = msgTypeElement.getText();
        if("event".equals(msgTypeElementText)){
            Element eventElement = rootElement.element("Event");
            String eventType = eventElement.getText();
            if("subscribe".equals(eventType)){
                //关注
                return newsMessage(fromUserNameElementText,userNameText);
            }else {
                //取消关注
                System.out.println("取消了关注");
                return null;
            }
        }

        //2.回复消息
        Element contentElement = rootElement.element("Content");
        String contentElementText = contentElement.getText();

        String responseText = contentElementText+"hh";
        StringBuilder builder = new StringBuilder();
        builder.append("<xml>");
        builder.append("<ToUserName><![CDATA["+fromUserNameElementText+"]]></ToUserName>");
        builder.append("<FromUserName><![CDATA["+userNameText+"]]></FromUserName>");
        builder.append("<CreateTime>"+System.currentTimeMillis()+"</CreateTime>");
        builder.append("<MsgType><![CDATA[text]]></MsgType>");
        builder.append("<Content><![CDATA["+responseText+"]]></Content>");
        builder.append("</xml>");

        System.out.println(builder.toString());
        return builder.toString();