php7.3下使用微信公众平台消息安全模式的加密及解密SDK的坑

2022-03-31 18:35 栏目:技术开发 查看(5250)

使用的是较低php版本且没有使用命名空间的,因此调用微信官方提供的php版本sdk即可使用。但是使用较高php版本,且使用命名空间后肯定是不能够直接使用的,需要进行相应的改造,也就是添加namespace,在引用的时候自然需要使用use来调用。需要注意的坑有三点:

1、pkcs7Encoder.php中包含两个类,需要剥离两个类文件,分别为PKCS7Encoder和Prpcrypt。

2、XMLParse使用的DOMDocument类,由于使用了namespace,因此不能直接new。而需要先use DOMDocument,然后new \DOMDocument()。也可以使用simplexml_load_string代替。

原解析xml代码段:

$xml = new DOMDocument();
$xml->loadXML($xmltext);
$array_e = $xml->getElementsByTagName('Encrypt');
$array_a = $xml->getElementsByTagName('ToUserName');
$encrypt = $array_e->item(0)->nodeValue;
$tousername = $array_a->item(0)->nodeValue;

需修改为:

$array=$json_decode(json_encode(simplexml_load_string($xmltext, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
$encrypt=$array['Encrypt'];
$tousername=$array['ToUserName'];

3、由于php7.1+废弃了mcrypt扩展,而微信官方的SDK刚好使用了mcrypt扩展,当然这个扩展也是比较常用。所以可以使用openssl_encrypt和来代替openssl_decrypt。

原加密代码片段:

$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);

需修改为:

$random = $this->getRandomStr();
$text = $random . pack("N", strlen($text)) . $text . $appid;
$iv = substr($this->key, 0, 16);
//使用自定义的填充方式对明文进行补位填充
$pkc_encoder = new PKCS7Encoder;
$text = $pkc_encoder->encode($text);
$encrypted = openssl_encrypt($text,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$iv);

原解密代码片段:

//使用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);

需修改为:

$iv = substr($this->key, 0, 16);
$decrypted=openssl_decrypt($encrypted,'AES-256-CBC',substr($this->key, 0, 32),OPENSSL_ZERO_PADDING,$iv);

这里不得不吐槽一下微信官方文档和SDK,文档如果没有SDK还真不太容易一次性理解完整,而SDK似乎是好多年前写的,看SDK源代码文件修改时间都是2014年,一直也没有更新。如果是入门开发者说不定拿着这么久没更新的SDK使用,说不定直接放弃了。

与我们的项目经理联系
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流

转载请注明出处:php7.3下使用微信公众平台消息安全模式的加密及解密SDK的坑 - 微构网络
分享: