vr-shopxo-plugin/shopxo/app/service/StoreService.php

616 lines
22 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2099 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://opensource.org/licenses/mit-license.php )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\service;
use think\facade\Db;
use app\service\ConfigService;
use app\service\MultilingualService;
use app\service\ThemeAdminService;
use app\service\PluginsAdminService;
/**
* 应用商店服务层
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2019-06-16T00:33:28+0800
*/
class StoreService
{
// 站点商店数据缓存key
public static $site_store_info_key = 'admin_site_store_info_data';
/**
* 应用商店地址
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-12
* @desc description
* @param [array] $params [输入参数]
*/
public static function StoreUrl($params = [])
{
return self::RequestParamsString(MyConfig('shopxo.store_url'), $params);
}
/**
* 应用商店支付插件地址
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-12
* @desc description
* @param [array] $params [输入参数]
*/
public static function StorePaymentUrl($params = [])
{
return self::RequestParamsString(MyConfig('shopxo.store_payment_url'), $params);
}
/**
* 应用商店页面设计地址
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-12
* @desc description
* @param [array] $params [输入参数]
*/
public static function StoreDesignUrl($params = [])
{
return self::RequestParamsString(MyConfig('shopxo.store_design_url'), $params);
}
/**
* 应用商店DIY装修地址
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-12
* @desc description
* @param [array] $params [输入参数]
*/
public static function StoreDiyUrl($params = [])
{
return self::RequestParamsString(MyConfig('shopxo.store_diy_url'), $params);
}
/**
* 应用商店form表单地址
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-12
* @desc description
* @param [array] $params [输入参数]
*/
public static function StoreFormInputUrl($params = [])
{
return self::RequestParamsString(MyConfig('shopxo.store_forminput_url'), $params);
}
/**
* 应用商店主题地址
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-12
* @desc description
* @param [array] $params [输入参数]
*/
public static function StoreThemeUrl($params = [])
{
return self::RequestParamsString(MyConfig('shopxo.store_theme_url'), $params);
}
/**
* 请求参数
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-02-12
* @desc description
* @param [string] $url [url地址]
* @param [array] $params [输入参数]
*/
public static function RequestParamsString($url, $params = [])
{
// 当前管理员后台地址
$admin_url = explode('?', __MY_VIEW_URL__);
// 拼接商店请求参数地址
$join = (stripos($url, '?') === false) ? '?' : '&';
return $url.$join.'name='.urlencode(base64_encode(MyC('home_site_name'))).'&ver='.urlencode(base64_encode(APPLICATION_VERSION)).'&url='.urlencode(base64_encode(__MY_URL__)).'&host='.urlencode(base64_encode(__MY_HOST__)).'&ip='.urlencode(base64_encode(__MY_ADDR__)).'&admin_url='.urlencode(base64_encode($admin_url[0]));
}
/**
* 获取站点商店信息
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-04-16
* @desc description
*/
public static function SiteStoreInfo()
{
$res = MyCache(self::$site_store_info_key);
return empty($res) ? [] : $res;
}
/**
* 站点应用商店帐号绑定
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-04-16
* @desc description
* @param [array] $params [输入参数]
*/
public static function SiteStoreAccountsBind($params = [])
{
// 请求类型
$p = [
[
'checked_type' => 'length',
'key_name' => 'common_store_accounts',
'checked_data' => '1,80',
'error_msg' => MyLang('store_bind_form_accounts_message'),
],
[
'checked_type' => 'length',
'key_name' => 'common_store_password',
'checked_data' => '6,30',
'error_msg' => MyLang('store_bind_form_password_message'),
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 保存商店帐号信息
// 处理转义符号并加密
$save_data = [
'common_store_accounts' => $params['common_store_accounts'],
'common_store_password' => Authcode(htmlspecialchars_decode($params['common_store_password']), 'ENCODE'),
];
$ret = ConfigService::ConfigSave($save_data);
if($ret['code'] != 0)
{
return $ret;
}
// 绑定处理
$ret = self::SiteStoreAccountsBindHandle($params['common_store_accounts'], $params['common_store_password'], 'bind');
if($ret['code'] == 0)
{
// 清除插件缓存
$plugins = Db::name('Plugins')->column('plugins');
if(!empty($plugins) && is_array($plugins))
{
foreach($plugins as $v)
{
MyCache('plugins_legal_check_'.$v, null);
}
}
// 清除支付方式缓存
$payment = Db::name('Payment')->column('payment');
if(!empty($payment) && is_array($payment))
{
foreach($payment as $v)
{
MyCache('payment_legal_check_'.$v, null);
}
}
// 清除DIY缓存
$diy = Db::name('Diy')->column('md5_key');
if(!empty($diy) && is_array($diy))
{
foreach($diy as $v)
{
MyCache('diy_legal_check_'.$v, null);
}
}
// 清除主题缓存
$theme = ThemeAdminService::ThemeAdminList();
if(!empty($theme) && is_array($theme))
{
foreach($theme as $v)
{
if(!empty($v['theme']))
{
MyCache('theme_legal_check_'.$v['theme'], null);
}
}
}
}
return $ret;
}
/**
* 账号数据
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2023-08-17
* @desc description
*/
public static function AccountsData()
{
// 数据库配置中读取
$accounts = MyC('common_store_accounts');
$password = MyC('common_store_password');
// 缓存没有则从数据库读取
if(empty($accounts) || empty($password))
{
$info = Db::name('Config')->where('only_tag', 'in', ['common_store_accounts', 'common_store_password'])->column('value', 'only_tag');
if(!empty($info['common_store_accounts']))
{
$accounts = $info['common_store_accounts'];
}
if(!empty($info['common_store_password']))
{
$password = $info['common_store_password'];
}
}
// 存在密码则解密
if(!empty($password))
{
$password = Authcode($password, 'DECODE');
}
return [
'accounts' => $accounts,
'password' => $password,
];
}
/**
* 站点应用商店帐号绑定处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-04-16
* @desc description
* @param [string] $accounts [帐号]
* @param [string] $password [密码]
* @param [string] $type [类型 bind 主动绑定、auto 自动获取绑定信息]
*/
public static function SiteStoreAccountsBindHandle($accounts = '', $password = '', $type = 'bind')
{
// 是否存在失败缓存记录
if($type == 'auto')
{
$fail = MyCache(self::$site_store_info_key.'_fail');
if(!empty($fail))
{
return DataReturn($fail, -1);
}
}
// 帐号信息、站点初始化信息接口、帐号信息可以为空
if(empty($accounts) || empty($password))
{
$user = self::AccountsData();
$accounts = $user['accounts'];
$password = $user['password'];
}
// 获取信息
$res = self::RemoteStoreData($accounts, $password, MyConfig('shopxo.store_site_info_url'));
if($res['code'] == 0)
{
// 存储缓存、取远程给的时间未拿到时间则默认60分钟
$cache_time = (empty($res['data']['base']) || empty($res['data']['base']['cache_time'])) ? 3600 : intval($res['data']['base']['cache_time']);
MyCache(self::$site_store_info_key, $res['data'], $cache_time);
return DataReturn(MyLang('bind_success'), 0);
}
// 失败记录,自动执行则缓存时间期间不再次请求
MyCache(self::$site_store_info_key.'_fail', $res['msg'], 3600);
return $res;
}
/**
* 站点检查更新
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-04-18
* @desc description
* @param [array] $params [输入参数]
*/
public static function SiteInspectUpgrade($params = [])
{
// 帐号信息
$user = self::AccountsData();
// 获取信息
return self::RemoteStoreData($user['accounts'], $user['password'], MyConfig('shopxo.store_inspect_upgrade_url'));
}
/**
* 插件安全合法校验
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-04-19
* @desc description
* @param [array] $params [输入参数]
*/
public static function PluginsLegalCheck($params = [])
{
// 参数校验
if(empty($params) || empty($params['type']) || empty($params['plugins']))
{
return DataReturn(MyLang('store_plugins_params_error_tips'), -1);
}
// 帐号信息
$user = self::AccountsData();
if(empty($user['accounts']) || empty($user['password']))
{
return DataReturn(MyLang('store_account_not_bind_tips'), -300);
}
// 获取信息
$request_params = [
'plugins_type' => $params['type'],
'plugins_value' => $params['plugins'],
'plugins_author' => empty($params['author']) ? '' : $params['author'],
'plugins_ver' => empty($params['ver']) ? '' : empty($params['ver']),
'plugins_config' => isset($params['config']) ? $params['config'] : '',
];
return self::RemoteStoreData($user['accounts'], $user['password'], MyConfig('shopxo.store_plugins_legal_check_url'), $request_params);
}
/**
* 插件更新信息
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-04-21
* @desc description
* @param [array] $params [输入参数、插件信息]
*/
public static function PluginsUpgradeInfo($params = [])
{
if(!empty($params) && !empty($params['plugins_type']) && !empty($params['plugins_data']) && is_array($params['plugins_data']))
{
// 帐号信息
$user = self::AccountsData();
if(empty($user['accounts']) || empty($user['password']))
{
return DataReturn(MyLang('store_account_not_bind_tips'), -300);
}
// 获取更新信息
return self::RemoteStoreData($user['accounts'], $user['password'], MyConfig('shopxo.store_plugins_upgrade_info_url'), $params);
}
return DataReturn(MyLang('plugins_no_data_tips'), 0);
}
/**
* 远程获取数据
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-04-13
* @desc description
* @param [string] $accounts [帐号]
* @param [string] $password [密码]
* @param [string] $url [请求地址]
* @param [array] $params [额外参数]
* @param [array] $data_type[请求数据类型]
*/
public static function RemoteStoreData($accounts, $password, $url, $params = [], $data_type = 0)
{
// http状态验证
$key = 'cache_store_url_http_code';
$time = 600;
$ret = MyCache($key);
if(empty($ret))
{
$ret = GetHttpCode(self::StoreUrl(), 5);
MyCache($key, $ret, $time);
}
if(!in_array($ret['data'], [200, 301, 302, 307, 308]))
{
$ret['msg'] = MyLang('store_content_error_tips').'[ '.$ret['msg'].' ]';
return $ret;
}
// 基础数据获取
$bo = new \base\Behavior();
// 请求校验
$data = [
'accounts' => $accounts,
'authdata' => empty($password) ? '' : htmlspecialchars_decode($password),
'host' => __MY_HOST__,
'url' => __MY_URL__,
'ver' => APPLICATION_VERSION,
'server_port' => $bo->GetServerPort(),
'server_ip' => $bo->GetServerIP(),
'client_ip' => $bo->GetClientIP(),
'os' => $bo->GetOs(),
'browser' => $bo->GetBrowser(),
'scheme' => $bo->GetScheme(),
'version' => $bo->GetHttpVersion(),
'client' => $bo->GetClinet(),
'php_os' => PHP_OS,
'php_version' => PHP_VERSION,
'php_sapi_name' => php_sapi_name(),
'lang' => MultilingualService::GetUserMultilingualValue(),
'client_date' => date('Y-m-d H:i:s'),
];
$ret = CurlPost($url, array_merge($data, $params), $data_type, 60);
if($ret['code'] != 0)
{
// 网络不通
MyCache($key, 0, $ret['data']);
$ret['msg'] = MyLang('store_content_error_tips').'[ '.$ret['msg'].' ]';
return $ret;
}
// 数据解析
$result = json_decode($ret['data'], true);
if(empty($result))
{
return DataReturn(MyLang('store_respond_data_error_tips').(empty($ret['data']) ? '' : '('.$ret['data'].')'), -1);
}
// 是否非数组
if(is_string($result))
{
return DataReturn(MyLang('store_respond_data_invalid_tips').'[ '.$result.' ]', -1);
}
// 请求成功
if(isset($result['code']) && $result['code'] == 0)
{
if(empty($result['data']))
{
return DataReturn(MyLang('store_respond_empty_tips'), -1);
}
return $result;
}
return DataReturn(empty($result['msg']) ? MyLang('store_respond_data_empty_tips') : MyLang('store_respond_result_tips').'[ '.$result['msg'].' ]', -1);
}
/**
* 包数数据列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2022-04-19
* @desc description
* @param [array] $params [输入参数]
*/
public static function PackageDataList($params = [])
{
// 参数处理
$params['page_size'] = empty($params['page_size']) ? 18 : min(100, intval($params['page_size']));
// 帐号信息
$user = self::AccountsData();
if(empty($user['accounts']) || empty($user['password']))
{
return DataReturn(MyLang('store_account_not_bind_tips'), -300);
}
// 获取信息
$res = self::RemoteStoreData($user['accounts'], $user['password'], MyConfig('shopxo.store_package_data_list_url'), $params);
if($res['code'] == 0)
{
$data = $res['data'];
if(!empty($data['data_list']) && is_array($data['data_list']))
{
$type_data = [];
$type = array_unique(array_filter(array_column($data['data_list'], 'type')));
$store_plugins_value = array_filter(array_column($data['data_list'], 'store_plugins_value'));
if(!empty($type) && !empty($store_plugins_value))
{
foreach($type as $tv)
{
switch($tv)
{
// 插件
case 'plugins' :
$temp = PluginsAdminService::PluginsList();
if(!empty($temp['data']))
{
$plugins_arr = [];
if(!empty($temp['data']['dir_data']))
{
$plugins_arr = array_map(function($item)
{
return strtolower($item['plugins']);
}, $temp['data']['dir_data']);
}
if(!empty($temp['data']['db_data']))
{
$tem_map = array_map(function($item)
{
return strtolower($item['plugins']);
}, $temp['data']['db_data']);
$plugins_arr = array_merge($plugins_arr, $tem_map);
}
$type_data[$tv] = $plugins_arr;
}
break;
// web主题
case 'webtheme' :
$temp = ThemeAdminService::ThemeAdminList();
if(!empty($temp))
{
$type_data[$tv] = array_map(function($item)
{
return strtolower($item['theme']);
}, $temp);
}
break;
// 支付插件
case 'payment' :
$temp = PaymentService::PluginsPaymentList();
if(!empty($temp['data']))
{
$type_data[$tv] = array_map(function($item)
{
return strtolower($item['payment']);
}, $temp['data']);
}
break;
// diy
case 'diy' :
$type_data[$tv] = Db::name('Diy')->where(['md5_key'=>$store_plugins_value])->column('md5_key');
break;
}
}
}
foreach($data['data_list'] as &$v)
{
// 是否已安装
if(!empty($v['type']) && !empty($v['store_plugins_value']) && !empty($type_data) && !empty($type_data[$v['type']]) && in_array(strtolower($v['store_plugins_value']), $type_data[$v['type']]))
{
$v['buy_data']['title'] = MyLang('common_service.packageinstall.store_was_installed_text');
$v['buy_data']['status'] = 2;
}
// 拼接商品应用商店来源地址
$v['goods_url'] = self::RequestParamsString($v['goods_url']);
}
}
$result = [
'page' => empty($data['page']) ? 0 : $data['page'],
'page_start' => empty($data['page_start']) ? 0 : $data['page_start'],
'page_size' => empty($data['page_size']) ? 0 : $data['page_size'],
'page_total' => empty($data['page_total']) ? 0 : $data['page_total'],
'data_total' => empty($data['data_total']) ? 0 : $data['data_total'],
'data_list' => empty($data['data_list']) ? [] : $data['data_list'],
];
return DataReturn('success', 0, $result);
}
return $res;
}
}
?>