微信的退款结果回调,数据是加密的。我们需要解密之后才能得到订单信息和结果信息,进行处理。
再次吐槽微信,官方demo都藏得贼吉尔深,一般人没有点狗屎运都找不到。
说不多说上代码(其实在以前我这一种已经写过文章了)。
传送门 –> http://www.yancoo.cn/index/article/show/id/33.html
/**
* 退款解密
* @param array $data
* @return bool|string
*/
public function decryption($data = array())
{
$encryption = base64_decode($data['req_info']);
$key = md5($data['key']);
$str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $encryption, 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);
}
使用方式也很简单
$data = [
'req_info' => $xml['req_info'], // 退款回调xml中的req_info
'key' => $key, // 商户的key
];
var_dump($work->decryption($data));
在PHP7.1开始,mcrypt_decrypt系列函数已经被弃用,并且在PHP7.2的版本从核心扩展库中移除(当然还是可以自己编译进去的)。
在PHP7.1使用以上方式解密会得到如下报错(如果你开启了PHP报错提示的话)。
Function mcrypt_decrypt() is deprecated in ...
如果你是PHP7.1,那么也有不推荐的解决方案:提高报错等级、强制抑制错误提示。也就可以继续使用以上方案去解密。
如果是PHP7.2,该系列函数已经被移除核心库了,并且在以后也得不到支持。推荐使用openssl系列解密。
/**
* 退款解密(7.1+版本推荐使用)
* @param array $data
* @return bool|string
*/
public function decryption($data = array())
{
$encryption = base64_decode($data['req_info']);
$key = md5($data['key']);
$return = openssl_decrypt($encryption , 'AES-256-ECB', $key, OPENSSL_RAW_DATA);
return $return;
}