'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; } } ?>