get('gid')); $is_xufei = 0; if (isset($this->member['groupid'][$gid]) && $this->member['groupid'][$gid]) { if (!$this->member['groupid'][$gid]['setting']['timetype'] && !$this->member['groupid'][$gid]['setting']['level']['auto'] && !$this->member['groupid'][$gid]['setting']['timeout']) { if (!$this->member_cache['group'][$gid]['setting']['timect'] && $this->member_cache['group'][$gid]['etime'] - SYS_TIME > 0) { // 时长叠加未开启 $this->_msg(0, dr_lang('当前用户组没有过期,无需重复操作')); exit; } if ($this->member['groupid'][$gid]['level']) { // 开启了等级功能 $this->level();exit; } $is_xufei = 1; } else { $this->_msg(0, dr_lang('已经申请过,无需重复申请')); } } $group = $this->member_cache['group'][$gid]; if (!$group) { $this->_msg(0, dr_lang('用户组[%s]不存在', $gid)); } elseif (!$group['apply']) { $this->_msg(0, dr_lang('用户组[%s]没有开启申请权限', $group['name'])); } // 申请用户组之前的钩子 \Phpcmf\Hooks::trigger('member_apply_group_before', ['uid' => $this->uid, 'gid' => $gid]); $is_pay = 1; // 判断是否已经申请 $verify = \Phpcmf\Service::M()->db->table('member_group_verify')->where('uid', $this->uid)->where('gid', $gid)->get()->getRowArray(); if ($verify) { if (!$verify['status']) { $this->_msg(0, dr_lang('正在审核之中')); } $verify['content'] = dr_string2array($verify['content']); if ($verify['price'] < $group['price']) { // 当审核被拒绝时,之前付款的价格小于现在价格,需要补差价 $group['price'] = $group['price'] - $verify['price']; } else { $is_pay = 0; } } $level = $group['level'] && !$group['setting']['level']['auto'] ? $group['level'] : []; // 判断是否存在用户组级别,并且设置为手动模式才可以选择申请 if ($level) { foreach ($level as $i => $t) { if (!$t['apply']) { unset($level[$i]); } } } // 初始化自定义字段类 \Phpcmf\Service::L('Field')->app(APP_DIR); // 获取该组可用字段 $field = []; if ($this->member_cache['field'] && $this->member_cache['group'][$gid]['field']) { foreach ($this->member_cache['field'] as $fname => $t) { dr_in_array($fname, $this->member_cache['group'][$gid]['field']) && $field[$fname] = $t; } } //print_r($this->member_cache);exit; if (IS_POST) { $lid = 0; $post = \Phpcmf\Service::L('input')->post('data'); $my_verify = $attach = []; if ($field) { // id设置0,表示审核被拒时还可以修改不可修改的字段 list($data, $return, $attach) = \Phpcmf\Service::L('Form')->id(0)->validation($post, null, $field, $verify ? dr_string2array($verify['content']) : $this->member); // 输出错误 $return && $this->_json(0, $return['error'], ['field' => $return['name']]); // 审核申请 $my_verify['content'] = $data[1]; } // 附件归档 SYS_ATTACHMENT_DB && $attach && \Phpcmf\Service::M('Attachment')->handle( $this->member['id'], \Phpcmf\Service::M()->dbprefix('member').'-'.$this->uid, $attach ); // 不重复扣款 if ($is_pay) { $todo = 0; if (!$group['setting']['level']['auto'] && $level) { // 不开启自动升级的时候进入 // 价格判断 $lid = (int)\Phpcmf\Service::L('input')->post('lid'); if (!$lid) { $this->_json(0, dr_lang('用户组级别未选择')); } elseif (!$group['level'][$lid]) { $this->_json(0, dr_lang('用户组级别无效')); } elseif (!$group['level'][$lid]['apply']) { $this->_json(0, dr_lang('用户组级别不允许申请')); } $title = dr_lang(($is_xufei ? '续费' : '申请').'用户组(%s): %s', $group['name'], $group['level'][$lid]['name']); if ($group['level'][$lid]['value']) { // 存在价格时才扣钱 if ($group['unit']) { // 金币 $price = (int)$group['level'][$lid]['value']; // 金币不足 if ($this->member['score'] - $price < 0) { $this->_json(0, dr_lang('账户%s不足', SITE_SCORE)); } // 扣分 $rt = \Phpcmf\Service::M('member')->add_score($this->uid, -$price, $title, '', ''); if (!$rt['code']) { $this->_json(0, $rt['msg']); } // 提醒通知 \Phpcmf\Service::M('member')->notice($this->uid, 2, $title); } else { // rmb if (!dr_is_app('pay')) { $this->_msg(0, '没有安装「支付系统」插件');exit; } $price = (int)$group['level'][$lid]['value']; // 支付方式 $pay_type = \Phpcmf\Service::L('input')->post('pay_type'); !$pay_type && $pay_type = 'finecms'; // 唤起支付接口 $pay = [ 'mark' => 'group-'.$group['id'].'-'.$lid.'-'.(int)$verify['id'], 'uid' => $this->member['uid'], 'username' => $this->member['username'], 'type' => $pay_type, 'url' => '', 'result' => dr_array2string($my_verify), 'money' => $price, 'title' => $title ]; $rt = \Phpcmf\Service::M('Pay', 'pay')->post($pay); if (!$rt['code']) { $this->_msg(0, $rt['msg']);exit; } // 必须跳转到统一的主域名中付款 $url = PAY_URL . 'index.php?s=api&c=pay&id=' . $rt['code']; if (IS_AJAX || IS_API_HTTP) { // 回调页面 $rt['data']['url'] = $url; $this->_json($rt['code'], dr_lang('请稍后'), $rt['data']); exit; } else { // 跳转到支付页面 dr_redirect($url, 'auto'); exit; } } } $todo = 1; } // 其他情况按组价格来算 if ($group['price'] > 0 && $todo == 0) { // 存在价格时 $title = dr_lang(($is_xufei ? '续费' : '申请').'用户组(%s)', $group['name']); if ($group['unit']) { // 金币 $price = (int)$group['price']; // 金币不足 if ($this->member['score'] - $price < 0 ) { $this->_json(0, dr_lang('账户%s不足', SITE_SCORE)); } // 扣分 $rt = \Phpcmf\Service::M('member')->add_score($this->uid, -$price, $title); if (!$rt['code']) { $this->_json(0, $rt['msg']); } // 提醒通知 \Phpcmf\Service::M('member')->notice($this->uid, 2, $title); } else { // rmb if (!dr_is_app('pay')) { $this->_msg(0, '没有安装「支付系统」插件');exit; } $price = floatval($group['price']); // 支付方式 $pay_type = \Phpcmf\Service::L('input')->post('pay_type'); !$pay_type && $pay_type = 'finecms'; // 唤起支付接口 $pay = [ 'mark' => 'group-'.$group['id'].'-0-'.(int)$verify['id'], 'uid' => $this->member['uid'], 'username' => $this->member['username'], 'type' => $pay_type, 'url' => '', 'result' => dr_array2string($my_verify), 'money' => $price, 'title' => $title ]; $rt = \Phpcmf\Service::M('Pay', 'pay')->post($pay); if (!$rt['code']) { $this->_msg(0, $rt['msg']);exit; } // 必须跳转到统一的主域名中付款 $url = PAY_URL . 'index.php?s=api&c=pay&id=' . $rt['code']; if (IS_AJAX || IS_API_HTTP) { // 回调页面 $rt['data']['url'] = $url; $this->_json($rt['code'], dr_lang('请稍后'), $rt['data']); exit; } else { // 跳转到支付页面 dr_redirect($url, 'auto'); exit; } } } } // 入库存储 $rt = \Phpcmf\Service::M('member')->apply_group( $verify['id'], $this->member, $gid, $lid, $price, $my_verify ); if (!$rt['code']) { $this->_json(0, $rt['msg']); } $this->_json(1, $rt['msg'], ['url' => MEMBER_URL]); } // 付款方式 \Phpcmf\Service::V()->assign([ 'form' => dr_form_hidden(), 'level' => $level, 'group' => $group, 'verify' => $verify, 'myfield' => \Phpcmf\Service::L('Field')->toform(0, $field, $verify ? dr_string2array($verify['content']) : $this->member), 'is_xufei' => $is_xufei, 'pay_type' => dr_is_app('pay') ? \Phpcmf\Service::M('pay', 'pay')->get_pay_type(1) : [], 'meta_title' => dr_lang(($is_xufei ? '续费' : '申请').'用户组').SITE_SEOJOIN.dr_lang('用户中心') ]); \Phpcmf\Service::V()->display(is_file(dr_tpl_path(1).'apply_'.$gid.'.html') ? 'apply_'.$gid.'.html' : 'apply_index.html'); } /** * 升级用户组级别 */ public function level() { $gid = intval(\Phpcmf\Service::L('input')->get('gid')); if (!$this->member['groupid'][$gid]) { $this->_msg(0, dr_lang('你还不是该用户组成员')); } $group = $this->member_cache['group'][$gid]; if ($group['setting']['level']['auto']) { $this->_msg(0, dr_lang('此用户组是自动升级模式')); } elseif (!$group['level']) { if (!$this->member['groupid'][$gid]['setting']['timetype'] && !$this->member['groupid'][$gid]['setting']['level']['auto'] && !$this->member['groupid'][$gid]['setting']['timeout'] && !$this->member['groupid'][$gid]['level'] ) { // 没有开启等级,判断组是否运行续费功能 $this->index();exit; } $this->_msg(0, dr_lang('此用户组没有创建用户级别')); } $mylid = (int)$this->member['levelid'][$gid]; // 我的当前级别 $myvalue = !$group['setting']['level']['price'] ? (int)$group['level'][$mylid]['value'] : 0; // 我的当前级别的升级值 if (!$group['level'][$mylid]['apply']) { $this->_msg(0, dr_lang('当前级别不允许升级')); } // 列出当前可用的升级级别 $level = []; $level2 = $group['level']; $is_xufei = 0; foreach ($level2 as $i => $t) { if (!$t['value']) { continue; } if ($mylid == $t['id'] && $group['setting']['timetype'] && !$group['setting']['level']['auto']) { $t['value2'] = $t['value']; $t['value'] = $t['setting']['xufei'] ? $t['setting']['xufei'] : $t['value']; $is_xufei = 1; } else { if ($mylid == $t['id']) { continue; } $t['value2'] = $t['value']; $t['value'] = $t['value'] - $myvalue; } $level[$t['id']] = $t; } if (!$level) { $this->_msg(0, dr_lang('没有可用的用户组级别')); } if (IS_POST) { $lid = intval($_POST['lid']); if (!$level[$lid]) { $this->_json(0, dr_lang('用户组级别不存在')); } elseif (!$level[$lid]['apply']) { $this->_json(0, dr_lang('用户组级别不允许升级')); } elseif ($level[$lid]['value'] < 0) { $this->_json(0, dr_lang('用户组级别升级值不规范')); } // 申请用户组的级别之前的钩子 \Phpcmf\Hooks::trigger('member_apply_level_before', ['uid' => $this->uid, 'gid' => $gid, 'lid' => $lid]); $price = $level[$lid]['value']; if ($is_xufei) { $title = dr_lang('用户组(%s)续费: %s', $group['name'], $group['level'][$lid]['name']); } else { $title = dr_lang('用户组(%s)升级: %s', $group['name'], $group['level'][$lid]['name']); } if ($price > 0) { // 存在价格时才扣钱 if ($group['unit']) { // 金币 $price = (int)$price; // 金币不足 $this->member['score'] - $price < 0 && $this->_json(0, dr_lang('账户%s不足', SITE_SCORE)); // 扣分 $rt = \Phpcmf\Service::M('member')->add_score($this->uid, -$price, $title); if (!$rt['code']) { $this->_json(0, $rt['msg']); } // 提醒通知 \Phpcmf\Service::M('member')->notice($this->uid, 2, $title); } else { // rmb if (!dr_is_app('pay')) { $this->_msg(0, '没有安装「支付系统」插件');exit; } $price = floatval($price); // 支付方式 $pay_type = \Phpcmf\Service::L('input')->post('pay_type'); !$pay_type && $pay_type = 'finecms'; // 唤起支付接口 $pay = [ 'mark' => 'level-' . $group['id'] . '-' . $lid, 'uid' => $this->member['uid'], 'username' => $this->member['username'], 'type' => $pay_type, 'url' => '', 'result' => '', 'money' => $price, 'title' => $title ]; $rt = \Phpcmf\Service::M('Pay', 'pay')->post($pay); if (!$rt['code']) { $this->_msg(0, $rt['msg']); exit; } // 必须跳转到统一的主域名中付款 $url = PAY_URL . 'index.php?s=api&c=pay&id=' . $rt['code']; if (IS_AJAX || IS_API_HTTP) { // 回调页面 $rt['data']['url'] = $url; $this->_json($rt['code'], dr_lang('请稍后'), $rt['data']); exit; } else { // 跳转到支付页面 dr_redirect($url, 'auto'); exit; } } } \Phpcmf\Service::M('member')->update_level($this->uid, $gid, $lid); if ($is_xufei) { $this->_json(1, dr_lang('开通成功'), ['url' => MEMBER_URL]); } else { $this->_json(1, dr_lang('续费成功'), ['url' => MEMBER_URL]); } exit; } // 删除不可用的升级级别 if ($level) { foreach ($level as $i => $t) { if (!$t['apply']) { unset($level[$i]); } } } \Phpcmf\Service::V()->assign([ 'form' => dr_form_hidden(), 'level' => $level, 'group' => $group, 'myvalue' => $myvalue, 'is_xufei' => $is_xufei, 'pay_type' => dr_is_app('pay') ? \Phpcmf\Service::M('pay', 'pay')->get_pay_type(1) : [], 'meta_title' => dr_lang(($is_xufei ? '续费' : '升级').'用户组级别').SITE_SEOJOIN.dr_lang('用户中心') ]); \Phpcmf\Service::V()->display(is_file(dr_tpl_path(1).'apply_level_'.$gid.'.html') ? 'apply_level_'.$gid.'.html' : 'apply_level.html'); } }