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);
    
    }
  • 相关阅读:
    Yaf 在 Nginx 中的配置
    关于 GPG 用这个 就够 了
    PHP 服务器端处理跨域问题
    Linux 终端代理方式
    【转载】Oracle数据字典详解
    【转载】Oracle之内存结构(SGA、PGA)
    【转载】 使用rman进行坏块修复(ORA-01578、ORA-01110)
    【转载】使用Exp和Expdp导出数据的性能对比与优化
    【转载】oracle dbms_metadata.get_ddl的使用方法总结
    ORACLE执行详解
  • 原文地址:https://www.cnblogs.com/yuanwanli/p/12616881.html
Copyright © 2011-2022 走看看