2024国产成人精品免费视频|日本免费一区二区三区毛片|久久97超碰色中文字幕|亚洲天堂a中文字幕

php7.3下使用微信公眾平臺(tái)消息安全模式的加密及解密SDK的坑

2022-03-31 18:35 欄目:技術(shù)開發(fā) 查看(7314)

使用的是較低php版本且沒有使用命名空間的,因此調(diào)用微信官方提供的php版本sdk即可使用。但是使用較高php版本,且使用命名空間后肯定是不能夠直接使用的,需要進(jìn)行相應(yīng)的改造,也就是添加namespace,在引用的時(shí)候自然需要使用use來調(diào)用。需要注意的坑有三點(diǎn):

1、pkcs7Encoder.php中包含兩個(gè)類,需要?jiǎng)冸x兩個(gè)類文件,分別為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擴(kuò)展,而微信官方的SDK剛好使用了mcrypt擴(kuò)展,當(dāng)然這個(gè)擴(kuò)展也是比較常用。所以可以使用openssl_encrypt和來代替openssl_decrypt。

原加密代碼片段:

$random = $this->getRandomStr();
$text = $random . pack("N", strlen($text)) . $text . $appid;
// 網(wǎng)絡(luò)字節(jié)序
$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);
//使用自定義的填充方式對(duì)明文進(jìn)行補(bǔ)位填充
$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);
//使用自定義的填充方式對(duì)明文進(jìn)行補(bǔ)位填充
$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對(duì)需要解密的字符串進(jìn)行解碼
$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源代碼文件修改時(shí)間都是2014年,一直也沒有更新。如果是入門開發(fā)者說不定拿著這么久沒更新的SDK使用,說不定直接放棄了。

與我們的項(xiàng)目經(jīng)理聯(lián)系
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流

轉(zhuǎn)載請(qǐng)注明出處:php7.3下使用微信公眾平臺(tái)消息安全模式的加密及解密SDK的坑 - 微構(gòu)網(wǎng)絡(luò)
分享:
標(biāo)簽:
侯马市| 芷江| 万州区| 建湖县| 岳池县| 徐州市| 阿合奇县| 江津市| 文昌市| 定陶县| 尼玛县| 武穴市| 莲花县| 德清县| 西丰县| 天气| 兰州市| 虞城县| 金溪县| 漳浦县| 财经| 韶山市| 曲沃县| 克东县| 始兴县| 射洪县| 高阳县| 巩留县| 探索| 林西县| 邳州市| 宜宾县| 怀集县| 泰安市| 攀枝花市| 永嘉县| 黄大仙区| 岱山县| 兴业县| 新蔡县| 搜索|