PHP7.2下 微信解密方法失效问题

题记

升级到7.2 后,涉及到微信解密的功能时候,会报 mcrypt_module_open() 未定义。查了问题,才发现已经被废弃掉了,被openssl代替了。
参考:https://my.oschina.net/kopa/blog/1786077(网上也有其他的文章,这篇是最准确的解法)

正文

wXBizDataCrypt.php

public function decryptData( $encryptedData, $iv, &$data )
    {
        if (strlen($this->sessionKey) != 24) {
            return ErrorCode::$IllegalAesKey;
        }
        $aesKey=base64_decode($this->sessionKey);

        
        if (strlen($iv) != 24) {
            return ErrorCode::$IllegalIv;
        }
        $aesIV=base64_decode($iv);

        //$aesCipher=base64_decode($encryptedData);
        $aesCipher=$encryptedData;

        $pc = new Prpcrypt($aesKey);
        $result = $pc->decrypt($aesCipher,$aesIV);
        if ($result[0] != 0) {
            return $result[0];
        }
     
        $dataObj=json_decode( $result[1] );
        if( $dataObj  == NULL )
        {
            return ErrorCode::$IllegalBuffer;
        }
        if( $dataObj->watermark->appid != $this->appid )
        {
            return ErrorCode::$IllegalBuffer;
        }
        $data = $dataObj->openGId;
        return ErrorCode::$OK;
    }

PKCS7Encoder.php

public function decrypt( $aesCipher, $aesIV )
    {

        try {
            
//          $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
//
//          mcrypt_generic_init($module, $this->key, $aesIV);
//
//          //解密
//          $decrypted = mdecrypt_generic($module, $aesCipher);
//          mcrypt_generic_deinit($module);
//          mcrypt_module_close($module);
            $decrypted = openssl_decrypt($aesCipher,'AES-128-CBC',$this->key,OPENSSL_ZERO_PADDING,$aesIV);
        } catch (Exception $e) {
            return array(ErrorCode::$IllegalBuffer, null);
        }


        try {
            //去除补位字符
            $pkc_encoder = new PKCS7Encoder;
            $result = $pkc_encoder->decode($decrypted);

        } catch (Exception $e) {
            //print $e;
            return array(ErrorCode::$IllegalBuffer, null);
        }
        return array(0, $result);
    }

结尾

其他文章只说了 PKCS7Encoder.php 部分的处理,并没有讲到要处理 $encryptedData 部分,导致问题无法被实际的解决。

你可能感兴趣的:(PHP7.2下 微信解密方法失效问题)