php5.6 微信退款回调处理(AES-256-ECB+PKCS7Padding)

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

猜你喜欢

转载自blog.csdn.net/eaglejiawo1120/article/details/81106746