开篇先吐槽一下微信公众号开发官方文档,看的真累
接口配置信息
EncodingAESKey 暂时不需要处理,用于加密解密消息的
- 配置url
这个url用户接收和被动回复用户消息。微信会调用这个url,故需要可以外网访问
-
接口实现
-
查看文档:
-
request请求
-
接口url: GET http://xxxxxx/wxchat/access
-
参数
参数 描述 signature 微信加密签名,signature结合了开发者填写的 token参数和请求中的timestamp参数、nonce参数。 timestamp 时间戳 nonce 随机数 echostr 随机字符串
-
-
-
response
直接返回string
-
-
上代码
// controller层
@GetMapping("/wxchat/access")
public String wxAccess(@RequestParam("signature") String signature,
@RequestParam("timestamp") String timestamp,
@RequestParam("nonce") String nonce,
@RequestParam("echostr") String echostr
){
System.out.println("signature:"+signature);
System.out.println("timestamp:"+timestamp);
System.out.println("nonce:"+nonce);
System.out.println("echostr:"+echostr);
//直接return echostr 也是可以的
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
System.out.println("校验成功!!!!!!!!!!!!!");
return echostr;
}
return "";
}
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* @program: wxchat
* @author: zzg
* @create: 2021-01-20 21:15
*/
public class SignUtil {
// 与接口配置信息中的Token要一致
private static String token = "zzg";
/**
* 验证签名
*
* @param signature
* @param timestamp
* @param nonce
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
System.out.println("--------------");
System.out.println(signature);
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
String tmpStr = null;
try {
tmpStr = sha1(content.toString());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
System.out.println(tmpStr);
System.out.println("-------------------");
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toLowerCase()) : false;
}
/**
* sha1加密
* @param data
* @return
* @throws NoSuchAlgorithmException
*/
public static String sha1(String data) throws NoSuchAlgorithmException {
//信息摘要器 算法名称
MessageDigest md = MessageDigest.getInstance("SHA1");
//把字符串转为字节数组
byte[] b = data.getBytes();
//使用指定的字节来更新我们的摘要
md.update(b);
//获取密文 (完成摘要计算)
byte[] b2 = md.digest();
//获取计算的长度
int len = b2.length;
//16进制字符串
String str = "0123456789abcdef";
//把字符串转为字符串数组
char[] ch = str.toCharArray();
char[] chs = new char[len*2];
//将字节转换为十六进制字符串
for(int i=0,k=0;i<len;i++) {
//获取摘要计算后的字节数组中的每个字节
byte b3 = b2[i];
// >>>:无符号右移
// &:按位与
//0xf:0-15的数字
chs[k++] = ch[(b3 >>> 4) & 0xf];
chs[k++] = ch[b3 & 0xf];
}
//字符数组转为字符串
return new String(chs);
}
}
启动服务,微信开发工具点击提交。
搞定,收工。