From 791e3c456c6787fc167fce2d51ba5e9c8560ea4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=A8=E6=A0=88=E5=B0=8F=E5=AD=A6=E7=94=9F?= <1518079521@qq.com> Date: Fri, 21 Apr 2023 09:56:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- niucloud/app/common.php | 244 +++++++++++++++--- niucloud/app/install/controller/Index.php | 10 +- .../app/service/core/pay/CorePayService.php | 34 ++- 3 files changed, 246 insertions(+), 42 deletions(-) diff --git a/niucloud/app/common.php b/niucloud/app/common.php index 566ce9d83..4e14f04a7 100644 --- a/niucloud/app/common.php +++ b/niucloud/app/common.php @@ -12,26 +12,26 @@ use think\facade\Cache; * @param int $msg * @param array $ */ -function success($msg = 100000, array|string | null $data = [], int $code = 200, int $http_code = 200): Response +function success($msg = 100000, array|string|null $data = [], int $code = 200, int $http_code = 200): Response { if (is_array($msg)) { $data = $msg; $msg = 100000; } - return Response::create([ 'data' => $data, 'msg' => get_lang($msg), 'code' => $code ], 'json', $http_code); + return Response::create(['data' => $data, 'msg' => get_lang($msg), 'code' => $code], 'json', $http_code); } /** * 接口操作失败,返回信息 */ -function fail($msg = 100005, ?array $data = [], int $code = 400, int $http_code = 200) : Response +function fail($msg = 100005, ?array $data = [], int $code = 400, int $http_code = 200): Response { if (is_array($msg)) { $data = $msg; $msg = 100005; } - return Response::create([ 'data' => $data, 'msg' => get_lang($msg), 'code' => $code ], 'json', $http_code); + return Response::create(['data' => $data, 'msg' => get_lang($msg), 'code' => $code], 'json', $http_code); } /** @@ -42,7 +42,7 @@ function fail($msg = 100005, ?array $data = [], int $code = 400, int $http_code function get_lang($str) { $lang_config = config('lang') ?? []; - $range = cookie($lang_config[ 'cookie_var' ]) ?? 'zh-cn'; + $range = cookie($lang_config['cookie_var']) ?? 'zh-cn'; return Lang::get($str, [], $range); } @@ -59,22 +59,22 @@ function get_lang($str) function list_to_tree($list, $pk = 'id', $pid = 'pid', $child = 'child', $root = 0) { // 创建Tree - $tree = array (); + $tree = array(); if (is_array($list)) { // 创建基于主键的数组引用 - $refer = array (); + $refer = array(); foreach ($list as $key => $data) { - $refer[ $data[ $pk ] ] =& $list[ $key ]; + $refer[$data[$pk]] =& $list[$key]; } foreach ($list as $key => $data) { // 判断是否存在parent - $parent_id = $data[ $pid ]; + $parent_id = $data[$pid]; if ($root == $parent_id) { - $tree[] =& $list[ $key ]; + $tree[] =& $list[$key]; } else { - if (isset($refer[ $parent_id ])) { - $parent =& $refer[ $parent_id ]; - $parent[ $child ][] =& $list[ $key ]; + if (isset($refer[$parent_id])) { + $parent =& $refer[$parent_id]; + $parent[$child][] =& $list[$key]; } } } @@ -121,14 +121,14 @@ function array_keys_search($array, $keys, $index = '', $is_sort = true) return []; if (!empty($index) && count($array) != count($array, COUNT_RECURSIVE)) $array = array_column($array, null, $index); - $list = array (); + $list = array(); foreach ($keys as $key) { - if (isset($array[ $key ])) { + if (isset($array[$key])) { if ($is_sort) { - $list[] = $array[ $key ]; + $list[] = $array[$key]; } else { - $list[ $key ] = $array[ $key ]; + $list[$key] = $array[$key]; } } @@ -153,7 +153,7 @@ function del_target_dir($path, $delDir) //打开目录句柄 $handle = opendir($path); if ($handle) { - while (false !== ( $item = readdir($handle) )) { + while (false !== ($item = readdir($handle))) { if ($item != "." && $item != "..") { if (is_dir("$path/$item")) { del_target_dir("$path/$item", $delDir); @@ -221,7 +221,7 @@ function system_name(?string $key = '') 'channel_name' => env('system.channel_name', 'channel'), ]; if (!empty($key)) { - return $params[ $key ]; + return $params[$key]; } else { return $params; } @@ -329,6 +329,7 @@ function format_round_money($number) { return round($number, 2); } + /** * 基础属性过滤(特殊字符..) * @param $string @@ -364,6 +365,7 @@ function mkdirs($dir, $mode = 0777) if (!mkdirs(dirname($dir), $mode)) return false; return @mkdir($dir, $mode); } + /** * 获取唯一随机字符串 * @param int $len @@ -400,20 +402,196 @@ function check_event_result($result) */ function array_merge2(array $array1, array $array2) { - foreach ($array2 as $array2_k => $array2_v) - { - if(array_key_exists($array2_k, $array1)) - { - foreach ($array2_v as $array2_kk => $array2_vv) - { - if(array_key_exists($array2_kk, $array1[$array2_k])) - { + foreach ($array2 as $array2_k => $array2_v) { + if (array_key_exists($array2_k, $array1)) { + foreach ($array2_v as $array2_kk => $array2_vv) { + if (array_key_exists($array2_kk, $array1[$array2_k])) { $array1[$array2_k][$array2_kk] = array_merge($array1[$array2_k][$array2_kk], $array2_vv); - }else + } else $array1[$array2_k][$array2_kk] = $array2_vv; - } - }else - $array1[$array2_k] = $array2_v; - } - return $array1; + } + } else + $array1[$array2_k] = $array2_v; + } + return $array1; } + +/** + * 通过目录获取文件结构1 + * @param $dir + * @return array + */ +function get_files_by_dir($dir) +{ + $dh = @opendir($dir); //打开目录,返回一个目录流 + $return = array(); + while ($file = @readdir($dh)) { //循环读取目录下的文件 + if ($file != '.' and $file != '..') { + $path = $dir . DIRECTORY_SEPARATOR . $file; //设置目录,用于含有子目录的情况 + if (is_dir($path)) { + $return[] = $file; + } + } + } + @closedir($dh); //关闭目录流 + return $return; //返回文件 +} + + +/** + * 文件夹文件拷贝 + * @param string $src 来源文件夹 + * @param string $dst 目的地文件夹 + * @return bool + */ +function dir_copy(string $src = '', string $dst = '') +{ + if (empty($src) || empty($dst)) { + return false; + } + $dir = opendir($src); + dir_mkdir($dst); + while (false !== ($file = readdir($dir))) { + if (($file != '.') && ($file != '..')) { + if (is_dir($src . '/' . $file)) { + dir_copy($src . '/' . $file, $dst . '/' . $file); + } else { + copy($src . '/' . $file, $dst . '/' . $file); + } + } + } + closedir($dir); + return true; +} + +/** + * 删除文件 + * @param string $dst + * @param array $dirs + * @return bool + */ +function dir_remove(string $dst = '', array $dirs = []) +{ + if (empty($dirs) || empty($dst)) { + return false; + } + foreach($dirs as $v){ + @unlink($dst.$v); + } + return true; +} + +/** + * 创建文件夹 + * + * @param string $path 文件夹路径 + * @param int $mode 访问权限 + * @param bool $recursive 是否递归创建 + * @return bool + */ +function dir_mkdir($path = '', $mode = 0777, $recursive = true) +{ + clearstatcache(); + if (!is_dir($path)) { + mkdir($path, $mode, $recursive); + return chmod($path, $mode); + } + return true; +} + + +/** + * 分割sql语句 + * @param string $content sql内容 + * @param bool $string 如果为真,则只返回一条sql语句,默认以数组形式返回 + * @param array $replace 替换前缀,如:['my_' => 'me_'],表示将表前缀my_替换成me_ + * @return array|string 除去注释之后的sql语句数组或一条语句 + */ +function parse_sql($content = '', $string = false, $replace = []) +{ + // 纯sql内容 + $pure_sql = []; + // 被替换的前缀 + $from = ''; + // 要替换的前缀 + $to = ''; + // 替换表前缀 + if (!empty($replace)) { + $to = current($replace); + $from = current(array_flip($replace)); + } + if ($content != '') { + // 多行注释标记 + $comment = false; + // 按行分割,兼容多个平台 + $content = str_replace(["\r\n", "\r"], "\n", $content); + $content = explode("\n", trim($content)); + // 循环处理每一行 + foreach ($content as $key => $line) { + // 跳过空行 + if ($line == '') { + continue; + } + // 跳过以#或者--开头的单行注释 + if (preg_match("/^(#|--)/", $line)) { + continue; + } + // 跳过以/**/包裹起来的单行注释 + if (preg_match("/^\/\*(.*?)\*\//", $line)) { + continue; + } + // 多行注释开始 + if (substr($line, 0, 2) == '/*') { + $comment = true; + continue; + } + // 多行注释结束 + if (substr($line, -2) == '*/') { + $comment = false; + continue; + } + // 多行注释没有结束,继续跳过 + if ($comment) { + continue; + } + // 替换表前缀 + if ($from != '') { + $line = str_replace('`' . $from, '`' . $to, $line); + } + // sql语句 + $pure_sql[] = $line; + } + // 只返回一条语句 + if ($string) { + return implode("", $pure_sql); + } + // 以数组形式返回sql语句 + $pure_sql = implode("\n", $pure_sql); + $pure_sql = explode(";\n", $pure_sql); + } + return $pure_sql; +} + +/** + * 递归查询目录下所有文件 + * @param $path + * @param $data + * @return void + */ +function search_dir($path, &$data, $search = '') +{ + if (is_dir($path)) { + $path .= DIRECTORY_SEPARATOR; + $fp = dir($path); + while ($file = $fp->read()) { + if ($file != '.' && $file != '..') { + search_dir($path . '/' . $file, $data, $search); + } + } + $fp->close(); + } + if (is_file($path)) { + if($search) $path = str_replace($search, '', $path); + $data[] = $path; + } +} \ No newline at end of file diff --git a/niucloud/app/install/controller/Index.php b/niucloud/app/install/controller/Index.php index 0dfc44f6d..6c1195e19 100644 --- a/niucloud/app/install/controller/Index.php +++ b/niucloud/app/install/controller/Index.php @@ -55,11 +55,11 @@ class Index extends BaseInstall $root_path = str_replace("\\", DIRECTORY_SEPARATOR, dirname(dirname(dirname(dirname(__FILE__))))); $root_path = str_replace("../", DIRECTORY_SEPARATOR, $root_path); $dirs_list = [ - [ "path" => $root_path . DIRECTORY_SEPARATOR . ".env", "path_name" => "env", "name" => "env" ], - [ "path" => $root_path . DIRECTORY_SEPARATOR . ".example.env", "path_name" => "example_env", "name" => "env" ], - [ "path" => $root_path . DIRECTORY_SEPARATOR . 'runtime', "path_name" => "runtime", "name" => "runtime" ], - [ "path" => $root_path . DIRECTORY_SEPARATOR . 'public/upload/', "path_name" => "upload", "name" => "upload" ], - [ "path" => $root_path . DIRECTORY_SEPARATOR . 'app/install', "path_name" => "app/install", "name" => "安装目录" ] + [ "path" => $root_path . DIRECTORY_SEPARATOR . ".env", "path_name" => "niucloud/.env", "name" => "env" ], + [ "path" => $root_path . DIRECTORY_SEPARATOR . ".example.env", "path_name" => "niucloud/.example_env", "name" => "env" ], + [ "path" => $root_path . DIRECTORY_SEPARATOR . 'runtime/', "path_name" => "niucloud/runtime", "name" => "runtime" ], + [ "path" => $root_path . DIRECTORY_SEPARATOR . 'public/upload/', "path_name" => "niucloud/public/upload", "name" => "upload" ], + [ "path" => $root_path . DIRECTORY_SEPARATOR . 'app/install/', "path_name" => "niucloud/app/install", "name" => "安装目录" ] ]; //目录 可读 可写检测 $is_dir = true; diff --git a/niucloud/app/service/core/pay/CorePayService.php b/niucloud/app/service/core/pay/CorePayService.php index 232214d0c..bd48a9ddf 100644 --- a/niucloud/app/service/core/pay/CorePayService.php +++ b/niucloud/app/service/core/pay/CorePayService.php @@ -137,9 +137,13 @@ class CorePayService extends BaseCoreService * @param string $out_trade_no * @return void */ - public function returnTo(int $site_id, string $out_trade_no){ - - $pay = $this->findPayInfoByOutTradeNo($site_id, $out_trade_no); + public function returnTo(int $site_id, $pay_item){ + if(is_object($pay_item)){ + $pay = $pay_item; + }else{ + $out_trade_no = $pay_item; + $pay = $this->findPayInfoByOutTradeNo($site_id, $out_trade_no); + } if($pay->isEmpty()) return true; if($pay['status'] != PayEnum::STATUS_ING) return true; if(empty($pay->type)) return true; @@ -157,7 +161,7 @@ class CorePayService extends BaseCoreService $pay->save($data); } - return true; + return $close; } /** @@ -307,4 +311,26 @@ class CorePayService extends BaseCoreService } } + + public function reset(int $site_id, string $out_trade_no, float $money){ + $pay = $this->findPayInfoByOutTradeNo($site_id, $out_trade_no); + if($pay->isEmpty()) throw new PayException(700000); + if(!in_array($pay['status'], [ + PayEnum::STATUS_WAIT, + PayEnum::STATUS_ING + ])) throw new PayException(700011);//只有待支付可以重置支付 + if($pay['status'] == PayEnum::STATUS_ING){ + if(!$this->returnTo($site_id, $pay)){ + throw new PayException(700012); + } + } + $out_trade_no = create_no('pay', $pay['main_id']); + $data = array( + 'out_trade_no' => $out_trade_no, + 'money' => $money + ); + $pay->save($data); + //todo 需要考虑是业务调用重置支付,还是支付重置反馈业务 + return $out_trade_no; + } } \ No newline at end of file