问题:微信公众号配置URL 请求URL超时
思路:这个可能是我们使用的ip地址是内网的地址, 我在家使用的是路由器提供的ip地址,那这个地址是内网的。总是不能让微信通过域名把信息反给我们。
解决: 通过natapp这个软件,我们可以得到一个免费的映射。
地址:https://natapp.cn/#download
下载软件按照官网文档操作
mac启动后会出现界面,使用出现的域名作为微信公众号配置的地址,然后加上自己的方法就可以。
微信配置
剩下的就是我们的controller中,主要注意点
1,返回的是字符串
2,返回的是微信给我门的echostr字符串,验证方式可以到微信官网获取
地址:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html
https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Message_Encryption/Message_encryption_and_decryption.html
上边两个地址都可以找到下载的代码,只是比较不好找, [官网上给出的demo,我这里总是出问题,不知道怎么调试。就往上找了一个,贴到下边了]
如果不验真,直接返回微信给的echostr就可以
@ResponseBody
@RequestMapping("verify")
public String verifyUrl(String signature, String timestamp, String nonce, String echostr)
{
final boolean b = WeixinCheckoutUtil.checkSignature(signature, timestamp, nonce);
if(b)
{
return echostr;
}
return "0";
}
public classWeixinCheckoutUtil {//与接口配置信息中的Token要一致
private static String token = "ddrsgz";/*** 验证签名
*
*@paramsignature
*@paramtimestamp
*@paramnonce
*@return
*/
public static booleancheckSignature(String signature, String timestamp, String nonce) {
String[] arr= newString[] { token, timestamp, nonce };//将token、timestamp、nonce三个参数进行字典序排序//Arrays.sort(arr);
sort(arr);
StringBuilder content= newStringBuilder();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;//将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}/*** 将字节数组转换为十六进制字符串
*
*@parambyteArray
*@return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest= "";for (int i = 0; i < byteArray.length; i++) {
strDigest+=byteToHexStr(byteArray[i]);
}returnstrDigest;
}/*** 将字节转换为十六进制字符串
*
*@parammByte
*@return
*/
private static String byteToHexStr(bytemByte) {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];
String s= newString(tempArr);returns;
}public static voidsort(String a[]) {for (int i = 0; i < a.length - 1; i++) {for (int j = i + 1; j < a.length; j++) {if (a[j].compareTo(a[i]) < 0) {
String temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}public static voidmain(String[] args)
{
String verifyMsgSig= "70023ded8e972680e8506161043feaeb1ae6d7c8";
String timeStamp= "1609253670";
String nonce= "584987070";
String echoStr= "160542013663168510";final boolean b =checkSignature(verifyMsgSig, timeStamp, nonce);
System.out.println(b);
}
}