### 1、问题
微信开发小程序消息加解密,官方给出的dome中使用正常,最近升级了7.1发现接收消息不能解密了,最后查了日志又查了各种资料发现Mcrypt函数php7.1开始已经被废弃;
2、解决方式
- 在
Prpcrypt类中使用openssl代替Mcrypt - 官方代码:
/**
*对密文进行解密
*@param string $encrypted 需要解密的密文
*@return string 解密得到的明文
*/
public function decrypt($encrypted,$appid){
try{
//使用BASE64对需要解密的字符串进行解码
$ciphertext_dec=base64_decode($encrypted);
$module=mcrypt_module_open(MCRYPT_RIJNDAEL_128,'',MCRYPT_MODE_CBC,'');
$iv=substr($this->key,0,16);
mcrypt_generic_init($module,$this->key,$iv);
//解密
$decrypted=mdecrypt_generic($module,$ciphertext_dec);
mcrypt_generic_deinit($module);
mcrypt_module_close($module);
}
catch(Exception$e)
{
return array(ErrorCode::$DecryptAESError,null);
}
try
{
//去除补位字符
$pkc_encoder=new PKCS7Encoder;
$result=$pkc_encoder->decode($decrypted);
//去除16位随机字符串,网络字节序和AppId
if(strlen($result))
return "";
$content=substr($result,16,strlen($result));
$len_list=unpack("N",substr($content,0,4));
$xml_len=$len_list[1];
$xml_content=substr($content,4,$xml_len);
$from_appid=substr($content,$xml_len+4);
}catch(Exception $e){
//print $e;
return array(ErrorCode::$IllegalBuffer,null);
}
if($from_appid!=$appid)
return array(ErrorCode::$ValidateAppidError,null);
return array(0,$xml_content);
}
/**
*修改之后代码:
*对密文进行解密
*@param string $encrypted 需要解密的密文
*@return string 解密得到的明文
*/
public function decrypt($encrypted,$appid){
try{
$iv=substr($this->key,0,16);
$decrypted=openssl_decrypt(base64_decode($encrypted),'AES-256-CBC',$this->key,OPENSSL_RAW_DATA,$iv);
}catch(Exception $e){
return array(ErrorCode::$DecryptAESError,null);
}
try{
//去除补位字符
$pkc_encoder=new PKCS7Encoder;
$result=$pkc_encoder->decode($decrypted);
//去除16位随机字符串,网络字节序和AppId
if(strlen($result))
return "";
$content=substr($result,16,strlen($result));
$len_list=unpack("N",substr($content,0,4));
$xml_len=$len_list[1];
$xml_content=substr($content,4,$xml_len);
$from_appid=substr($content,$xml_len+4);
}catch(Exception $e){
//print $e;
return array(ErrorCode::$IllegalBuffer,null);
}
if($from_appid!=$appid)
return array(ErrorCode::$ValidateAppidError,null);
return array(0,$xml_content);
}