Siam博客

微信退款结果回调解密,低版本以及7.1以上版本的使用方法

2019-08-30

微信的退款结果回调,数据是加密的。我们需要解密之后才能得到订单信息和结果信息,进行处理。 再次吐槽微信,官方demo都藏得贼吉尔深,一般人没有点狗屎运都找不到。

PHP5~PHP7.0常见解密方式

说不多说上代码(其实在以前我这一种已经写过文章了)。 传送门 --> http://www.yancoo.cn/index/article/show/id/33.html

/**
 * 退款解密
 * @param array $data
 * @return boolstring
 */
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+的解密方式

在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 boolstring
 */
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;
}
本文链接:
版权声明: 本文由 Siam原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权
Tags: 微信

扫描二维码,分享此文章