个人学习注册订阅号就行,把资料尽可能完善,不然开发时权限不够,然后登陆,点击订阅号然后扫码就可以微信关注。
左侧一栏可以做一些操作,当然作为一个程序员还是编码爽,点击“开发”,在“开发者工具”中有开发文档可以研读,在“基本配置“开始正式的开发配置,看图片
url就是微信服务器将消息等传给你的服务器时你的服务器中项目地址,这里不是目录而是地址可以看web.xml中自己接收token的地址,token和项目文件中的token一直即可,其它的有随机生成的,有选择的选择明文即可。这时提交会token验证失败,我用的是ngrok将本地地址(localhost:8080)映射到外网,ngrok显示微信服务器已经发给我的服务器,token验证失败是因为尚未编码,上代码
代码目录
主要代码
String signature = request.getParameter("signature");//接收微信get请求传过来的签名,
String timestamp = request.getParameter("timestamp");//接受的签名与时间戳timestamp,nonce随机数,echpstr随机字符串三个经过字典排序,组成一个字符串,然后进行sha1加密,比较一致标示是来自微信的请求
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
System.out.println("---"+"signature="+signature+"timestamp="+timestamp+"nonce="+nonce+"echostr="+echostr);
if (this.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);//只有你返回参数echostr时,他才会认为你这个接口是通的,才会提交成功
}
out.close();
String timestamp = request.getParameter("timestamp");//接受的签名与时间戳timestamp,nonce随机数,echpstr随机字符串三个经过字典排序,组成一个字符串,然后进行sha1加密,比较一致标示是来自微信的请求
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
System.out.println("---"+"signature="+signature+"timestamp="+timestamp+"nonce="+nonce+"echostr="+echostr);
if (this.checkSignature(signature, timestamp, nonce)) {
out.print(echostr);//只有你返回参数echostr时,他才会认为你这个接口是通的,才会提交成功
}
out.close();
out = null;
public static boolean checkSignature(String signature, String timestamp, String nonce){
String[] arr = new String[]{token, timestamp, nonce};//存入数组中
//字典排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();//将三个字符串依次连接为StringBuilder的一个对象
for(int i = 0; i < arr.length; i++){
content.append(arr[i]);
}
MessageDigest md = null;//java自带的加密类
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
//SHA-1加密
byte[] digest = md.digest(content.toString().getBytes());//对组合后的字符串进行 sha1加密
tmpStr = byteToStr(digest);//将字节转换为字符串
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
content = null;
// 比对 判断
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()): false;
}
String[] arr = new String[]{token, timestamp, nonce};//存入数组中
//字典排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();//将三个字符串依次连接为StringBuilder的一个对象
for(int i = 0; i < arr.length; i++){
content.append(arr[i]);
}
MessageDigest md = null;//java自带的加密类
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
//SHA-1加密
byte[] digest = md.digest(content.toString().getBytes());//对组合后的字符串进行 sha1加密
tmpStr = byteToStr(digest);//将字节转换为字符串
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
content = null;
// 比对 判断
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()): false;
}
private static String byteToStr(byte[] digest) {
// TODO Auto-generated method stub
String strDigest = "";
for(int i = 0; i < digest.length; i++){
strDigest += byteToHexStr(digest[i]);
}
return strDigest;
}
private static String byteToHexStr(byte b) {
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[(b >>> 4) & 0X0F];
tempArr[1] = Digit[b & 0X0F];
String s = new String(tempArr);
return s;
}
注意是servlet的get请求地址写对,token一致,地址是80端口并且能 外网访问就没问题了,token就能验证成功。// TODO Auto-generated method stub
String strDigest = "";
for(int i = 0; i < digest.length; i++){
strDigest += byteToHexStr(digest[i]);
}
return strDigest;
}
private static String byteToHexStr(byte b) {
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[(b >>> 4) & 0X0F];
tempArr[1] = Digit[b & 0X0F];
String s = new String(tempArr);
return s;
}