随着科技水平的发展,java的应用也更加全面化和深度化。越来越多的人开始投入到java的学习当中来,深受其益。今天主要为大家介绍下java微信公众号平台的建立及接口配置的具体操作方法。
一、首先是开发前的准备工作。
先查看微信公众号开发文档,然后在入门指引查看验证消息需要的参数。开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
之后开发者通过检验signature对请求进行校验。如果确认此次GET请求来自微信服务器,原样返回echostr参数内容,那么就是接入生效,成为开发者成功。不然就是接入失败。
加密/校验流程如下:
①将token、timestamp、nonce三个参数进行字典序排序;
② 将三个参数字符串拼接成一个字符串进行sha1加密;
③开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
下面就可以进行开发了:
首先创建一个web工程
springboot项目启动类,代码如下:
package cc.feefox.wechat; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
控制类,代码如下:
package cc.feefox.wechat.main; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; /** * * @Package: cc.feefox.wechat.main * @author: cc * @date: 2020年8月18日 下午12:17:55 */ public class BaseController { protected static final String _CSRF_RANDOM_TOKEN = "_CSRF_RANDOM_TOKEN"; @Autowired private HttpServletRequest request; @Autowired private HttpServletResponse response; public HttpServletRequest getRequest() { return request; } public void setRequest(HttpServletRequest request) { this.request = request; } public HttpServletResponse getResponse() { return response; } public void setResponse(HttpServletResponse response) { this.response = response; } }
package cc.feefox.wechat.main; import java.io.IOException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import cc.feefox.wechat.common.util.SignatureUtil; /** * 微信消息入口 * * @Package: cc.feefox.wechat.main * @author: cc * @date: 2020年8月18日 下午12:18:39 */ @RestController @RequestMapping("/wechat") public class WeChatController extends BaseController { private static final Logger logger = LoggerFactory.getLogger(WeChatController.class); /** * 校验信息是否是从微信服务器发出,处理消息 * * @param request * @param out * @throws IOException */ @RequestMapping(value = "/handler", method = { RequestMethod.GET , RequestMethod.POST }) public void processPost() throws Exception { this.getRequest() .setCharacterEncoding("UTF-8"); this.getResponse() .setCharacterEncoding("UTF-8"); logger.info("开始校验信息是否是从微信服务器发出"); // 签名 String signature = this.getRequest() .getParameter("signature"); // 时间戳 String timestamp = this.getRequest() .getParameter("timestamp"); // 随机数 String nonce = this.getRequest() .getParameter("nonce"); // 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败 if (SignatureUtil.checkSignature(signature, timestamp, nonce)) { // 随机字符串 String echostr = this.getRequest() .getParameter("echostr"); logger.debug("接入成功,echostr {}", echostr); this.getResponse() .getWriter() .write(echostr); } } }
签名验证,代码如下:
package cc.feefox.wechat.common.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import cc.feefox.wechat.common.constant.WechatConstant; /** * 校验签名工具类 * @Package: cc.feefox.wechat.common.util * @author: cc * @date: 2020年8月18日 下午12:17:19 */ public class SignatureUtil { // 此处的token即为微信接口配置填写的签名 private static final String TOKEN = "weixin"; /** * 验证签名 * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { // 1.将token、timestamp、nonce三个参数进行字典序排序 String[] arr = new String[] { TOKEN , timestamp , nonce }; Arrays.sort(arr); // 2. 将三个参数字符串拼接成一个字符串进行sha1加密 StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString() .getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 3.将sha1加密后的字符串可与signature对比,标识该请求来源于微信 Boolean asd = tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; return asd; } /** * 将字节数组转换为十六进制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 将字节转换为十六进制字符串 * * @param mByte * @return */ private static String byteToHexStr(byte mByte) { char[] Digit = { '0' , '1' , '2' , '3' , '4' , '5' , '6' , '7' , '8' , '9' , 'A' , 'B' , 'C' , 'D' , 'E' , 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; return new String(tempArr); } }
二、接下来是接口配置,如图所示:
URL: http://域名:80/wechat/handler 或者是https://域名:443/wechat/handler
TOKEN:weixin 与SignatureUtil类中定义的TOKEN常量一致。
最后是启动服务点击提交。
以上就是关于java微信公众号平台开发,建立及接口配置展示的具体操作流程。想要了解更多java经典实例,敬请关注奇Q工具网。
推荐阅读: