“ /** * 验证企业微信服务器地址 */ @RequestMapping(value = "/toWx", method = RequestMethod.GET,produces = "text/plain;charset=utf-8") public String authGet( @RequestParam(name = "msg_signature") String signature, @RequestParam(name = "timestamp") String timestamp, @RequestParam(name = "nonce") String nonce, @RequestParam(name = "echostr") String echostr) { logger.info("收到验证请求:signature={}, timestamp={}, nonce={}, echostr={}", signature, timestamp, nonce, echostr); try { // 从配置中获取 WxCpConfigStorage 对象 WxCpConfigStorage config = wxCpService.getWxCpConfigStorage(); // 正确构造 WxCpCryptUtil(传入 WxCpConfigStorage) WxCpCryptUtil cryptUtil = new WxCpCryptUtil(config); // 解密 echostr(直接传入 echostr,SDK 内部会自动处理签名验证) String plainText = cryptUtil.decrypt(echostr); return plainText; } catch (Exception e) { logger.error("验证失败: {}", e.getMessage()); return "非法请求"; } }”在企业微信进行“接收消息服务器配置”时虽然请求进入了后台的这个代码,但是返回的内容没有通过企业微信的校验,请进行修改并返回给我完整的代码,我估计是缺少加解密的过程。
时间: 2025-03-31 15:13:33 浏览: 33
<think>嗯,用户的问题是关于企业微信接收消息服务器配置时遇到的校验失败问题,需要正确的加解密实现和完整代码示例。首先,我需要回顾企业微信的加解密流程。根据引用[2],配置回调URL时,加密解密错误可能涉及两个错误码表,这可能意味着需要正确处理加解密库和验证参数。
企业微信使用AES加密,需要处理URL验证中的EchoStr参数。用户需要先验证消息的确来自企业微信服务器,这涉及到签名验证和解密EchoStr。签名由msg_signature、timestamp、nonce和加密的echostr组成,必须正确计算SHA1哈希来比对。
然后,解密EchoStr需要使用AES密钥。这里需要注意,企业微信的AES密钥是Base64编码的,需要正确解码。解密过程中可能会有填充问题,比如PKCS#7的处理,需要确保解密后的数据去除了填充并提取出XML中的echostr内容。
接下来是代码示例。用户需要PHP的实现,所以得提供PHP代码。首先,验证签名,生成四个参数的数组,排序后拼接并计算SHA1。然后解密EchoStr,使用AES-256-CBC模式,注意IV是密钥的前16字节。解密后需要处理可能的XML格式,提取echostr。
在返回时,如果验证成功,直接输出解密后的echostr;否则返回错误。需要确保代码中的参数如Token、EncodingAESKey和CorpId正确替换。同时,要注意引用[2]提到的错误处理,比如URL校验失败可能因为签名错误或解密失败,需要检查各个步骤是否正确。
可能的相关问题包括如何获取EncodingAESKey,如何处理其他消息类型,以及如何优化加解密性能。用户可能还会遇到网络超时或参数错误,需要参考企业微信的文档和错误码表进行排查。</think>### 企业微信消息加解密实现步骤
#### 一、核心参数准备
1. **Token**:企业微信后台配置的明文校验令牌
2. **EncodingAESKey**:43位Base64编码的AES密钥(需转换为256位)
3. **CorpId**:企业微信的唯一标识
#### 二、加解密流程实现
```php
<?php
class WXBizMsgCrypt {
private $m_token;
private $m_encodingAesKey;
private $m_corpId;
public function __construct($token, $encodingAesKey, $corpId) {
$this->m_token = $token;
$this->m_encodingAesKey = base64_decode($encodingAesKey . "=");
$this->m_corpId = $corpId;
}
// 验证URL有效性(核心方法)
public function verifyURL($msgSignature, $timestamp, $nonce, $echostr, &$sEchoStr) {
// 1. 验证签名
$signature = $this->getSHA1($this->m_token, $timestamp, $nonce, $echostr);
if ($signature != $msgSignature) {
return -40001; // 签名验证失败[^2]
}
// 2. 解密echostr
$result = $this->decrypt($echostr, $this->m_corpId);
if ($result[0] != 0) {
return $result[0];
}
$sEchoStr = $result[1];
return 0;
}
private function getSHA1($token, $timestamp, $nonce, $encrypt_msg) {
$array = array($encrypt_msg, $token, $timestamp, $nonce);
sort($array, SORT_STRING);
$str = implode($array);
return sha1($str);
}
private function decrypt($encrypted, $corpId) {
$aesKey = $this->m_encodingAesKey;
$iv = substr($aesKey, 0, 16);
$decrypted = openssl_decrypt(
base64_decode($encrypted),
'AES-256-CBC',
$aesKey,
OPENSSL_RAW_DATA,
$iv
);
// 移除填充并解析XML
$pad = ord(substr($decrypted, -1));
$content = substr($decrypted, 0, -$pad);
$xml = simplexml_load_string($content);
if ($xml->CorpId != $corpId) {
return array(-40005, ''); // CorpID校验失败[^2]
}
return array(0, $xml->echostr);
}
}
// 使用示例
$token = "your_token";
$encodingAesKey = "your_encodingaeskey";
$corpId = "your_corpid";
$wxcpt = new WXBizMsgCrypt($token, $encodingAesKey, $corpId);
$sVerifyMsgSig = $_GET["msg_signature"];
$sVerifyTimeStamp = $_GET["timestamp"];
$sVerifyNonce = $_GET["nonce"];
$sVerifyEchoStr = $_GET["echostr"];
$errCode = $wxcpt->verifyURL($sVerifyMsgSig, $sVerifyTimeStamp, $sVerifyNonce, $sVerifyEchoStr, $sEchoStr);
if ($errCode == 0) {
echo $sEchoStr; // 返回明文校验结果[^2]
} else {
echo "ERR: " . $errCode;
}
?>
```
#### 三、关键验证点说明
1. **签名验证**:通过$token、$timestamp、$nonce生成的SHA1签名必须与msg_signature一致
2. **AES解密**:
- 使用`AES-256-CBC`模式,IV取AES密钥前16字节
- 解密后需处理PKCS#7填充
- 必须校验XML中的CorpId字段[^3]
3. **返回值**:验证成功需返回解密后的明文echostr
#### 四、常见错误处理
- **-40001(签名错误)**:检查Token配置和参数顺序
- **-40005(CorpId不匹配)**:检查企业ID配置
- **-40007(AES密钥非法)**:确认EncodingAESKey格式正确
阅读全文
相关推荐

















