1. 程式人生 > >php5.6 微信退款回撥處理(AES-256-ECB+PKCS7Padding)

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加密模組。