微信小程序与 PHP 7.1 的一点小坑

前段时间写小程序接口,涉及到需要获取微信用户的数据。微信小程序提供了加密数据解密的算法。官方提供了多种编程语言。
file

只是天有不测风云,我当时使用的环境是 PHP 7.1 。加密函数 mcrypt_module_open() 因为过时而被废弃。

微信小程序官方提供的示例代码,PHP 文件夹中,pkcs7Encoder.php 的如下内容:

/**
 * 对密文进行解密
 * 
 * @param string $aesCipher 需要解密的密文
 * @param string $aesIV 解密的初始向量
 * @return string 解密得到的明文
 */
public function decrypt( $aesCipher, $aesIV )
{

    try {

        $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');

        mcrypt_generic_init($module, $this->key, $aesIV);

        //解密
        $decrypted = mdecrypt_generic($module, $aesCipher);
        mcrypt_generic_deinit($module);
        mcrypt_module_close($module);
    } catch (Exception $e) {
        return array(ErrorCode::$IllegalBuffer, null);
    }

    try {
        //去除补位字符
        $pkc_encoder = new PKCS7Encoder;
        $result = $pkc_encoder->decode($decrypted);

    } catch (Exception $e) {
        //print $e;
        return array(ErrorCode::$IllegalBuffer, null);
    }
    return array(0, $result);
}

进行如下替换,即可解决。

/**
* 对密文进行解密
* 
* @param string $aesCipher 需要解密的密文
* @param string $aesIV 解密的初始向量
* @return string 解密得到的明文
*/
public function decrypt($aesCipher, $aesIV)
{
    try {
        //解密
        $decrypted = openssl_decrypt($aesCipher, 'AES-128-CBC', $this->key, OPENSSL_RAW_DATA, $aesIV);
    } catch (\Exception $e) {
        return array($this->IllegalBuffer, null);
    }

    try {
        //去除补位字符
        $pkc_encoder = new PKCS7Encoder;
        $result = $pkc_encoder->decode($decrypted);

    } catch (Exception $e) {
        //print $e;
        return array(ErrorCode::$IllegalBuffer, null);
    }

    return array(0, $result);
}

简单点说就是将第一段 try {} catch ($e) {} 中的 try {} 进行替换,换成可支持的 openssl_decrypt() 即可解决。

参考:PHP7.1 加密函数 mcrypt_module_open() 替换方案

本作品采用《CC 协议》,转载必须注明作者和本文链接
Study hard and make progress every day. Study hard and make progress every day.
本帖由系统于 6年前 自动加精
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 6

我遇到过加密的,openssl_encrypt($string, 'des-ede3', $key, true) 不过确实 openssl少写了好多代码

6年前 评论
mouyong

@fmaple 我当时的需求只用到了解密,加密解密,机相关的,在最后的参考链接里面有我感觉不错的示例。:grimacing:

6年前 评论

不错,感谢分享,之前还没接触的坑。

6年前 评论
mouyong

@yaobaliu :smile:

6年前 评论

非常感谢楼主分享,正好帮上忙。特地注册了个新账号来回复。

6年前 评论

顺利解决这个问题

4年前 评论
mouyong (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!