qustdjx 2015-10-16 19:17:43 5782次浏览 2条回复 0 0 0

因为要做微信开放平台的开发,微信开放平台提供了一个PHP 的加解密demo,我使用时在不使用YII2 的情况下,是不报错的,但放到YII2 上程序运行如下,

PHP Warning – yii\base\ErrorException

mcrypt_generic_init(): Key size is 0

  1. in D:\phpStudy\WWW\basic\web\msgcrypt\pkcs7Encoder.php at line 87 78798081828384858687888990919293949596 $random = $this->getRandomStr();

         $text = $random . pack("N", strlen($text)) . $text . $appid;
         // 网络字节序
         $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
         $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
         $iv = substr($this->key, 0, 16);
         //使用自定义的填充方式对明文进行补位填充
         $pkc_encoder = new PKCS7Encoder;
         $text = $pkc_encoder->encode($text);
         mcrypt_generic_init($module, $this->key, $iv);
         //加密
         $encrypted = mcrypt_generic($module, $text);
         mcrypt_generic_deinit($module);
         mcrypt_module_close($module);
    
         //print(base64_encode($encrypted));
         //使用BASE64对加密后的字符串进行编码
         return array(ErrorCode::$OK, base64_encode($encrypted));
     } catch (Exception $e) 
    

求各位大侠指点,有没人遇到过

  • 回复于 2016-02-05 13:11 举报

    解决方案如下:

    (关键)

    示例代码中,加密解密类的实例创见通过 Class 同名方法 的方式创建。

    public function WXBizMsgCrypt($token, $encodingAesKey, $appId)
    {
    $this->token = $token;
    $this->encodingAesKey = $encodingAesKey;
    $this->appId = $appId;
    }

    在YII或者laravel中,对Class类的实例构建需要通过构造函数 __construct()创建。

    public function __construct($token, $encodingAesKey, $appId)
    {
    $this->token = $token;
    $this->encodingAesKey = $encodingAesKey;
    $this->appId = $appId;
    }

    不止一处,其他用到的子类也有这个现象,挨个改改吧。

    (建议) 示例代码中,使用的是include_once加载,更新成namespace ... use 的方式会更合理;
    (补充) 示例代码中,pkcs7Encoder这个文件中包含了两个Class,如果真正使用,建议拆分成俩文件……

    , 觉得很赞
  • 回复于 2016-11-24 20:02 举报

    我也遇到了这个问题,按这方法果然解决了,3Q分享

您需要登录后才可以回复。登录 | 立即注册