风尘之锋 發表於 2019-10-20 17:35:00

Java之微信公众号开发

<p>这次以文本回复作为案例来讲解Java相关得微信公众号开发。</p>
<h2><span id="首先必须要有一个个人微信公众号">首先必须要有一个个人微信公众号</span></h2>
<p>个人微信公众号相关的接口权限有限,不过用于个人学习体验一下足够了,如图:</p>
<p><img src="https://img2018.cnblogs.com/blog/1255290/201910/1255290-20191020173219849-46801322.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;然后进入微信公众后台,点击基本配置,按照如下操作(点击启用,相当于设置请求url为自己后台的):</p>
<p><img src="https://img2018.cnblogs.com/blog/1255290/201910/1255290-20191020173248389-437311798.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>设置服务器URL、令牌、消息加解密密钥(这个可以使用自动生成的):</p>
<p><img src="https://img2018.cnblogs.com/blog/1255290/201910/1255290-20191020173317453-958026109.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>服务器URL至关重要,我在这里设置为我自己的域名http://www.youcongtech.com/wx-api。</p>
<p>这个wx-api就是后面对应的接口(比如我发送某个关键字,返回对应的信息)。<br>token可以设置复杂点。</p>
<h2><span id="效果图">效果图</span></h2>
<p>&nbsp;<img src="https://img2018.cnblogs.com/blog/1255290/201910/1255290-20191020173343342-929877492.png" alt=""></p>
<p>&nbsp;</p>
<p>&nbsp;上面的演示效果来自本人微信公众号,并长期运行稳定没有任何问题</p>
<h2><span id="后台接口代码">后台路由代码</span></h2>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">package com.blog.springboot.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.blog.springboot.wx.service.WxService;
import com.blog.springboot.wx.util.SignUtil;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
</span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
* 微信公众号API
* @author youcong
* @date 2019-6-02
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@RestController
@RequestMapping(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/wx_public_api</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
@Api(tags </span>= { <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">微信公众号api</span><span style="color: rgba(128, 0, 0, 1)">"</span> }, description = <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">微信公众号api</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> WxPublicApiController extends AbstractController{

    @Autowired
    </span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> WxService wxService;
   
   
       </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
      * 微信公众平台服务器配置验证
      * @param request
      * @param response
      </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
       @GetMapping
       @ApiOperation(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">微信公众平台服务器配置验证</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
       </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> validate(HttpServletRequest request, HttpServletResponse response) {
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。</span>
            String signature = request.getParameter(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">signature</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 时间戳</span>
            String timestamp = request.getParameter(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">timestamp</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 随机数</span>
            String nonce = request.getParameter(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">nonce</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 随机字符串</span>
            String echostr = request.getParameter(<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">echostr</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

            PrintWriter </span><span style="color: rgba(0, 0, 255, 1)">out</span> = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">out</span> =<span style="color: rgba(0, 0, 0, 1)"> response.getWriter();
                </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 通过检验signature对请求进行校验,若校验成功则原样返回echostr,否则接入失败</span>
                <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (SignUtil.checkSignature(signature, timestamp, nonce)) {
                  </span><span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)">.print(echostr);
                }
            } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e) {
                e.printStackTrace();
                logger.error(e.getMessage());
               
            } </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
               
                </span><span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)">.close();
                </span><span style="color: rgba(0, 0, 255, 1)">out</span> = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }

   </span><span style="color: rgba(0, 128, 0, 1)">/*</span><span style="color: rgba(0, 128, 0, 1)">*
      * 关注推送消息
      * @param request
      * @param response
      </span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
   @PostMapping
   @ApiOperation(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">关注推送消息</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
   </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> about(HttpServletRequest request, HttpServletResponse response) {
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                request.setCharacterEncoding(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">UTF-8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);
            } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (UnsupportedEncodingException e) {
                e.printStackTrace();
                logger.error(e.getMessage(),e);
            }
            response.setContentType(</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">text/html;charset=UTF-8</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 调用核心业务类接收消息、处理消息</span>
            String respMessage =<span style="color: rgba(0, 0, 0, 1)"> wxService.newMessageRequest(request);

            </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 响应消息</span>
            PrintWriter <span style="color: rgba(0, 0, 255, 1)">out</span> = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">out</span> =<span style="color: rgba(0, 0, 0, 1)"> response.getWriter();
                </span><span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)">.print(respMessage);
            } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e) {
                e.printStackTrace();
                logger.error(e.getMessage(),e);
            } </span><span style="color: rgba(0, 0, 255, 1)">finally</span><span style="color: rgba(0, 0, 0, 1)"> {
                </span><span style="color: rgba(0, 0, 255, 1)">out</span><span style="color: rgba(0, 0, 0, 1)">.close();
                </span><span style="color: rgba(0, 0, 255, 1)">out</span> = <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }
}</span></pre>
</div>
<h2><span id="完整代码">完整代码</span></h2>
<p>完整代码已经放到我个人的GitHub仓库,地址为:https://github.com/developers-youcong/blog-springcloud-pro/tree/master/blog-wx-client</p>
<p>这是其中的子项目,功能主要是微信公众平台。</p>
<p>鉴于我个人主要维护的开源项目尚未公开,有很多隐私信息等,所以将其中的微信公众号模块抽取出来放到我的新开源项目blog-springcloud-pro中(此项目目前处于开发中)。</p>
<p>微信公众号模块基本上换上自己的token、appid、appsecret并部署到线上就基本可用了。有任何问题,可留言。</p>
<p>&nbsp;</p><br><br>
来源:https://www.cnblogs.com/youcong/p/11708266.html
頁: [1]
查看完整版本: Java之微信公众号开发