开发者社区 问答 正文

请求发出 微信没回音? 400 报错

请求发出 微信没回音? 400 报错

@summer 你好,想跟你请教个问题:


注册了一个微信公共号,使用了下“自定义回复”里面的“公众平台消息接口”。按照文档说明,改写为java版本,但是发出请求发出 微信没回音。

您提过post的时候也有传signature参数的,也需要校验。 如何实现的呢,方便的话,帮忙透露一下。

展开
收起
爱吃鱼的程序员 2020-05-31 13:00:44 426 分享 版权
阿里云 AI 助理回答

你好!遇到微信公众号接口调用时返回400错误,通常意味着客户端请求有误,比如参数错误、格式问题或者缺少必要的参数等。对于你提到的“公众平台消息接口”以及需要校验signature参数的情况,这里给你一个大致的处理流程和Java示例代码来帮助你解决这个问题。

校验Signature流程

  1. 获取Token:首先确保你的微信公众号在微信公众平台上设置了正确的Token。
  2. 构造签名:微信服务器在每次请求你的服务器时,会携带四个参数:timestamp(时间戳)、nonce(随机数)、signature(签名)以及echostr(如果是首次验证则会有此参数)。你需要使用这四个参数中的前三个,按照一定规则重新生成签名,并与微信发来的signature进行对比,以验证请求的合法性。

Java实现示例

下面是一个简单的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完成微信接口的接入验证;否则,返回错误信息。

希望这个示例能帮到你解决问题!如果有其他技术细节需要了解,欢迎继续提问。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答标签:
问答地址: