$id, 'type' => $type, 'terminal' => $terminal, 'url' => MyUrl('admin/packageinstall/install'), 'admin_url' => MyUrl('admin/index/index', ['to_url'=>urlencode(base64_encode($url))]), ]; } /** * 软件安装 * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @date 2021-02-22 * @desc description * @param [array] $params [输入参数] */ public static function Install($params = []) { // 参数校验 $ret = self::ParamsCheck($params); if($ret['code'] != 0) { return $ret; } // 操作类型 switch($params['opt']) { // 获取url地址 case 'url' : $ret = self::UrlHandle($params); break; // 下载软件包 case 'download' : $ret = self::DownloadHandle($params['key']); break; // 安装软件包 case 'install' : $ret = self::InstallHandle($params); break; } return $ret; } /** * 安装软件包 * @author Devil * @blog http://gong.gg/ * @version 1.0.0 * @date 2021-02-22 * @desc description * @param [array] $params [输入参数] */ public static function InstallHandle($params) { // 获取目录文件 $res = self::DirFileData($params['key']); if(!file_exists($res['url'])) { return DataReturn('软件包不存在、请重新安装', -1); } // 根据插件类型调用安装程序 switch($params['type']) { // 功能插件 case 'plugins' : $ret = PluginsAdminService::PluginsUploadHandle($res['url'], $params); break; // 支付插件 case 'payment' : $ret = PaymentService::UploadHandle($res['url'], $params); break; // web主题 case 'webtheme' : $ret = ThemeService::ThemeUploadHandle($res['url'], $params); break; // 小程序主题 case 'minitheme' : echo '
';
print_r($res);
print_r($params);die;
break;
// 默认
default :
$ret = DataReturn('插件操作类型未定义['.$params['type'].']', -1);
}
// 移除session
session($params['key'], null);
// 删除本地文件
\base\FileUtil::UnlinkFile($res['url']);
return $ret;
}
/**
* 下载软件包
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-22
* @desc description
* @param [string] $key [缓存key]
*/
public static function DownloadHandle($key)
{
// 获取下载地址
$url = session($key);
if(empty($url))
{
return DataReturn('下载地址为空', -1);
}
// 获取目录文件
$res = self::DirFileData($key);
// 目录不存在则创建
\base\FileUtil::CreateDir($res['dir'].$res['path']);
// 下载保存
if(@file_put_contents($res['url'], RequestGet($url)) !== false)
{
return DataReturn('success', 0, $key);
}
return DataReturn('插件下载失败', -1);
}
/**
* 获取下载地址
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-22
* @desc description
* @param [array] $params [输入参数]
*/
public static function UrlHandle($params)
{
// 获取下载地址
$url = config('shopxo.store_download_url');
$data = [
'goods_id' => $params['id'],
'url' => __MY_URL__,
'host' => __MY_HOST__,
'ip' => __MY_ADDR__,
'ver' => APPLICATION_VERSION,
'terminal' => empty($params['terminal']) ? '' : $params['terminal'],
];
$ret = self::HttpRequest($url, $data);
if(!empty($ret) && isset($ret['code']) && $ret['code'] == 0)
{
$key = md5($ret['data']);
session($key, $ret['data']);
$ret['data'] = $key;
}
return $ret;
}
/**
* 获取软件存储信息
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-22
* @desc description
* @param [string] $key [缓存key]
*/
public static function DirFileData($key)
{
// 将软件包下载到磁盘
$dir = ROOT;
$path = 'runtime'.DS.'data'.DS.'plugins_package_install'.DS;
$filename = $key.'.zip';
// 目录不存在则创建
\base\FileUtil::CreateDir($dir.$path);
return [
'dir' => $dir,
'path' => $path,
'file' => $filename,
'url' => $dir.$path.$filename,
];
}
/**
* 输入参数校验
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-22
* @desc description
* @param [array] $params [输入参数]
*/
public static function ParamsCheck($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'id',
'error_msg' => '商品id有误',
],
[
'checked_type' => 'empty',
'key_name' => 'type',
'error_msg' => '插件类型有误',
],
[
'checked_type' => 'in',
'key_name' => 'opt',
'checked_data' => ['url', 'download', 'install'],
'error_msg' => '操作类型有误',
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 下载和安装需要校验key
if(in_array($params['opt'], ['download', 'install']) && empty($params['key']))
{
return DataReturn('操作key有误', -1);
}
return DataReturn('success', 0);
}
/**
* 网络请求
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-22
* @desc description
* @param [string] $url [请求url]
* @param [array] $data [发送数据]
* @return [json] [请求返回数据]
*/
public static function HttpRequest($url, $data)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_FAILONERROR, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
$body_string = '';
if(is_array($data) && 0 < count($data))
{
foreach($data as $k => $v)
{
$body_string .= $k.'='.urlencode($v).'&';
}
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $body_string);
}
$headers = [
'Content-type: application/x-www-form-urlencoded;charset=UTF-8',
'X-Requested-With: XMLHttpRequest',
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$reponse = curl_exec($ch);
$error = curl_errno($ch);
curl_close($ch);
if($error)
{
return DataReturn("curl出错,错误码:$error", -1);
}
// 是否json格式数据
if(substr($reponse, 0, 1) != '{')
{
return DataReturn("返回数据格式有误:$reponse", -1);
}
return json_decode($reponse, true);
}
}
?>