php5.6 微信退款回撥處理(AES-256-ECB+PKCS7Padding)
阿新 • • 發佈:2018-11-06
微信退款的回撥中有個欄位是req_info。該欄位微信官方給的解密方法是:
解密步驟如下:
(1)對加密串A做base64解碼,得到加密串B
(2)對商戶key做md5,得到32位小寫key* ( key設定路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設定-->API安全-->金鑰設定 )
(3)用key*對加密串B做AES-256-ECB解密(PKCS7Padding)
解密方法如下:
WxEncrypt.php:
<?php /** * 微信退款回撥引數解密類 * User Demo * Data 2018-07-18 */ namespace App\Services\Payment\wxpay; use Exception; class WxEncrypt { //解密祕鑰,預設應該為使用者的祕鑰key private $key = ''; //加密的串 private $encStr = ""; public function __construct($str, $key) { if (empty($str) || empty($key)) { throw new Exception('解密引數錯誤!'); } $this->encStr = base64_decode($str); $this->key = md5($key); } /** * 獲取解密的串 */ public function getDecStr() { return $this->decrypt($this->encStr); } /** * 對密文進行解密 * @param string $encrypted 需要解密的密文 * @return string 解密得到的明文 */ public function decrypt($encrypted) { $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->key, $this->encStr, MCRYPT_MODE_ECB); $block = mcrypt_get_block_size('rijndael_128', 'ecb'); $pad = ord($str[($len = strlen($str)) - 1]); $len = strlen($str); $pad = ord($str[$len - 1]); return substr($str, 0, strlen($str) - $pad); } /** * xml 轉換成陣列 * @param string $xml * @return array */ function xmlToArray($xml) { $xmlObj = simplexml_load_string( $xml, 'SimpleXMLIterator', //可迭代物件 LIBXML_NOCDATA ); $arr = []; $xmlObj->rewind(); //指標指向第一個元素 while (1) { if( ! is_object($xmlObj->current()) ) { break; } $arr[$xmlObj->key()] = $xmlObj->current()->__toString(); $xmlObj->next(); //指向下一個元素 } return $arr; } }
使用方法如下:
use App\Services\Payment\wxpay\WxEncrypt;
$obj = new WxEncrypt($req_info, $mch_key);//傳入的第一個引數是req_info,第二個引數是商戶key
$dec_xml = $obj->getDecStr();//此處獲取的就是解密後的xml.
$dec_arr = $obj->xmlToArray($dec_xml); //此處獲取的是xml解析成的陣列。
此處需要注意的是使用該解密類需要php中有mcrypt加密模組。