微信小程序与 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.
本帖由系统于 7年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6

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

7年前 评论
mouyong

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

7年前 评论

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

7年前 评论
mouyong

@yaobaliu :smile:

7年前 评论

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

7年前 评论

顺利解决这个问题

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

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
打杂的 @ 某某医学
文章
35
粉丝
63
喜欢
328
收藏
113
排名:37
访问:19.1 万
私信
所有博文
社区赞助商