<?php
defined('IN_IA') or exit('Access Denied');
function wxapp_getpackage($data, $if_single = false) {
load()->classs('cloudapi');
$api = new CloudApi();
$result = $api->post('wxapp', 'download', $data, 'html');
if (is_error($result)) {
return error(-1, $result['message']);
} else {
if (strpos($result, 'error:') === 0) {
return error(-1, substr($result, 6));
}
}
return $result;
}
function wxapp_account_create($account) {
global $_W;
load()->model('account');
load()->model('user');
load()->model('permission');
$uni_account_data = array(
'name' => $account['name'],
'description' => $account['description'],
'title_initial' => get_first_pinyin($account['name']),
'groupid' => 0,
);
if (!pdo_insert('uni_account', $uni_account_data)) {
return error(1, '添加公众号失败');
}
$uniacid = pdo_insertid();
$account_data = array(
'uniacid' => $uniacid,
'type' => $account['type'],
'hash' => random(8),
);
pdo_insert('account', $account_data);
$acid = pdo_insertid();
$wxapp_data = array(
'acid' => $acid,
'token' => isset($account['token']) ? $account['token'] : random(32),
'encodingaeskey' => isset($account['encodingaeskey']) ? $account['encodingaeskey'] : random(43),
'uniacid' => $uniacid,
'name' => $account['name'],
'original' => $account['original'],
'level' => $account['level'],
'key' => $account['key'],
'secret' => $account['secret'],
);
pdo_insert('account_wxapp', $wxapp_data);
if (empty($_W['isfounder'])) {
$user_info = permission_user_account_num($_W['uid']);
uni_user_account_role($uniacid, $_W['uid'], ACCOUNT_MANAGE_NAME_OWNER);
if (empty($user_info['usergroup_wxapp_limit'])) {
pdo_update('account', array('endtime' => strtotime('+1 month', time())), array('uniacid' => $uniacid));
pdo_insert('site_store_create_account', array('endtime' => strtotime('+1 month', time()), 'uid' => $_W['uid'], 'uniacid' => $uniacid, 'type' => ACCOUNT_TYPE_APP_NORMAL));
}
}
if (user_is_vice_founder()) {
uni_user_account_role($uniacid, $_W['uid'], ACCOUNT_MANAGE_NAME_VICE_FOUNDER);
}
if (!empty($_W['user']['owner_uid'])) {
uni_user_account_role($uniacid, $_W['user']['owner_uid'], ACCOUNT_MANAGE_NAME_VICE_FOUNDER);
}
pdo_update('uni_account', array('default_acid' => $acid), array('uniacid' => $uniacid));
return $uniacid;
}
function wxapp_support_wxapp_modules() {
global $_W;
load()->model('user');
$modules = user_modules($_W['uid']);
$wxapp_modules = array();
if (!empty($modules)) {
foreach ($modules as $module) {
if ($module['wxapp_support'] == MODULE_SUPPORT_WXAPP) {
$wxapp_modules[$module['name']] = $module;
}
}
}
$store_table = table('store');
$store_table->searchWithEndtime();
$buy_wxapp_modules = $store_table->searchAccountBuyGoods($_W['uniacid'], STORE_TYPE_WXAPP_MODULE);
$extra_permission = table('account')->getAccountExtraPermission($_W['uniacid']);
$extra_modules = empty($extra_permission['modules']) ? array() : $extra_permission['modules'];
foreach ($extra_modules as $key => $value) {
$extra_modules[$value] = module_fetch($value);
unset($extra_modules[$key]);
}
$wxapp_modules = array_merge($buy_wxapp_modules, $wxapp_modules, $extra_modules);
if (empty($wxapp_modules)) {
return array();
}
$bindings = pdo_getall('modules_bindings', array('module' => array_keys($wxapp_modules), 'entry' => 'page'));
if (!empty($bindings)) {
foreach ($bindings as $bind) {
$wxapp_modules[$bind['module']]['bindings'][] = array('title' => $bind['title'], 'do' => $bind['do']);
}
}
return $wxapp_modules;
}
function wxapp_support_uniacid_modules($uniacid) {
$uni_modules = uni_modules_by_uniacid($uniacid);
$wxapp_modules = array();
if (!empty($uni_modules)) {
foreach ($uni_modules as $module_name => $module_info) {
if ($module_info['wxapp_support'] == MODULE_SUPPORT_WXAPP) {
$wxapp_modules[$module_name] = $module_info;
}
}
}
return $wxapp_modules;
}
function wxapp_fetch($uniacid, $version_id = '') {
global $_GPC;
load()->model('extension');
$wxapp_info = array();
$uniacid = intval($uniacid);
if (empty($uniacid)) {
return $wxapp_info;
}
if (!empty($version_id)) {
$version_id = intval($version_id);
}
$wxapp_info = pdo_get('account_wxapp', array('uniacid' => $uniacid));
if (empty($wxapp_info)) {
return $wxapp_info;
}
if (empty($version_id)) {
$wxapp_cookie_uniacids = array();
if (!empty($_GPC['__wxappversionids'])) {
$wxappversionids = json_decode(htmlspecialchars_decode($_GPC['__wxappversionids']), true);
foreach ($wxappversionids as $version_val) {
$wxapp_cookie_uniacids[] = $version_val['uniacid'];
}
}
if (in_array($uniacid, $wxapp_cookie_uniacids)) {
$wxapp_version_info = wxapp_version($wxappversionids[$uniacid]['version_id']);
}
if (empty($wxapp_version_info)) {
$sql = 'SELECT * FROM ' . tablename('wxapp_versions') . ' WHERE `uniacid`=:uniacid ORDER BY `id` DESC';
$wxapp_version_info = pdo_fetch($sql, array(':uniacid' => $uniacid));
}
} else {
$wxapp_version_info = pdo_get('wxapp_versions', array('id' => $version_id));
}
if (!empty($wxapp_version_info) && !empty($wxapp_version_info['modules'])) {
$wxapp_version_info['modules'] = iunserializer($wxapp_version_info['modules']);
if ($wxapp_version_info['design_method'] == WXAPP_MODULE) {
$module = current($wxapp_version_info['modules']);
$manifest = ext_module_manifest($module['name']);
if (!empty($manifest)) {
$wxapp_version_info['modules'][$module['name']]['version'] = $manifest['application']['version'];
} else {
$last_install_module = module_fetch($module['name']);
$wxapp_version_info['modules'][$module['name']]['version'] = $last_install_module['version'];
}
}
}
$wxapp_info['version'] = $wxapp_version_info;
$wxapp_info['version_num'] = explode('.', $wxapp_version_info['version']);
return $wxapp_info;
}
function wxapp_version_all($uniacid) {
load()->model('module');
$wxapp_versions = array();
$uniacid = intval($uniacid);
if (empty($uniacid)) {
return $wxapp_versions;
}
$wxapp_versions = pdo_getall('wxapp_versions', array('uniacid' => $uniacid), array('id'), '', array('id DESC'));
if (!empty($wxapp_versions)) {
foreach ($wxapp_versions as &$version) {
$version = wxapp_version($version['id']);
}
}
return $wxapp_versions;
}
function wxapp_get_some_lastversions($uniacid) {
$version_lasts = array();
$uniacid = intval($uniacid);
if (empty($uniacid)) {
return $version_lasts;
}
$version_lasts = table('wxapp')->latestVersion($uniacid);
$last_switch_version = wxapp_last_switch_version();
if (!empty($last_switch_version[$uniacid]) && !empty($version_lasts[$last_switch_version[$uniacid]['version_id']])) {
$version_lasts[$last_switch_version[$uniacid]['version_id']]['current'] = true;
} else {
reset($version_lasts);
$firstkey = key($version_lasts);
$version_lasts[$firstkey]['current'] = true;
}
return $version_lasts;
}
function wxapp_update_last_use_version($uniacid, $version_id) {
global $_GPC;
$uniacid = intval($uniacid);
$version_id = intval($version_id);
if (empty($uniacid) || empty($version_id)) {
return false;
}
$cookie_val = array();
if (!empty($_GPC['__wxappversionids'])) {
$wxapp_uniacids = array();
$cookie_val = json_decode(htmlspecialchars_decode($_GPC['__wxappversionids']), true);
if (!empty($cookie_val)) {
foreach ($cookie_val as &$version) {
$wxapp_uniacids[] = $version['uniacid'];
if ($version['uniacid'] == $uniacid) {
$version['version_id'] = $version_id;
$wxapp_uniacids = array();
break;
}
}
unset($version);
}
if (!empty($wxapp_uniacids) && !in_array($uniacid, $wxapp_uniacids)) {
$cookie_val[$uniacid] = array('uniacid' => $uniacid, 'version_id' => $version_id);
}
} else {
$cookie_val = array(
$uniacid => array('uniacid' => $uniacid, 'version_id' => $version_id),
);
}
isetcookie('__uniacid', $uniacid, 7 * 86400);
isetcookie('__wxappversionids', json_encode($cookie_val), 7 * 86400);
return true;
}
function wxapp_version($version_id) {
$version_info = array();
$version_id = intval($version_id);
if (empty($version_id)) {
return $version_info;
}
$cachekey = cache_system_key('wxapp_version', array('version_id' => $version_id));
$cache = cache_load($cachekey);
if (!empty($cache)) {
return $cache;
}
$version_info = pdo_get('wxapp_versions', array('id' => $version_id));
$version_info = wxapp_version_detail_info($version_info);
cache_write($cachekey, $version_info);
return $version_info;
}
function wxapp_version_by_version($version) {
global $_W;
$version_info = array();
$version = trim($version);
if (empty($version)) {
return $version_info;
}
$version_info = pdo_get('wxapp_versions', array('uniacid' => $_W['uniacid'], 'version' => $version));
$version_info = wxapp_version_detail_info($version_info);
return $version_info;
}
function wxapp_version_detail_info($version_info) {
global $_W;
if (empty($version_info) || empty($version_info['uniacid'])) {
return array();
}
$uni_modules = uni_modules_by_uniacid($version_info['uniacid']);
$uni_modules = array_keys($uni_modules);
$version_info['cover_entrys'] = array();
$version_info['last_modules'] = iunserializer($version_info['last_modules']);
if (!empty($version_info['modules'])) {
$version_info['modules'] = iunserializer($version_info['modules']);
if (!empty($version_info['modules'])) {
foreach ($version_info['modules'] as $i => $module) {
if (!empty($module['uniacid'])) {
$account = uni_fetch($module['uniacid']);
}
$module_info = module_fetch($module['name']);
$module_info['account'] = $account;
unset($version_info['modules'][$module['name']]);
if (!in_array($module['name'], $uni_modules)) {
continue;
}
$module_info['cover_entrys'] = module_entries($module['name'], array('cover'));
$module_info['defaultentry'] = $module['defaultentry'];
$module_info['newicon'] = $module['newicon'];
$version_info['modules'][] = $module_info;
}
}
}
if (count($version_info['modules']) > 0) {
$cover_entrys = !empty($version_info['modules'][0]['cover_entrys']) ? $version_info['modules'][0]['cover_entrys'] : array();
$version_info['cover_entrys'] = !empty($cover_entrys['cover']) ? $cover_entrys['cover'] : array();
}
if (!empty($version_info['quickmenu'])) {
$version_info['quickmenu'] = iunserializer($version_info['quickmenu']);
}
return $version_info;
}
function wxapp_site_info($multiid) {
$site_info = array();
$multiid = intval($multiid);
if (empty($multiid)) {
return array();
}
$site_info['slide'] = pdo_getall('site_slide', array('multiid' => $multiid));
$site_info['nav'] = pdo_getall('site_nav', array('multiid' => $multiid));
if (!empty($site_info['nav'])) {
foreach ($site_info['nav'] as &$nav) {
$nav['css'] = iunserializer($nav['css']);
}
unset($nav);
}
$recommend_sql = 'SELECT a.name, b.* FROM ' . tablename('site_category') . ' AS a LEFT JOIN ' . tablename('site_article') . ' AS b ON a.id = b.pcate WHERE a.parentid = 0 AND a.multiid = :multiid';
$site_info['recommend'] = pdo_fetchall($recommend_sql, array(':multiid' => $multiid));
return $site_info;
}
function wxapp_payment_param() {
global $_W;
$setting = uni_setting_load('payment', $_W['uniacid']);
$pay_setting = $setting['payment'];
return $pay_setting;
}
function wxapp_update_daily_visittrend() {
global $_W;
$yesterday = date('Ymd', strtotime('-1 days'));
$trend = pdo_get('wxapp_general_analysis', array('uniacid' => $_W['uniacid'], 'type' => WXAPP_STATISTICS_DAILYVISITTREND, 'ref_date' => $yesterday));
if (!empty($trend)) {
return true;
}
return wxapp_insert_date_visit_trend($yesterday);
}
function wxapp_insert_date_visit_trend($date) {
global $_W;
$account_api = WeAccount::create();
$wxapp_stat = $account_api->getDailyVisitTrend($date);
if (is_error($wxapp_stat) || empty($wxapp_stat)) {
return error(-1, '调用微信接口错误');
} else {
$insert_stat = array(
'uniacid' => $_W['uniacid'],
'session_cnt' => $wxapp_stat['session_cnt'],
'visit_pv' => $wxapp_stat['visit_pv'],
'visit_uv' => $wxapp_stat['visit_uv'],
'visit_uv_new' => $wxapp_stat['visit_uv_new'],
'type' => WXAPP_STATISTICS_DAILYVISITTREND,
'stay_time_uv' => $wxapp_stat['stay_time_uv'],
'stay_time_session' => $wxapp_stat['stay_time_session'],
'visit_depth' => $wxapp_stat['visit_depth'],
'ref_date' => $wxapp_stat['ref_date'],
);
pdo_insert('wxapp_general_analysis', $insert_stat);
}
return $insert_stat;
}
function wxapp_search_link_account($module_name = '') {
global $_W;
$module_name = trim($module_name);
if (empty($module_name)) {
return array();
}
$owned_account = uni_owned();
if (!empty($owned_account)) {
foreach ($owned_account as $key => $account) {
if (!in_array($account['type'], array(ACCOUNT_TYPE_OFFCIAL_NORMAL, ACCOUNT_TYPE_OFFCIAL_AUTH))) {
unset($owned_account[$key]);
}
$account['role'] = permission_account_user_role($_W['uid'], $account['uniacid']);
if (!in_array($account['role'], array(ACCOUNT_MANAGE_NAME_OWNER, ACCOUNT_MANAGE_NAME_FOUNDER))) {
unset($owned_account[$key]);
}
}
foreach ($owned_account as $key => $account) {
$account_modules = uni_modules_by_uniacid($account['uniacid']);
if (empty($account_modules[$module_name])) {
unset($owned_account[$key]);
} elseif ($account_modules[$module_name][MODULE_SUPPORT_ACCOUNT_NAME] != MODULE_SUPPORT_ACCOUNT || $account_modules[$module_name]['wxapp_support'] != MODULE_SUPPORT_WXAPP) {
unset($owned_account[$key]);
}
}
}
return $owned_account;
}
function wxapp_last_switch_version() {
global $_GPC;
static $wxapp_cookie_uniacids;
if (empty($wxapp_cookie_uniacids) && !empty($_GPC['__wxappversionids'])) {
$wxapp_cookie_uniacids = json_decode(htmlspecialchars_decode($_GPC['__wxappversionids']), true);
}
return $wxapp_cookie_uniacids;
}
function wxapp_code_generate($version_id) {
global $_W;
load()->classs('cloudapi');
$api = new CloudApi();
$version_info = wxapp_version($version_id);
$account_wxapp_info = wxapp_fetch($version_info['uniacid'], $version_id);
if (empty($account_wxapp_info)) {
return error(1, '版本不存在');
}
$siteurl = $_W['siteroot'] . 'app/index.php';
if (!empty($account_wxapp_info['appdomain'])) {
$siteurl = $account_wxapp_info['appdomain'];
}
if (!starts_with($siteurl, 'https')) { return error(1, '小程序域名必须为https');
}
if ($version_info['type'] == WXAPP_CREATE_MODULE && $version_info['entry_id'] <= 0) {
return error(1, '请先设置小程序入口');
}
$appid = $account_wxapp_info['key'];
$siteinfo = array(
'name' => $account_wxapp_info['name'],
'uniacid' => $account_wxapp_info['uniacid'],
'acid' => $account_wxapp_info['acid'],
'multiid' => $account_wxapp_info['version']['multiid'],
'version' => $account_wxapp_info['version']['version'],
'siteroot' => $siteurl,
'design_method' => $account_wxapp_info['version']['design_method'],
);
$commit_data = array('do' => 'generate',
'appid' => $appid,
'modules' => $account_wxapp_info['version']['modules'],
'siteinfo' => $siteinfo,
'tabBar' => json_decode($account_wxapp_info['version']['quickmenu'], true),
'wxapp_type' => isset($version_info['type']) ? $version_info['type'] : 0,
);
$do = 'upload2';
if ($version_info['use_default'] == 0) {
$appjson = wxapp_code_custom_appjson_tobase64($version_id);
if ($appjson) {
if (!isset($appjson['tabBar']['list'])) {
unset($appjson['tabBar']);
}
$commit_data['appjson'] = $appjson;
}
}
$data = $api->post('wxapp', $do, $commit_data,
'json', false);
return $data;
}
function wxapp_check_code_isgen($code_uuid) {
load()->classs('cloudapi');
$api = new CloudApi();
$data = $api->get('wxapp', 'upload', array('do' => 'check_gen',
'code_uuid' => $code_uuid, ),
'json', false);
return $data;
}
function wxapp_code_token() {
global $_W;
load()->classs('cloudapi');
$cloud_api = new CloudApi();
$data = $cloud_api->get('wxapp', 'upload', array('do' => 'code_token'), 'json', false);
return $data;
}
function wxapp_code_qrcode($code_token) {
$cloud_api = new CloudApi();
$data = $cloud_api->get('wxapp', 'upload', array('do' => 'qrcode',
'code_token' => $code_token, ),
'html', false);
return $data;
}
function wxapp_code_check_scan($code_token, $last) {
$cloud_api = new CloudApi();
$data = $cloud_api->get('wxapp', 'upload',
array('do' => 'checkscan',
'code_token' => $code_token,
'last' => $last,
),
'json', false);
return $data;
}
function wxapp_code_preview_qrcode($code_uuid, $code_token) {
$cloud_api = new CloudApi();
$commit_data = array(
'do' => 'preview_qrcode',
'code_uuid' => $code_uuid,
'code_token' => $code_token,
);
$data = $cloud_api->post('wxapp', 'upload', $commit_data,
'json', false);
return $data;
}
function wxapp_code_commit($code_uuid, $code_token, $user_version = 3, $user_desc = '代码提交') {
$cloud_api = new CloudApi();
$commit_data = array(
'do' => 'commitcode',
'code_uuid' => $code_uuid,
'code_token' => $code_token,
'user_version' => $user_version,
'user_desc' => $user_desc,
);
$data = $cloud_api->post('wxapp', 'upload', $commit_data,
'json', false);
return $data;
}
function wxapp_update_entry($version_id, $entry_id) {
return pdo_update('wxapp_versions', array('entry_id' => $entry_id), array('id' => $version_id));
}
function wxapp_code_current_appjson($version_id) {
load()->classs('cloudapi');
$version_info = wxapp_version($version_id);
if (!$version_info['use_default'] && isset($version_info['appjson'])) {
return iunserializer($version_info['appjson']);
}
if ($version_info['use_default']) {
$appjson = $version_info['default_appjson'];
if ($appjson) {
return iunserializer($appjson);
}
$cloud_api = new CloudApi();
$account_wxapp_info = wxapp_fetch($version_info['uniacid'], $version_id);
$commit_data = array('do' => 'appjson',
'wxapp_type' => isset($version_info['type']) ? $version_info['type'] : 0,
'modules' => $account_wxapp_info['version']['modules'],
);
$cloud_appjson = $cloud_api->get('wxapp', 'upload2', $commit_data,
'json', false);
if (is_error($cloud_appjson)) { return null;
}
$appjson = $cloud_appjson['data']['appjson'];
pdo_update('wxapp_versions', array('default_appjson' => serialize($appjson)),
array('id' => $version_id));
cache_delete(cache_system_key("wxapp_version:{$version_id}"));
return $appjson;
}
}
function wxapp_code_custom_appjson_tobase64($version_id) {
load()->classs('image');
$version_info = wxapp_version($version_id);
$appjson = iunserializer($version_info['appjson']);
if (!$appjson) {
return false;
}
if (isset($appjson['tabBar']) && isset($appjson['tabBar']['list'])) {
$tablist = &$appjson['tabBar']['list'];
foreach ($tablist as &$item) {
if (isset($item['iconPath']) && !starts_with($item['iconPath'], 'data:image')) {
$item['iconPath'] = Image::create($item['iconPath'])->resize(81, 81)->toBase64();
}
if (isset($item['selectedIconPath']) && !starts_with($item['selectedIconPath'], 'data:image')) {
$item['selectedIconPath'] = Image::create($item['selectedIconPath'])->resize(81, 81)->toBase64();
}
}
}
return $appjson;
}
function wxapp_code_path_convert($attachment_id) {
load()->classs('image');
load()->func('file');
$attchid = intval($attachment_id);
global $_W;
$att_table = table('attachment');
$attachment = $att_table->getById($attchid);
if ($attachment) {
$attach_path = $attachment['attachment'];
$ext = pathinfo($attach_path, PATHINFO_EXTENSION);
$url = tomedia($attach_path);
$uniacid = intval($_W['uniacid']);
$path = "images/{$uniacid}/" . date('Y/m/');
mkdirs($path);
$filename = file_random_name(ATTACHMENT_ROOT . '/' . $path, $ext);
Image::create($url)->resize(81, 81)->saveTo(ATTACHMENT_ROOT . $path . $filename);
$attachdir = $_W['config']['upload']['attachdir'];
return $_W['siteroot'] . $attachdir . '/' . $path . $filename;
}
return null;
}
function wxapp_code_save_appjson($version_id, $json) {
$result = pdo_update('wxapp_versions', array('appjson' => serialize($json), 'use_default' => 0), array('id' => $version_id));
cache_delete(cache_system_key("wxapp_version:{$version_id}"));
return $result;
}
function wxapp_code_set_default_appjson($version_id) {
$result = pdo_update('wxapp_versions', array('appjson' => '', 'use_default' => 1), array('id' => $version_id));
cache_delete(cache_system_key("wxapp_version:{$version_id}"));
return $result;
}