当前位置: 首页 > news >正文

禾匠商城系统 企业转账到零钱 修改成 商家转账到零钱

注意php 7以上的json_encode 溢出

修改的路径:

vendor/luweiss/wechat/src/Wechat/WechatPay.php

<?phpnamespace luweiss\Wechat;class WechatPay extends WechatBase
{const SIGN_TYPE_MD5 = 'MD5';const TRADE_TYPE_JSAPI = 'JSAPI';const TRADE_TYPE_NATIVE = 'NATIVE';const TRADE_TYPE_APP = 'APP';const TRADE_TYPE_MWEB = 'MWEB';public $appId;public $mchId;public $key;public $certPemFile;public $keyPemFile;/*** WechatPay constructor.* @param array $config ['appId', 'mchId', 'key', 'certPemFile', 'keyPemFile']*/public function __construct($config = []){foreach ($config as $name => $value) {if (property_exists($this, $name)) {$this->$name = $value;}}}/*** @param array $result* @return array* @throws WechatException*/protected function getClientResult($result){if (!isset($result['return_code'])) {throw new WechatException('返回数据格式不正确: ' . json_encode($result, JSON_UNESCAPED_UNICODE));}if ($result['return_code'] !== 'SUCCESS') {$msg = 'returnCode: ' . $result['return_code'] . ', returnMsg: ' . $result['return_msg'];throw new WechatException($msg, 0, null, $result);}if (!isset($result['result_code'])) {throw new WechatException('返回数据格式不正确: ' . json_encode($result, JSON_UNESCAPED_UNICODE));}if ($result['result_code'] !== 'SUCCESS') {$msg = 'errCode: ' . $result['err_code'] . ', errCodeDes: ' . $result['err_code_des'];throw new WechatException($msg, 0, null, $result);}return $result;}/*** @param $api* @param $args* @return array* @throws WechatException*/protected function send($api, $args){$args['appid'] = !empty($args['appid']) ? $args['appid'] : $this->appId;$args['mch_id'] = !empty($args['mch_id']) ? $args['mch_id'] : $this->mchId;$args['nonce_str'] = !empty($args['nonce_str']) ? $args['nonce_str'] : md5(uniqid());$args['sign'] = $this->makeSign($args);$xml = WechatHelper::arrayToXml($args);$res = $this->getClient()->setDataType(WechatHttpClient::DATA_TYPE_XML)->post($api, $xml);return $this->getClientResult($res);}/*** @param $api* @param $args* @return array* @throws WechatException*/protected function sendWithPem($api, $args){$args['nonce_str'] = !empty($args['nonce_str']) ? $args['nonce_str'] : md5(uniqid());$args['sign'] = $this->makeSign($args);$xml = WechatHelper::arrayToXml($args);$res = $this->getClient()->setDataType(WechatHttpClient::DATA_TYPE_XML)->setCertPemFile($this->certPemFile)->setKeyPemFile($this->keyPemFile)->post($api, $xml);return $this->getClientResult($res);}/**** 统一下单, <a href="https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1">* https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1</a>** @param array $args ['body', 'out_trade_no', 'total_fee', 'notify_url', 'trade_type', 'openid']* @return array* @throws WechatException*/public function unifiedOrder($args){$args['spbill_create_ip'] = !empty($args['spbill_create_ip']) ? $args['spbill_create_ip'] : '127.0.0.1';$api = 'https://api.mch.weixin.qq.com/pay/unifiedorder';return $this->send($api, $args);}/**** 查询订单, <a href="https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_2">* https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_2</a>** @param array $args ['out_trade_no']* @return array* @throws WechatException*/public function orderQuery($args){$api = 'https://api.mch.weixin.qq.com/pay/orderquery';return $this->send($api, $args);}/**** 关闭订单, <a href="https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_3">* https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_3</a>** @param array $args* @return array* @throws WechatException*/public function closeOrder($args){$api = 'https://api.mch.weixin.qq.com/pay/closeorder';return $this->send($api, $args);}/**** 申请退款, <a href="https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_4">* https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_4</a>** @param array $args* @return array* @throws WechatException*/public function refund($args){$args['appid'] = !empty($args['appid']) ? $args['appid'] : $this->appId;$args['mch_id'] = !empty($args['mch_id']) ? $args['mch_id'] : $this->mchId;$api = 'https://api.mch.weixin.qq.com/secapi/pay/refund';return $this->sendWithPem($api, $args);}/**** 查询退款, <a href="https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_5">* https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_5</a>** @param array $args* @return array* @throws WechatException*/public function refundQuery($args){$api = 'https://api.mch.weixin.qq.com/pay/refundquery';return $this->send($api, $args);}/**** 企业付款, <a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2">* https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_2</a>** @param array $args ['partner_trade_no', 'openid', 'amount', 'desc']* @return array* @throws WechatException*/public function transfers($args){$arg = [];$arg['out_batch_no'] = $args['partner_trade_no'];$arg['batch_name'] = date("Y-m-d H:i:s").$args['transfer_remark'];$arg['appid'] = !empty($args['mch_appid']) ? $args['mch_appid'] : $this->appId;$arg['batch_remark'] = date("Y-m-d H:i:s").$args['transfer_remark'];$arg['total_amount'] = !empty($args['transfer_amount']) ? intval($args['transfer_amount']):$args['amount'];$arg['total_num'] = 1;$transfer_detail_list = array('out_detail_no'=>$args['partner_trade_no'],'transfer_amount'=>!empty($args['transfer_amount']) ? intval($args['transfer_amount']):$args['amount'],'transfer_remark'=>date("Y-m-d H:i:s").$args['desc'],'openid'=>$args['openid'],);if(isset($args['user_name'])&&!empty($args['user_name'])){$transfer_detail_list['user_name'] = $args['user_name'];}    $arg['transfer_detail_list'][]=$transfer_detail_list;// var_dump($arg);die();$api = 'https://api.mch.weixin.qq.com/v3/transfer/batches';$token  = $this->getToken($arg);//获取tokenreturn $this->https_request($api, json_encode($arg),$token);}protected function sendBatches($api, $arg){$res = $this->getClient()->setDataType(WechatHttpClient::DATA_TYPE_JSON)->setCertPemFile($this->certPemFile)->setKeyPemFile($this->keyPemFile)->post($api, $arg);return $this->getClientResult($res);}public  function https_request($url,$data = null,$token){try {$curl = curl_init();curl_setopt($curl, CURLOPT_URL, (string)$url);curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);if (!empty($data)) {curl_setopt($curl, CURLOPT_POST, 1);curl_setopt($curl, CURLOPT_POSTFIELDS, $data);}curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);//添加请求头$headers = ['Authorization:WECHATPAY2-SHA256-RSA2048 ' . $token,'Accept: application/json','Content-Type: application/json; charset=utf-8','User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36',];if (!empty($headers)) {curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);}$output = curl_exec($curl);curl_close($curl);$data = json_decode($output,true);if($data['code']!=200&&isset($data['code'])){$data['err_code_des'] = $data['message'];throw new WechatException($data['message'], 0, null, $data);}return $data;}catch (WechatException $exception) {throw $exception;}}public function getToken($pars){$url = 'https://api.mch.weixin.qq.com/v3/transfer/batches';$http_method = 'POST';//请求方法(GET,POST,PUT)$timestamp   = time();//请求时间戳$url_parts   = parse_url($url);//获取请求的绝对URL$nonce       = $timestamp.rand('10000','99999');//请求随机串$body        = json_encode((object)$pars);//请求报文主体$stream_opts = ["ssl" => ["verify_peer"=>false,"verify_peer_name"=>false,]];$apiclient_cert_path = $this->certPemFile;$apiclient_key_path  = $this->keyPemFile;$apiclient_cert_arr = openssl_x509_parse(file_get_contents($apiclient_cert_path,false, stream_context_create($stream_opts)));$serial_no          = $apiclient_cert_arr['serialNumberHex'];//证书序列号$mch_private_key    = file_get_contents($apiclient_key_path,false, stream_context_create($stream_opts));//密钥$merchant_id = !empty($args['mch_id']) ? $args['mch_id'] : $this->mchId;//商户id$canonical_url = ($url_parts['path'] . (!empty($url_parts['query']) ? "?${url_parts['query']}" : ""));$message = $http_method."\n".$canonical_url."\n".$timestamp."\n".$nonce."\n".$body."\n";openssl_sign($message, $raw_sign, $mch_private_key, 'sha256WithRSAEncryption');$sign = base64_encode($raw_sign);//签名$schema = 'WECHATPAY2-SHA256-RSA2048';$token = sprintf('mchid="%s",nonce_str="%s",timestamp="%d",serial_no="%s",signature="%s"',$merchant_id, $nonce, $timestamp, $serial_no, $sign);//微信返回tokenreturn $token;}//    public function transfers($args)
//    {
//        $args['mch_appid'] = !empty($args['mch_appid']) ? $args['mch_appid'] : $this->appId;
//        $args['mchid'] = !empty($args['mchid']) ? $args['mchid'] : $this->mchId;
//        $args['spbill_create_ip'] = !empty($args['spbill_create_ip']) ? $args['spbill_create_ip'] : '127.0.0.1';
//        $args['check_name'] = !empty($args['check_name']) ? $args['check_name'] : 'NO_CHECK';
//        $api = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';
//        return $this->sendWithPem($api, $args);
//    }/**** 查询企业付款, <a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3">* https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=14_3</a>** @param array $args ['partner_trade_no']* @return array* @throws WechatException*/public function getTransferInfo($args){$args['appid'] = !empty($args['appid']) ? $args['appid'] : $this->appId;$args['mch_id'] = !empty($args['mch_id']) ? $args['mch_id'] : $this->mchId;$api = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/gettransferinfo';return $this->sendWithPem($api, $args);}/**** 企业付款到银行卡, <a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_2">* https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_2</a>** @param array $args* @return array* @throws WechatException*/public function payBank($args){$args['mch_id'] = !empty($args['mch_id']) ? $args['mch_id'] : $this->mchId;$api = 'https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank';return $this->sendWithPem($api, $args);}/**** 查询企业付款到银行卡, <a href="https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_3">* https://pay.weixin.qq.com/wiki/doc/api/tools/mch_pay.php?chapter=24_3</a>** @param array $args* @return array* @throws WechatException*/public function queryBank($args){$args['mch_id'] = !empty($args['mch_id']) ? $args['mch_id'] : $this->mchId;$api = 'https://api.mch.weixin.qq.com/mmpaysptrans/query_bank';return $this->sendWithPem($api, $args);}/*** 通过数组数据验证签名* @param array $array* @return bool*/public function validateSignByArrayResult($array){if (!isset($array['sign'])) {return false;}$inputSign = $array['sign'];$truthSign = $this->makeSign($array);return $inputSign === $truthSign;}/*** 通过XML数据验证签名* @param string $xml* @return bool*/public function validateSignByXmlResult($xml){$array = WechatHelper::xmlToArray($xml);return $this->validateSignByArrayResult($array);}/*** 数据签名* @param array $args* @param string $signType* @return string*/public function makeSign($args, $signType = self::SIGN_TYPE_MD5){if (isset($args['sign'])) {unset($args['sign']);}ksort($args);$string = '';foreach ($args as $i => $arg) {if ($arg === null || $arg === '') {continue;} else {$string .= ($i . '=' . $arg . '&');}}$string = $string . "key={$this->key}";$string = md5($string);$result = strtoupper($string);return $result;}
}

相关文章:

禾匠商城系统 企业转账到零钱 修改成 商家转账到零钱

注意php 7以上的json_encode 溢出 修改的路径&#xff1a; vendor/luweiss/wechat/src/Wechat/WechatPay.php <?phpnamespace luweiss\Wechat;class WechatPay extends WechatBase {const SIGN_TYPE_MD5 MD5;const TRADE_TYPE_JSAPI JSAPI;const TRADE_TYPE_NATIVE NA…...

点云从入门到精通技术详解100篇-基于激光点云的道路目标检测

目录 前言 国内外研究现状 点云目标检测算法的研究现状 激光雷达相关技术 2.1 引言...

【Hello Algorithm】暴力递归到动态规划(一)

暴力递归到动态规划&#xff08;一&#xff09; 斐波那契数列的动态规划机器人走路初级递归初级动态规划动态规划 先后选牌问题初级递归初级动态规划动态规划 我们可以一句话总结下动态规划 动态规划本质是一种以空间换时间的行为 如果你发现有重复调用的过程 在经过一次之后把…...

凉鞋的 Godot 笔记 107. 脚本窗口文件系统窗口

107. 脚本窗口&文件系统窗口 在上一篇&#xff0c;我们完成了第二轮循环&#xff0c;同时也接触了一些新内容&#xff0c;如下所示: 频率使用比较高的窗口&#xff0c;还剩下最后两个了&#xff0c;一个是脚本窗口&#xff1a; 另一个是文件系统窗口: 脚本窗口 和 文件系统…...

数据源作用以及spring配置数据源

数据源 数据源&#xff0c;简单理解为数据源头&#xff0c;提供了应用程序所需要数据的位置。数据源保证了应用程序与目标数据之间交互的规范和协议&#xff0c;它可以是数据库&#xff0c;文件系统等等。其中数据源定义了位置信息&#xff0c;用户验证信息和交互时所需的一些…...

Javaweb中的servlet中的消息体是什么?

2023年10月9日&#xff0c;周一晚上 目录 什么是消息体 什么是HTTP响应 HTTP响应由谁产生&#xff0c;发给谁 响应头具体有什么内容 Content-Type的值怎么写 HTTP响应例子 什么是消息体 消息体(message body)指HTTP响应中的实体主体内容。 什么是HTTP响应 在HTTP响应中…...

饥荒服务器阿里云租用价格表一年和一个月收费报价表

饥荒阿里云服务器多少钱一个月&#xff1f;阿里云服务器价格9元一个月&#xff0c;阿里云轻量应用服务器2核2G3M带宽轻量服务器一年108元&#xff0c;2核4G4M带宽轻量服务器一年297.98元12个月&#xff1b;阿里云ECS云服务器e系列2核2G配置182元一年、2核4G配置365元一年、2核8…...

前端 JS 经典:Math 常用方法汇总

1. Math.ceil 向上取整 Math.ceil(1.2) // 2 2. Math.floor 向下取整 Math.floor(1.2) // 1 3. Math.round 四舍五入 Math.round(1.4) // 1 Math.round(1.6) // 2 4. Math.random 0-1 随机数 Math.random() // 0.2745798547204079 5. Math.max 返回大值 Math.max(1.2,…...

MongoDB 笔记

1 insert 、create、save区别 insert: 主键不存在则正常插入&#xff1b;主键已存在&#xff0c;抛出DuplicateKeyException 异常 save: 主键不存在则正常插入&#xff1b;主键已存在则更新 insertMany&#xff1a;批量插入&#xff0c;等同于批量执行 insert create&#x…...

Maven 项目文档

本章节我们主要学习如何创建 Maven 项目文档。 比如我们在 C:/MVN 目录下&#xff0c;创建了 consumerBanking 项目&#xff0c;Maven 使用下面的命令来快速创建 java 项目&#xff1a; mvn archetype:generate -DgroupIdcom.companyname.bank -DartifactIdconsumerBanking -…...

浏览器中XPath的使用

概念 XPath (XML Path Language) 是一门在 XML 文档中查找信息的语言&#xff0c;可用来在 XML 文档中对元素和属性进行遍历。 XPath定位在爬虫和自动化测试中都比较常用&#xff0c;通过使用路径表达式来选取 XML 文档中的节点或者节点集&#xff0c;熟练掌握XPath可以极大提…...

js录制屏幕并输出视频

借助navigator&#xff0c;需要注意的是navigator.mediaDevices.getDisplayMedia需要在https使用&#xff0c;若部署环境为http,则会导致navigator.mediaDevices.getDisplayMedia为undefined 参数中的name为输出视频的文件名 time为录制的时长&#xff0c;若时长为一秒则time值…...

华为OD机试 - 数组组成的最小数字(Java 2023 B卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#…...

数据结构-顺序存储二叉树

文章目录 目录 文章目录 前言 一 . 什么是顺序存储二叉树 二 . 模拟实现 前序遍历 总结 前言 大家好,今天给大家讲一下顺序存储二叉树 一 . 什么是顺序存储二叉树 顺序存储二叉树是一种将二叉树的节点按照从上到下、从左到右的顺序存储在数组中的方法。具体来说&#xff0c;顺…...

mysql学习实践

这里写目录标题 查找重复数据查找重复数据的字段值以及重复的次数如果你只想查找重复数据&#xff0c;而不需要知道重复的次数&#xff0c;可以简化查询如下 根据某个字段查询重复的数据&#xff0c;并取id最大的那条数据&#xff08;用于商机列表展示&#xff09;将逗号分隔的…...

键盘控制应用--通过键盘发送控制指令

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言代码原理实现前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对键盘控制应用做个简单的介绍,具体内容后…...

python中pytorch的广播机制——Broadcasting

广播机制 numpy 在算术运算期间采用“广播”来处理具有不同形状的 array &#xff0c;即将较小的阵列在较大的阵列上“广播”&#xff0c;以便它们具有兼容的形状。Broadcasting是一种没有copy数据的expand 不过两个维度不相同&#xff0c;在前面插入维度1扩张维度1到相同的维…...

基于BES平台音乐信号处理之DRC算法实现

基于BES平台音乐信号处理之DRC算法实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)&#xff1f;加我微信hezkz17, 本群提供音频技术答疑服务 1 DRC实现 drc.h 2 调用 audio_process.c 3 DRC动态范围控制算法在音乐信号处理中的位置 4 DRC具体细节源码 可参考…...

如何加快香山处理器Chisel->Verilog编译速度

graalvm installation 更换JVM。我们推荐使用GraalVM代替OpenJDK。 使用GraalVM免费版作为JVM编译香山比OpenJDK快10%-20%。 -------------------------------------------------------------------------- https://www.graalvm.org/latest/docs/getting-started/linux/ downl…...

pillow篇---pillow连续打开同一张图片会导致打开失败问题

如果你需要在多次操作同一张图像时避免出现缓存问题&#xff0c;你可以使用 Image.open() 方法的 seek() 方法将文件指针移动到图像数据的开头&#xff0c;以便重新读取图像数据。示例如下&#xff1a; from PIL import Image# 打开图像文件 image Image.open(example.jpg)# …...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

五年级数学知识边界总结思考-下册

目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解&#xff1a;由来、作用与意义**一、知识点核心内容****二、知识点的由来&#xff1a;从生活实践到数学抽象****三、知识的作用&#xff1a;解决实际问题的工具****四、学习的意义&#xff1a;培养核心素养…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库&#xff0c;提供了高效、安全的文本格式化功能&#xff0c;是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...