• 微信退款通知,退款回调数据解密.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);
  • 相关阅读:
    答题活动小程序V3.0
    在线答题小程序关于完形填空题的设计
    如何搭建在线答题小程序
    考研政治刷题小程序我来了
    JVM中的枚举
    IO Stream byte[]
    成长经验系列之七-方法-跳出背了忘忘了背的循环
    JVM之GC Roots
    深入理解Java虚拟机-第三版-第二章JVM内存区域笔记
    JVM之DirectByteBuffer
  • 原文地址:https://www.cnblogs.com/wangzhaobo/p/11040736.html
Copyright © 2020-2023  润新知