微信公众号基本服务器地址(URL)配置Token认证教程(java版)
解决方法:
1.在基本服务器地址(URL)中配置外网可以访问的回调地址,如果你的系统还在测试阶段没上线,可以通过natapp工具生成一个临时域名测试,请参考:http://www.yayihouse.com/yayishuwu/chapter/1877
2.Token随意填一个,不能让别人知道,这个token等会要用在回调地址方法中进行签名认证。
3.假如我的回调地址是http://7ap932.natappfree.cc/open/wx/callback,那具体代码实现如下,复制就能用。
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5','6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
@RequestMapping("open/wx/callback")
public String callBack(HttpServletResponse response, HttpServletRequest request,String signature,String timestamp,String nonce,String echostr) throws IOException {
try {
String[] arr = new String[]{"你微信公众号后台配置的Token", timestamp, nonce};
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]);
}
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
messageDigest.update(sb.toString().getBytes());
String sign = getFormattedText(messageDigest.digest());
if (sign.equals(signature)) {
return echostr;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
// 把密文转换成十六进制的字符串形式
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}