使用Servlet搭建微信公众平台后台

这部分其实只有一个技术点,只是对于像我这种菜鸟来说一开始接触有点懵。
首先介绍一下HTTP报文的格式(微信公众平台会向后台发送一个HTTP请求,然后把后台反馈的HTTP响应呈现给用户)。

  • HTTP请求报文

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的一般格式。
这里写图片描述

request.getParameter("");//获得请求头部的数据
InputStream is = request.getInputStream();//获取请求数据

通过微信的开发者手册,我们可以知道,平台发往后台的HTTP请求包含一段XML数据,但是没有提到键值的名称(头部字段名),所以请求是POST请求,这段数据在“请求数据”字段中,所以使用request.getInputStream()获取请求数据。
以下是一段实例代码:

@WebServlet("/MainServlet")
public class MainServlet extends HttpServlet {
    private static final long serialVersionUID = 1571151842377184202L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        this.doPost(request, response);
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        request.getParameter("");
        /** 读取接收到的xml消息 */
        StringBuffer sb = new StringBuffer();
        InputStream is = request.getInputStream();
        InputStreamReader isr = new InputStreamReader(is, "UTF-8");
        BufferedReader br = new BufferedReader(isr);
        String s = "";
        while ((s = br.readLine()) != null) {
            sb.append(s);
        }
        String xml = sb.toString(); // 微信端发送过来的xml数据
        System.out.println(request.getParameterMap());
        System.out.println(xml);
        String result = "";
        /** 判断是否是微信接入激活验证,只有首次接入验证时才会收到echostr参数,此时需要把它直接返回 */
        String echostr = request.getParameter("echostr");
        if (echostr != null && echostr.length() > 1) {
            result = echostr;
        } else {
            // 正常的微信处理流程
            if(!StringUtils.isBlank(xml)){
                result = Processor.processor(xml);
            }
            System.out.println(result);
        }

        try {
            OutputStream os = response.getOutputStream();
            os.write(result.getBytes("UTF-8"));
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

至于Servlet响应的话,输出到页面就行了(当然得按照微信定的规则来)

            OutputStream os = response.getOutputStream();
            os.write(result.getBytes("UTF-8"));
            os.flush();
            os.close();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值