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> </p>
<p> 然后进入微信公众后台,点击基本配置,按照如下操作(点击启用,相当于设置请求url为自己后台的):</p>
<p><img src="https://img2018.cnblogs.com/blog/1255290/201910/1255290-20191020173248389-437311798.png" alt=""></p>
<p> </p>
<p> </p>
<p>设置服务器URL、令牌、消息加解密密钥(这个可以使用自动生成的):</p>
<p><img src="https://img2018.cnblogs.com/blog/1255290/201910/1255290-20191020173317453-958026109.png" alt=""></p>
<p> </p>
<p> </p>
<p>服务器URL至关重要,我在这里设置为我自己的域名http://www.youcongtech.com/wx-api。</p>
<p>这个wx-api就是后面对应的接口(比如我发送某个关键字,返回对应的信息)。<br>token可以设置复杂点。</p>
<h2><span id="效果图">效果图</span></h2>
<p> <img src="https://img2018.cnblogs.com/blog/1255290/201910/1255290-20191020173343342-929877492.png" alt=""></p>
<p> </p>
<p> 上面的演示效果来自本人微信公众号,并长期运行稳定没有任何问题</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> </p><br><br>
来源:https://www.cnblogs.com/youcong/p/11708266.html
頁:
[1]