微信退款通知,退款回調數據解密.SHA256簽名AEAD_AES_256_GCM解密


$xmlResult = file_get_contents("php://input");//獲取微信的數據
$result = $this->xmlToArray($xmlResult);//將xml轉成數組
// 將加密的數據解密,方法在下面
$reqInfo = $this->refund_decrypt($result['req_info']);
 
        
/*
 * 退款通知解密
 * @Author WangZhaoBo
 * @param $str 微信同步的加密串req_info
 * @param $key 商戶key
 */
public function refund_decrypt($str) {
    $key = md5($this->appSecret);
    $str = base64_decode($str);
    $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, 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);
}

 //SHA256簽名

/**
     *     作用:生成256簽名
     */
    public function get256Sign($Obj,$key = null)
    {
        foreach ($Obj as $k => $v)
        {
            $Parameters[$k] = $v;
        }
        //簽名步驟一:按字典序排序參數
        ksort($Parameters);
        $String = $this->formatBizQueryParaMap($Parameters, false);
        //echo '【string1refund_decrypt】'.$String.'</br>';
        //簽名步驟二:在string后加入KEY
        if(is_null($key)){
            $key =  WxPayConf_pub::$KEY;
            $String = $String."&key=".WxPayConf_pub::$KEY;
        }else{
            $String = $String."&key=".$key;
        }
        echo $String;
        //簽名步驟三:MD5加密
        //$String = md5($String);
        $String = hash_hmac("sha256", $str, $key);
        //echo "【string3】 ".$String."</br>";
        //簽名步驟四:所有字符轉為大寫
        $result_ = strtoupper($String);
        //echo "【result】 ".$result_."</br>";
        return $result_;
    }

 AEAD_AES_256_GCM的解密php示例代碼 (參考:https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=19_11https://blog.csdn.net/u010324331/article/details/82153067https://pay.weixin.qq.com/wiki/doc/api/download/wxpay_xiaowei_cert.pdf和)

//region 證書解密start 
    public function decodePem(){
        $ciphertext = '加密后的證書內容';
        $nonce = '加密證書的隨機串,加密證書的隨機串';
        $associated_data = '加密證書的隨機串,固定值: certificate';
        $key = '你的APIv3密鑰';

        $check_sodium_mod = extension_loaded('sodium');
        if($check_sodium_mod === false){
            echo '沒有安裝sodium模塊';die;
        }
        $check_aes256gcm = sodium_crypto_aead_aes256gcm_is_available();
        if($check_aes256gcm === false){
            echo '當前不支持aes256gcm';die;
        }

        $pem = sodium_crypto_aead_aes256gcm_decrypt(base64_decode($ciphertext),$associated_data,$nonce,$key);
        var_dump($pem); //這是解密出來的證書內容,復制出來保存就行了 
    }
    //endregion 證書解密end 

 使用sodium_crypto_aead_aes256gcm_decrypt函數需要安裝sodium擴展,要求PHP版本必須大於7,小於7的也有這個擴展, 但是沒有sodium_crypto_aead_aes256gcm_decrypt這個方法.

安裝sodium擴展方法看這里https://blog.csdn.net/u010324331/article/details/82153067

如果不安裝擴展,怎么辦? 用paragonie/sodium_compat這個類庫. 

Sodium Compat 是用於 Sodium 加密庫(libsodium)的純 PHP 填充,它是 PHP 7.2.0+ 的核心擴展,也可用於 PECL。
這個庫 tentativeley 支持PHP 5.2.4 - 7.x(最新版),但官方只支持非 EOL 版本的 PHP。
如果安裝了 PHP 擴展,Sodium Compat 將機會性地透明地使用 PHP 擴展而不是我們的實現。
github 地址: https://github.com/paragonie/sodium_compat

其中ParagonIE_Sodium_Compat類下面有一個crypto_aead_aes256gcm_decrypt方法.

調用方法

ParagonIE_Sodium_Compat::crypto_aead_aes256gcm_decrypt($ciphertext,$associated_data,$nonce,$key);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM