微信退款的回调中有个字段是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加密模块。