微信的退款结果回调,数据是加密的。我们需要解密之后才能得到订单信息和结果信息,进行处理。

再次吐槽微信,官方demo都藏得贼吉尔深,一般人没有点狗屎运都找不到。

PHP5~PHP7.0常见解密方式

说不多说上代码(其实在以前我这一种已经写过文章了)。

传送门 –> 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+的解密方式

在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;
    }