掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
使用的是較低php版本且沒有使用命名空間的,因此調(diào)用微信官方提供的php版本sdk即可使用。但是使用較高php版本,且使用命名空間后肯定是不能夠直接使用的,需要進(jìn)行相應(yīng)的改造,也就是添加namespace,在引用的時候自然需要使用use來調(diào)用。需要注意的坑有三點(diǎn):
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擴(kuò)展,而微信官方的SDK剛好使用了mcrypt擴(kuò)展,當(dāng)然這個擴(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); //使用自定義的填充方式對明文進(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); //使用自定義的填充方式對明文進(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對需要解密的字符串進(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源代碼文件修改時間都是2014年,一直也沒有更新。如果是入門開發(fā)者說不定拿著這么久沒更新的SDK使用,說不定直接放棄了。
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流