在PHP7.2及以上环境中,实现微信公众号消息加密解密

老虎说测试 脚本开发字数 1619阅读5分23秒阅读模式
摘要按照官方的示例,是使用“mcrypt_generic”来加密,和“mdecrypt_generic”来解密,通过PHP官方的 文档我们得知,这个函数的使用范围是(PHP 4 >= ...

按照官方的示例,是使用“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

 
  • 版权声明:本文为原创文章,转载请附上原文出处链接及本声明。
  • 转载请注明:在PHP7.2及以上环境中,实现微信公众号消息加密解密 | https://chenxuehu.com/article/2020/02/7556.html