咳咳,间隔了这么久,现在终于有时间继续了。废话不多说,接上篇微信公众号开发引言。
说明:博主使用的开发工具为IntelliJ IDEA,开发语言为JAVA。 环境搭建部分就不在这里多说什么了。使用IDEA创建一个SpringBoot项目,之后我们就进入开发阶段吧~1.修改公众号的服务器配置
URL处填写能从公网访问到你本机的一个地址,博主在这里选用的是花生壳内网穿透版,但是由于最近实名认证,博主还没有来得及认证[因为博主的花生壳是14年就购置的,好久不用了。在最近才知道要认证]。具体使用方式,博主过些日子认证一下在介绍吧。反正很容易的~ Token处填写的是自定义字符串,不过要注意!!!此处填写的Token一定要和程序中所设置的一样!此处博主写的是“DeveloperHome”。 然后不要点提交~因为此时提交是肯定会说Token验证失败的~~接下来请看:
2.验证消息来自微信服务器
首先,从官网的文档中可以看到,验证大约分为三个步骤。
将token,timestamp,nonce三个参数进行字典排序。
将三个参数字符串拼接成一个字符串进行SHA-1加密。
使用加密后提到的字符串与参数中的signature进行对比。
若能确认此GET请求来自微信服务器,则原样返回echor参数内容。
步骤知道了,现在就开始撸代码吧。
在项目中添加一个类ValidateWeChat
ValidateWeChat.java代码
package org.yyx.study.wechat.util; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.yyx.study.config.WeChatConfig; import javax.annotation.Resource; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; /** * 验证工具类 * Created by 叶云轩 on 2017/6/20-11:50 * Concat ycountjavaxuan@outlook.com */ @Component public class ValidateWeChat { private Logger logger = LoggerFactory.getLogger(ValidateWeChat.class); /** * 1)将token、timestamp、nonce三个参数进行字典序排序 * 2)将三个参数字符串拼接成一个字符串进行sha1加密 * 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 */ @Resource private WeChatConfig weChatConfig; /** * 对参数进行排序与加密 * * @param timestamp 时间戳 * @param nonce 随机字符串 */ private String sortParams(String timestamp, String nonce) { logger.info("排序...."); String[] array = new String[]{weChatConfig.getDeafultAccessToken(), timestamp, nonce}; StringBuffer sb = new StringBuffer(); // 字符串排序 Arrays.sort(array); for (int i = 0, length = array.length; i < length; i++) { sb.append(array[i]); } String sortString = sb.toString(); try { MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(sortString.getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } logger.info("排序完成..."); return hexstr.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return null; } public boolean validate(String signature, String timestamp, String nonce) { String s = sortParams(timestamp, nonce); return signature.equals(s); } }之后呢,在controller包中创建一个类,用于验证消息.
AccessEntrance.java代码