Files
mpay/app/controller/api/PluginController.php
2024-12-12 17:14:01 +08:00

195 lines
6.2 KiB
PHP

<?php
declare(strict_types=1);
namespace app\controller\api;
use app\BaseController;
class PluginController extends BaseController
{
// 获取插件列表
public function getPluginList()
{
$local_plugin_config = self::getPluginConfig();
$show = $this->request->get('show', 1);
$plugin_config = match ((int)$show) {
0 => \Plugin::getAllPlugins($local_plugin_config),
1 => \Plugin::getInstall($local_plugin_config),
2 => \Plugin::getUninstallPlugins($local_plugin_config),
default => []
};
if ($plugin_config) {
return json(['code' => 0, 'msg' => 'OK', 'count' => count($plugin_config), 'data' => $plugin_config]);
} else {
return json(['code' => 1, 'msg' => '无数据记录', 'count' => 0, 'data' => []]);
}
}
// 卸载插件
public function uninstallPlugin()
{
$platform = $this->request->post('platform');
$classname = $this->request->post('classname');
if (!$platform || !$classname) {
return json(backMsg(1, '请选择插件'));
}
$res1 = $this->delPlugin($platform);
$res2 = $this->delPluginFile($classname);
if ($res1 && $res2) {
return json(backMsg(0, '卸载成功'));
} else {
return json(backMsg(1, '插件不存在'));
}
}
// 添加插件
public function addPlugin(array $option = [])
{
$keys = ['platform', 'name', 'class_name', 'price', 'describe', 'website', 'state', 'query'];
$config = [];
foreach ($option as $key => $value) {
if (in_array($key, $keys)) {
$config[$key] = $value;
}
}
$plugin_config = self::getPluginConfig();
$plugin_platform = $config['platform'] ?: '';
foreach ($plugin_config as $value) {
if ($plugin_platform == $value['platform']) {
return 1; //'插件已存在'
}
}
$plugin_config[] = $config;
$this->savePluginConfig($plugin_config, '支付插件列表');
return 0;
}
// 删除插件配置
private function delPlugin(string $plugin_name = '')
{
$plugin_config = self::getPluginConfig();
$index = null;
foreach ($plugin_config as $i => $value) {
if ($value['platform'] == $plugin_name) {
$index = $i;
}
}
if ($index === null) {
return false; // 插件不存在
}
unset($plugin_config[$index]);
$config = array_values($plugin_config);
$this->savePluginConfig($config, '支付插件列表');
return true;
}
// 删除插件类库文件
private function delPluginFile(string $file_name = '')
{
$plugin_path = root_path() . '/extend/payclient/' . $file_name . '.php';
if (file_exists($plugin_path)) {
unlink($plugin_path);
return true;
} else {
return false;
}
}
// 修改插件
public function setPlugin($platform = '', $option = [])
{
$config = self::getPluginConfig();
if (!$platform) {
return 1; // 请选择插件
}
if (!$option) {
return 2; // 请添加插件配置
}
foreach ($config as $index => $options) {
if ($options['platform'] == $platform) {
foreach ($options as $key => $value) {
if (\array_key_exists($key, $option)) {
$config[$index][$key] = $option[$key];
}
}
$this->savePluginConfig($config, '支付插件列表');
return 0;
}
}
}
// 插件启用
public function pluginEnable()
{
$info = $this->request->post();
if ($this->isPluginInstall($info['platform']) == false) {
return json(backMsg(1, '插件未安装'));
}
$up_res = $this->setPlugin($info['platform'], ['state' => $info['state']]);
if ($up_res) {
return json(backMsg(1, '失败'));
} else {
return json(backMsg(0, '成功'));
}
}
// 检测插件是否安装
public function isPluginInstall(string $platform): bool
{
$config = self::getPluginConfig();
$platforms = [];
foreach ($config as $key => $value) {
$platforms[] = $value['platform'];
}
if (in_array($platform, $platforms)) {
return true;
} else {
return false;
}
}
// 插件选项
public function pluginOption()
{
// 加载平台配置
$config = self::getPluginConfig();
$option = [];
foreach ($config as $value) {
if ($value['state'] == 0) {
continue;
}
$option[] = ['platform' => $value['platform'], 'name' => $value['name']];
}
return json($option);
}
// 获取指定插件配置
public static function getPluginInfo($platform = '')
{
$config = self::getPluginConfig();
$info = [];
foreach ($config as $item) {
if ($item['platform'] == $platform) {
$info = $item;
break;
}
}
return $info;
}
// 获取插件配置
private static function getPluginConfig(): array
{
$payplugin_path = config_path() . '/extend/payplugin.php';
if (!file_exists($payplugin_path)) {
return [];
}
// 加载插件配置
$payplugin_config = require $payplugin_path;
return $payplugin_config;
}
// 保存插件配置
private function savePluginConfig(array $config, string $note = '说明')
{
$payplugin_path = config_path() . '/extend/payplugin.php';
$note_tpl = <<<EOF
// +----------------------------------------------------------------------
// | $note
// +----------------------------------------------------------------------
EOF;
$config_str = "<?php\n" . $note_tpl . "\n\nreturn " . var_export($config, true) . ";\n";
\file_put_contents($payplugin_path, $config_str);
}
}