分类 PHP 下的文章

------------ js --------------

<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/hmac-sha256.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script>

<script>
  var hash = CryptoJS.HmacSHA256("Message", "secret");
  var hashInBase64 = CryptoJS.enc.Base64.stringify(hash);
  document.write(hashInBase64);
</script>

------------- php ----------------

$s = hash_hmac('sha256', 'Message', 'secret', true);
echo base64_encode($s);

------------ go ------------------

func ComputeHmac256(message string, secret string) string {
    key := []byte(secret)
    h := hmac.New(sha256.New, key)
    h.Write([]byte(message))
    return base64.StdEncoding.EncodeToString(h.Sum(nil))
}

func main() {
    fmt.Println(ComputeHmac256("Message", "secret"))
}

通过网盘分享的文件:海康相关

链接: https://pan.baidu.com/s/1HFi-LUVvfEmJsSiNkX43Bg 提取码: 48y8

<?php
use PhpOffice\PhpSpreadsheet\IOFactory as PHPExcel_IOFactory;
/**
 * 读取excel文件内容
 * @param string $filename  完整的文件路径
 * @return array 读取表格的结果数据
 */
function readExcelFile($filename)
{
    $fileParts = pathinfo($filename);
    $filetype = strtolower($fileParts['extension']);
    if (strtolower($filetype)=='xls') {
        $objReader = PHPExcel_IOFactory::createReader('Xls');
    } elseif (strtolower($filetype)=='xlsx') {
        $objReader = PHPExcel_IOFactory::createReader('Xlsx');
    } elseif (strtolower($filetype)=='csv') {
        $objReader = PHPExcel_IOFactory::createReader('Csv')
                        ->setDelimiter(',')
                        ->setInputEncoding('GBK') //处理csv读取中文异常问题
                        ->setEnclosure('"');
    }
    $objReader->setReadDataOnly(true);
    $objPHPExcel = $objReader->load($filename);
    $objWorksheet = $objPHPExcel->getActiveSheet();
    $highestRow = $objWorksheet->getHighestRow(); // 获取总行数
    $highestColumn = $objWorksheet->getHighestColumn();// 获取最大列号
    $excelResult = [];
    // 从第2行开始读取
    $startRow = 2;
    for ($j = $startRow; $j <= $highestRow; $j++) {
        // 从A列读取数据
        for ($k = 'A'; $k <= $highestColumn; $k++) {
            // 读取单元格
            $excelResult[$j][$k] = (string)$objWorksheet->getCell("$k$j")->getValue();
        }
    }
    return $excelResult;
}

4种资源:

资源拥有者(小明);
客户端(软文系统);
授权服务(微信公众号平台);
受保护资源(小明公众号内的文章);

auth2.0.png

QQ20231122-234339@2x.png

QQ20231123-000141@2x.png

php.8.2.png

动态属性的使用

弃用动态属性创建,除非类选择使用 #[\AllowDynamicProperties] 注解。stdClass 允许动态属性。__get()/__set() 魔术方法不受此更改的影响。解决动态属性弃用警告,可以通过以下方式:

  1. 声明属性(首选)。
  2. 将 #[\AllowDynamicProperties] 添加到 #[\AllowDynamicProperties](这也适用于所有子类)。
  3. 如果需要将附加数据于不属于自己的对象相关联,则使用 WeakMap。

WeakMap方法比较常用,因为1与2是需要添加类中,这个类有可能不是自已写的,比如框架的类则不能修改,这时需要用到第3条,用法如下:

<?php
$wm = new WeakMap();

$o = new stdClass;

class A {
    public function __destruct() {
        echo "Dead!\n";
    }
}

$wm[$o] = new A;

var_dump(count($wm));
echo "Unsetting...\n";
unset($o);
echo "Done\n";
var_dump(count($wm));


https://www.php.net/manual/zh/migration82.deprecated.php

1、数据库连接改为 mysqli
2、connect.php文件里常量 MAGIC_QUOTES_GPC改为如下

define('MAGIC_QUOTES_GPC', version_compare(PHP_VERSION, '5.6.40') > 0 ? false : function_exists('get_magic_quotes_gpc')&&get_magic_quotes_gpc());

3、关闭所以错误报告

注意:
7.5新版安装前改以下文件即可
e/class/connect.php

define('MAGIC_QUOTES_GPC',function_exists('get_magic_quotes_gpc')&&get_magic_quotes_gpc());

改为:

define('MAGIC_QUOTES_GPC',(ini_get('magic_quotes_gpc') == 1) ? true : false);

说明:get_magic_quotes_gpc()php5.4版之后已废除了。

找到文件 vendor/topthink/think-cache/src/cache/Driver.php文件,如下方法,先将:

//判断$data是否为序列化字符串,如果不是直接返回不需要反序列化
if (!preg_match( '/^[asO]:[0-9]+:/s', $data)) {
    return $data;
}

添加,如下。然后正常的方问网站如登陆后台等操作,待操作完成以后,即完成了字符序列化入数据库,然后会出现\u5148\u950b\u7f51\u7edcUnicode代码,将其修改为正常的中文以后,再将下面新增的代码删除即可。
原因就是升级前的序列化入库与升级的序列化不同了。

/**
 * 反序列化数据
 * @access protected
 * @param  string $data 缓存数据
 * @return mixed
 */
protected function unserialize(string $data)
{
    //判断$data是否为序列化字符串,如果不是直接返回不需要反序列化
    if (!preg_match( '/^[asO]:[0-9]+:/s', $data)) {
        return $data;
    }
    
    $unserialize = $this->options['serialize'][1] ?? function ($data) {
        SerializableClosure::enterContext();
        $data = \unserialize($data);
        SerializableClosure::unwrapClosures($data);
        SerializableClosure::exitContext();
        return $data;
    };

    return $unserialize($data);
}

QueryList 是什么

QueryList是一套用于内容DOM解析的PHP工具,它使用更加现代化的开发思想,语法简洁、优雅,可扩展性强。相比传统的使用晦涩的正则表达式来做DOM解析,QueryList使用了更加强大而优雅的CSS选择器来做DOM解析,大大降低了PHP做DOM解析的门槛,同时也让DOM解析代码易读易维护,让你从此告别晦涩难懂且不易维护的正则表达式😀。

http://querylist.cc/docs/guide/v4

方法1:

使用number_format()函数。number_format()函数用于将字符串转换为数字。它会在成功时返回格式化的数字,否则会在失败时给出E_WARNING。
<?php

    $num = "1000.314"; //1,000

    // 使用number_format()函数将字符串转换为数字
    echo number_format($num); //1,000.31

    // 函数的作用是:将字符串转换为数字
    echo number_format($num, 2);

?>

方法2:

使用类型转换:类型转换可以直接将字符串转换为float,double或integer基本类型。这是将字符串转换为数字而不使用任何函数的最佳方法。
<?php

    // 字符串格式的数字
    $num = "1000.314"; 

    // 使用int类型转换
    echo (int)$num; //1000

    // 使用float 类型转换
    echo (float)$num; //1000.314

    // 使用double 类型转换
    echo (double)$num; //1000.314

?>


方法3:

使用intval()和floatval()函数。intval()和floatval()函数也可用于将字符串分别转换为其对应的整数和浮点值。
<?php

    // 字符串格式的数字
    $num = "1000.314";

    // intval函数的作用是:将字符串转换为整数
    echo intval($num); //1000

    // floatval函数的作用是:将字符串转换为浮点数
    echo floatval($num); //1000.314

?>


方法4:

通过添加0或执行数学运算。通过在字符串中添加0,也可以将字符串编号转换为整数或浮点数。在PHP中,执行数学运算时,字符串将隐式转换为整数或浮点数。
<?php

    // 数字转换成字符串格式
    $num = "1000.314";

    // 对隐式类型转换执行数学运算
    echo $num + 0; //1000.314

    // 对隐式类型转换执行数学运算
    echo $num + 0.0; //1000.314

    // 对隐式类型转换执行数学运算
    echo $num + 0.1; //1000.414

?>

曾经踩过一个坑,用方法4解决的。

开发银行或海关的项目经常遇到加密解密的问题

一般客户会提供两个文件
.pfx 结尾的(公钥加私钥文件)
.cer 结尾的文件 (包含公钥文件)

私钥一般都是pfx格式(私钥用来加密生成签名发送报文)
公钥是cer格式(公钥用来验证返回报文里的签名)。
但是phpopenssl只能用pem格式,需要把这两个文件转化成pem的:

一、PHP的方式转化

//filePath为pfx文件路径
function signfrompfx($strData, $filePath, $keyPass)
{
    if (!file_exists($filePath)) {
        return false;
    }
    $pkcs12 = file_get_contents($filePath);
    if (openssl_pkcs12_read($pkcs12, $certs, $keyPass)) {
        $privateKey = $certs['pkey'];
        $publicKey = $certs['cert'];
        $signedMsg = "";
        if (openssl_sign($strData, $signedMsg, $privateKey)) {
            $signedMsg = bin2hex($signedMsg);//这个看情况。有些不需要转换成16进制,有些需要base64编码。看各个接口
            return $signedMsg;
        } else {
            return '';
        }
    } else {
        return '0';
    }
}

公钥cer转pem(即x.509证书dem格式转换为pem)

function verifyReturn($data,$signature,$filePath){
    /**
     * filePath为crt,cert文件路径。x.509证书
     * cer to dem, Convert .cer to .pem, cURL uses .pem
     */
    $certificateCAcerContent = file_get_contents($filePath);
    $certificateCApemContent =
        '-----BEGIN CERTIFICATE-----'.PHP_EOL
        .chunk_split(base64_encode($certificateCAcerContent), 64, PHP_EOL)
        .'-----END CERTIFICATE-----'.PHP_EOL;

    $pubkeyid = openssl_get_publickey($certificateCApemContent);

    $len = strlen($signature);
    $signature= pack("H" . $len, $signature); //Php-16进制转换为2进制,看情况。有些接口不需要,有些需要base64解码

    $data=str_replace('<?xml version=\"1.0\" encoding=\"GBK\"?>', '<?xml version="1.0" encoding="GBK"?>', $data);//这个看情况。
    // state whether signature is okay or not
    return openssl_verify($data, $signature, $pubkeyid);
}

二、openssl命令转化

openssl x509 -inform der -in pub.cer -out pub.pem


三、附上截图

20200804133845380.png

转自:https://blog.csdn.net/weixin_38626872/article/details/107784610