请求发出 微信没回音? 400 报错
@summer 你好,想跟你请教个问题:
注册了一个微信公共号,使用了下“自定义回复”里面的“公众平台消息接口”。按照文档说明,改写为java版本,但是发出请求发出 微信没回音。
您提过post的时候也有传signature参数的,也需要校验。 如何实现的呢,方便的话,帮忙透露一下。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
你好!遇到微信公众号接口调用时返回400错误,通常意味着客户端请求有误,比如参数错误、格式问题或者缺少必要的参数等。对于你提到的“公众平台消息接口”以及需要校验signature
参数的情况,这里给你一个大致的处理流程和Java示例代码来帮助你解决这个问题。
timestamp
(时间戳)、nonce
(随机数)、signature
(签名)以及echostr
(如果是首次验证则会有此参数)。你需要使用这四个参数中的前三个,按照一定规则重新生成签名,并与微信发来的signature
进行对比,以验证请求的合法性。下面是一个简单的Java示例,展示如何校验Signature:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class WechatUtil {
public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {
// 将token、timestamp、nonce三个参数进行字典序排序
String[] arr = new String[]{token, timestamp, nonce};
Arrays.sort(arr);
// 将排序后的字符串拼接成一个字符串进行sha1加密
StringBuilder content = new StringBuilder();
for (String s : arr) {
content.append(s);
}
MessageDigest md = null;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
// 将sha1加密后的字符串与signature进行比较
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
}
private static String byteToStr(byte[] byteArray) {
StringBuilder strDigest = new StringBuilder();
for (byte b : byteArray) {
strDigest.append(byteToHexStr(b));
}
return strDigest.toString();
}
private static String byteToHexStr(byte mByte) {
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];
return new String(tempArr);
}
}
在你的接收微信请求的Controller或Servlet中,你可以这样使用上述工具类来校验Signature:
@RequestMapping(value = "wechat", method = RequestMethod.GET)
public void wechatGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
if (WechatUtil.checkSignature("YOUR_TOKEN", signature, timestamp, nonce)) {
// 验证成功,原样返回echostr
response.getWriter().write(echostr);
} else {
// 验证失败,响应错误信息
response.getWriter().write("Error: Signature verification failed.");
}
}
请将"YOUR_TOKEN"
替换为你在微信公众平台设置的实际Token值。这段代码首先会校验请求的合法性,如果通过,则原样返回echostr
完成微信接口的接入验证;否则,返回错误信息。
希望这个示例能帮到你解决问题!如果有其他技术细节需要了解,欢迎继续提问。