zoukankan      html  css  js  c++  java
  • 微信第三方平台获取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);
    
    }
  • 相关阅读:
    创建Variant数组
    ASP与存储过程(Stored Procedures)
    FileSystemObject对象成员概要
    Kotlin 朱涛9 委托 代理 懒加载 Delegate
    Kotlin 朱涛 思维4 空安全思维 平台类型 非空断言
    Kotlin 朱涛7 高阶函数 函数类型 Lambda SAM
    Kotlin 朱涛16 协程 生命周期 Job 结构化并发
    Proxy 代理模式 动态代理 cglib MD
    RxJava 设计理念 观察者模式 Observable lambdas MD
    动态图片 Movie androidgifdrawable GifView
  • 原文地址:https://www.cnblogs.com/yuanwanli/p/12616881.html
Copyright © 2011-2022 走看看