按照官方的示例,是使用“mcrypt_generic”来加密,和“mdecrypt_generic”来解密,通过PHP官方的 文档我们得知,这个函数的使用范围是(PHP 4 >= 4.0.2, PHP 5, PHP 7 < 7.2.0, PECL mcrypt >= 1.0.0),因此,在高于PHP7.1的环境中,我们需要另外找方法来实现,看过微信公众号开发的人都知道,官方的示例是真的超级难理解的。
改写主要是改写官方示例包中的“pkcs7Encoder.php”文件中的“Prpcrypt”类,下面的“encrypt”和“decrypt”方法,改为用“openssl_encrypt”和“openssl_decrypt”来实现。文章源自陈学虎-https://chenxuehu.com/article/2020/02/7556.html
encrypt方法改写为:文章源自陈学虎-https://chenxuehu.com/article/2020/02/7556.html
/** * 对明文进行加密 * @param string $text 需要加密的明文 * @return string 加密后的密文 */ public function encrypt($text, $appid) { try { $random = $this->getRandomStr(); $text = $random . pack("N", strlen($text)) . $text . $appid; $iv = substr($this->key, 0, 16); $pkc_encoder = new PKCS7Encoder; $text = $pkc_encoder->encode($text); $encrypted = openssl_encrypt($text,'AES-256-CBC',$this->key,OPENSSL_ZERO_PADDING,$iv); return array(ErrorCode::$OK, $encrypted); } catch (Exception $e) { //print $e; return array(ErrorCode::$EncryptAESError, null); } }
文章源自陈学虎-https://chenxuehu.com/article/2020/02/7556.html
decrypt方法改写为:文章源自陈学虎-https://chenxuehu.com/article/2020/02/7556.html
/** * 对密文进行解密 * @param string $encrypted 需要解密的密文 * @return string 解密得到的明文 */ public function decrypt($encrypted, $appid) { try { $iv = substr($this->key, 0, 16); $decrypted = openssl_decrypt($encrypted,'AES-256-CBC',$this->key,OPENSSL_ZERO_PADDING,$iv); } catch (Exception $e) { return array(ErrorCode::$DecryptAESError, null); } try { //去除补位字符 $pkc_encoder = new PKCS7Encoder; $result = $pkc_encoder->decode($decrypted); //去除16位随机字符串,网络字节序和AppId if (strlen($result) < 16) 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); }
文章源自陈学虎-https://chenxuehu.com/article/2020/02/7556.html
改写后就完美适配PHP7.1以上的环境了。文章源自陈学虎-https://chenxuehu.com/article/2020/02/7556.html
文章源自陈学虎-https://chenxuehu.com/article/2020/02/7556.html 文章源自陈学虎-https://chenxuehu.com/article/2020/02/7556.html
评论