• 微信第三方平台获取ticket报错解决方法(PHP)


    问题:
    微信开发小程序消息加解密,官方给出的dome中使用正常,最近项目的PHP版本升级到了7.1发现接收消息不能解密了,最后查了日志又查了各种资料发现 Mcrypt 函数php7.1已经被废弃; 
    解决方法:
    在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) < 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);
    
    }

    修改之后代码:

    /**
    * 对密文进行解密
    * @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) < 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);
    
    }
  • 相关阅读:
    函数的参数设置
    定义函数
    使用dict和set
    (转)set集合的应用
    循环与range
    if语句
    How to use git hub
    Install pyodbc in OpenSUSE
    Ubuntu编译安装PHP7
    Ubuntu为已经安装的PHP7单独编译mysqli
  • 原文地址:https://www.cnblogs.com/yuanwanli/p/12616881.html
Copyright © 2020-2023  润新知