,请返回重试'); $safe_url = htmlspecialchars($url, ENT_QUOTES, 'UTF-8'); echo '正在跳转到支付页面
正在为您跳转到支付页面,请稍候...
无法跳转请点这里
'; exit; } function special_codepay_verify_request($special_arr = array()) { $key = isset($special_arr['special_codepay_key']) ? $special_arr['special_codepay_key'] : ''; $params = !empty($_POST) ? $_POST : $_GET; $sign = isset($params['sign']) ? $params['sign'] : ''; if(empty($key) || empty($sign)) return FALSE; $data = array(); foreach($params as $k => $v) { if($k == 'sign' || $k == 'sign_type' || $v === '') continue; $data[$k] = stripslashes($v); } ksort($data); $signstr = ''; foreach($data as $k => $v) { $signstr .= ($signstr ? '&' : '') . $k . '=' . $v; } return hash_equals(strtolower(md5($signstr . $key)), strtolower($sign)); } function special_codepay_done($is_notify, $success, $message) { if($is_notify) { echo $success ? 'success' : 'fail'; exit; } message($success ? 0 : 1, jump($message, url('user-special'), 1)); } function special_codepay_query_trade($special_arr = array(), $special_order = '', $trade_status = '', $uid = 0, $is_notify = FALSE) { empty($special_order) AND special_codepay_done($is_notify, FALSE, '订单号不能为空'); empty($trade_status) AND special_codepay_done($is_notify, FALSE, '支付状态不能为空'); $verify_ok = special_codepay_verify_request($special_arr); if(!$verify_ok) { special_code_error(array('msg'=>'会员支付签名校验失败', 'order'=>$special_order, 'is_notify'=>$is_notify, 'request'=>$_REQUEST), 'special_codepay_error'); if($is_notify) special_codepay_done($is_notify, FALSE, '签名校验失败'); $_order = special_syn_api($special_order, $special_arr); if(!empty($_order) && !empty($_order['code']) && $_order['code'] == '1' && !empty($_order['status']) && $_order['status'] == '1') { $trade_status = 'TRADE_SUCCESS'; if(isset($_order['money'])) $_REQUEST['money'] = $_order['money']; if(isset($_order['pid'])) $_REQUEST['pid'] = $_order['pid']; if(isset($_order['type'])) $_REQUEST['type'] = $_order['type']; } else { special_codepay_done($is_notify, FALSE, '支付结果确认失败,请稍后刷新或联系管理员'); } } $special_codepay_order = db_find_one('mw_special_paylog', array('order' => $special_order)); empty($special_codepay_order) AND special_codepay_done($is_notify, FALSE, '订单不存在'); if(intval($special_codepay_order['state']) == 1) { special_codepay_done($is_notify, TRUE, '订单已处理完成,即将跳转,请稍候...'); } $pay_money = isset($_REQUEST['money']) ? $_REQUEST['money'] : ''; $pay_pid = isset($_REQUEST['pid']) ? (string)$_REQUEST['pid'] : ''; $pay_type = isset($_REQUEST['type']) ? (string)$_REQUEST['type'] : ''; $configured_pid = isset($special_arr['special_codepay_pid']) ? (string)$special_arr['special_codepay_pid'] : ''; if ($configured_pid === '' || $pay_pid === '' || $pay_pid !== $configured_pid) { special_codepay_done($is_notify, FALSE, '商户号不匹配'); } if ($pay_type === '' || $pay_type !== (string)$special_codepay_order['paytype']) { special_codepay_done($is_notify, FALSE, '支付方式不匹配'); } if($pay_money === '' || !is_numeric($pay_money) || abs(floatval($pay_money) - floatval($special_codepay_order['amount'])) > 0.001) { special_code_error(array('msg'=>'会员支付金额不匹配', 'order'=>$special_order, 'notify_money'=>$pay_money, 'order_amount'=>$special_codepay_order['amount']), 'special_codepay_error'); special_codepay_done($is_notify, FALSE, '支付金额不匹配'); } if ($special_codepay_order && empty($special_codepay_order['daoqi'])) { if ($trade_status == "TRADE_SUCCESS" || $trade_status == "TRADE_FINISHED") { $months = $special_codepay_order['months']; $order_uid = intval($special_codepay_order['uid']); empty($order_uid) AND special_codepay_done($is_notify, FALSE, '订单用户不存在'); $special_daoqi = special_grant_rewards($order_uid, $months); $r = db_update('mw_special_paylog', array('order' => $special_order), array('daoqi' => $special_daoqi, 'state' => 1, 'confirm' => time())); if ($r !== FALSE) { $_user = user_read($order_uid); if(!empty($_user['email'])) { special_mail_code($special_codepay_order['order'], $special_codepay_order['create'], $months, $_user['email']); } special_codepay_done($is_notify, TRUE, '支付成功,即将跳转,请稍候...'); } special_codepay_done($is_notify, FALSE, '订单更新失败'); } special_codepay_done($is_notify, FALSE, '订单未支付'); } else { special_codepay_done($is_notify, TRUE, '订单已处理完成,即将跳转,请稍候...'); } } /* 废弃*/ function special_url_doPay($special_order, $special_payurl, $sid){ $special_url_order = db_find_one('mw_special_paylog',array('order'=>$special_order)); if(empty($special_url_order)){ db_insert('mw_special_paylog',array('paytype'=>$_GET['paytype'],'sid'=>$sid,'order'=>$_GET['order'],'amount'=>$_GET['amount'],'create'=>$_GET['create'],'payurl'=>$payurl)); } $url = url('user-special').'?special_order='.$special_order; header("Location:{$url}"); } function special_mail_code($special_order, $special_create ,$months ,$special_email){ global $conf; $message = lang('mail_code_template', array('special_order'=>$special_order,'months'=>$months, 'sitename'=>$conf['sitename'], 'special_create'=>date('Y-m-d H:i',$special_create+86400 * 10))); $smtplist = include _include(APP_PATH.'conf/smtp.conf.php'); $n = array_rand($smtplist); $smtp = $smtplist[$n]; xn_send_mail($smtp, $conf['sitename'], $special_email, $conf['sitename'].' - 购买会员', $message); } if (!function_exists('form_checkbox_multiple')) { function form_checkbox_multiple($name, $arr, $checked = array()) { $s = ''; foreach ($arr as $value => $text) { $ischecked = in_array($value, $checked); $add = $ischecked ? ' checked="checked"' : ''; $s .= ''; } return $s; } } function special_code_error($s = '', $file = 'special_code_error'){ if($s){ global $conf, $time, $ip; $day = date('Ym', $time); $mtime = date('Y-m-d H:i:s', $time); $urls = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : ''; $parsed_url = parse_url($urls); $url = $parsed_url['path']; $logpath = $conf['log_path'].$day; !is_dir($logpath) AND mkdir($logpath, 0644, true); $s = xn_json_encode($s); $s = "$mtime\t$ip\t$url\r\n$s\r\n"; file_put_contents($logpath."/{$file}.php", $s, FILE_APPEND); } } function mw_special_create($form, $arr) { $r = db_insert($form, $arr); return $r; } function mw_special_update($form, $field, $id, $arr) { $r = db_update($form, array($field=>$id), $arr); return $r; } function mw_special_read($form, $field, $id) { $thread = db_find_one($form, array($field=>$id)); return $thread; } /** * 紫名资格必须以当前有效期为准,不能只依赖用户表中可能滞后的 gid。 * 请求内缓存结果,避免同一页面重复查询会员表。 */ if (!function_exists('mw_special_active_cache_set')) { function mw_special_active_cache_set($uid, $out_time, $now = 0, $max_ttl = 300) { $uid = intval($uid); $out_time = max(0, intval($out_time)); $now = $now ? intval($now) : time(); $max_ttl = max(1, intval($max_ttl)); $ttl = $out_time > $now ? max(1, min($max_ttl, $out_time - $now)) : 60; if ($uid > 0) cache_set('mw_special_out_time_'.$uid, $out_time, $ttl); } } if (!function_exists('mw_special_is_active')) { function mw_special_is_active($uid, $user = array()) { $uid = intval($uid); if ($uid === 1) return TRUE; if ($uid <= 0) return FALSE; // 普通用户无需查询会员表;只核验可能滞后的紫名用户组。 if (intval(isset($user['gid']) ? $user['gid'] : 0) !== 106) return FALSE; static $out_times = array(); $now = time(); if (array_key_exists($uid, $out_times)) return $out_times[$uid] > $now; $cache_key = 'mw_special_out_time_'.$uid; $cached = cache_get($cache_key); if ($cached !== FALSE && $cached !== NULL) { $out_times[$uid] = intval($cached); return $out_times[$uid] > $now; } $special = db_find_one('mw_special', array('uid' => $uid)); $out_time = !empty($special) ? max(0, intval($special['out_time'])) : 0; $out_times[$uid] = $out_time; // 活跃缓存最多 5 分钟,且不会跨过实际到期时间;过期状态缓存 1 分钟。 mw_special_active_cache_set($uid, $out_time, $now, 300); return $out_time > $now; } } if (!function_exists('mw_special_active_cache_delete')) { function mw_special_active_cache_delete($uid) { $uid = intval($uid); if ($uid > 0) cache_delete('mw_special_out_time_'.$uid); } } /** * 检查活动并计算折扣后的价格 * @param int $buy_months 购买的月数 * @param float $monthly_price 每月价格 * @return array 返回数组,包含:'amount' => 实际支付金额, 'discount_months' => 折扣月数, 'activity_info' => 活动信息 */ function special_check_activity($buy_months, $monthly_price) { $kv_special = kv_get('mw_special'); $activity = isset($kv_special['special_activity']) ? $kv_special['special_activity'] : array(); // 检查活动是否开启 if (empty($activity['enable']) || $activity['enable'] != 1) { return array( 'amount' => $monthly_price * $buy_months, 'discount_months' => 0, 'activity_info' => null ); } // 检查活动时间 $current_time = time(); $start_time = isset($activity['start']) ? intval($activity['start']) : 0; $end_time = isset($activity['end']) ? intval($activity['end']) : 0; if ($start_time > 0 && $current_time < $start_time) { // 活动未开始 return array( 'amount' => $monthly_price * $buy_months, 'discount_months' => 0, 'activity_info' => null ); } if ($end_time > 0 && $current_time > $end_time) { // 活动已结束 return array( 'amount' => $monthly_price * $buy_months, 'discount_months' => 0, 'activity_info' => null ); } // 检查购买的月数是否符合活动条件 $activity_buy_months = isset($activity['buy_months']) ? intval($activity['buy_months']) : 0; $activity_pay_months = isset($activity['pay_months']) ? intval($activity['pay_months']) : 0; if ($activity_buy_months > 0 && $buy_months == $activity_buy_months && $activity_pay_months > 0) { // 符合活动条件,应用折扣 $discount_amount = $monthly_price * $activity_pay_months; return array( 'amount' => $discount_amount, 'discount_months' => $activity_buy_months - $activity_pay_months, 'activity_info' => array( 'name' => isset($activity['name']) ? $activity['name'] : '活动优惠', 'buy_months' => $activity_buy_months, 'pay_months' => $activity_pay_months ) ); } // 不符合活动条件,正常计算 return array( 'amount' => $monthly_price * $buy_months, 'discount_months' => 0, 'activity_info' => null ); } // Shared function for granting membership rewards (Used by Auto-Pay and Manual Confirm) function special_grant_rewards($uid, $months) { if(!$uid || !$months) return 0; // Initial Calc (will be overridden if user exists and valid) $special_daoqi = strtotime("+$months month"); // 查询用户是否有记录 $v_mw_special = mw_special_read('mw_special', 'uid', $uid); if (empty($v_mw_special)) { // 如果没有记录,创建新记录 mw_special_create('mw_special', array( 'uid' => $uid, 'create_time' => time(), 'out_time' => $special_daoqi )); } else { // 如果已过期(out_time=0或小于当前时间),使用新的到期时间 if ($v_mw_special['out_time'] <= 0 || $v_mw_special['out_time'] < time()) { mw_special_update('mw_special', 'uid', $uid, array( 'create_time' => time(), 'out_time' => $special_daoqi )); } else { // 如果未过期,在原到期时间基础上增加时间 $out_time = strtotime("+$months month", $v_mw_special['out_time']); // Return correct daoqi $special_daoqi = $out_time; mw_special_update('mw_special', 'uid', $uid, array( 'create_time' => time(), 'out_time' => $out_time )); } } mw_special_active_cache_delete($uid); mw_special_update('user', 'uid', $uid, array('gid' => 106)); // 移入会员用户组 // Rewards $reward_coins = ($months == 12) ? 2410 : ($months * 200); // 1. Grant Coins $user = user_read($uid); if($user) { $new_coins = intval($user['coins']) + $reward_coins; user_update($uid, array('coins'=>$new_coins)); // Log Coin Transaction db_create('xn_coin_log', array( 'uid' => $uid, 'type' => 'system', 'coins' => $reward_coins, 'balance' => $new_coins, 'note' => "开通会员{$months}个月赠送", 'create_time' => time() )); } // 2. Grant Growth Points for >= 12 months if ($months >= 12) { $growth_time = time(); $growth = db_find_one('mw_user_growth', array('uid' => $uid)); if (empty($growth)) { $growth = array( 'uid' => $uid, 'points' => 0, 'level' => 1, 'continuous_days' => 0, 'last_checkin_date' => null, 'created_at' => $growth_time, 'updated_at' => $growth_time ); db_insert('mw_user_growth', $growth); $growth = db_find_one('mw_user_growth', array('uid' => $uid)); } $new_points = max(0, intval($growth['points']) + 300); $thresholds = array( array('level'=>1,'max'=>30), array('level'=>2,'max'=>60), array('level'=>3,'max'=>120), array('level'=>4,'max'=>200), array('level'=>5,'max'=>300), array('level'=>6,'max'=>420), array('level'=>7,'max'=>550), array('level'=>8,'max'=>700), array('level'=>9,'max'=>900), array('level'=>10,'max'=>1180), array('level'=>11,'max'=>1530), array('level'=>12,'max'=>1930), array('level'=>13,'max'=>2380), array('level'=>14,'max'=>2880), array('level'=>15,'max'=>3480), array('level'=>16,'max'=>4180), array('level'=>17,'max'=>4980), array('level'=>18,'max'=>5880), array('level'=>19,'max'=>6880), array('level'=>20,'max'=>7980), array('level'=>21,'max'=>9180), array('level'=>22,'max'=>10580), array('level'=>23,'max'=>12180), array('level'=>24,'max'=>13980), array('level'=>25,'max'=>15980), array('level'=>26,'max'=>18180), array('level'=>27,'max'=>20680), array('level'=>28,'max'=>23480), array('level'=>29,'max'=>26480), array('level'=>30,'max'=>29980), array('level'=>31,'max'=>33980), array('level'=>32,'max'=>38480), array('level'=>33,'max'=>43480), array('level'=>34,'max'=>48980), array('level'=>35,'max'=>54980), array('level'=>36,'max'=>null) ); $level = 1; foreach ($thresholds as $t) { if ($t['max'] === null || $new_points <= $t['max']) { $level = $t['level']; break; } } $level = $level < 1 ? 1 : $level; db_update('mw_user_growth', array('uid' => $uid), array( 'points' => $new_points, 'level' => $level, 'updated_at' => $growth_time )); db_insert('mw_growth_history', array( 'uid' => $uid, 'points_change' => 300, 'total_points' => $new_points, 'type' => 'open_year', 'description' => '开通一年', 'created_at' => $growth_time )); } return $special_daoqi; } if (!function_exists('mw_get_vip_img_html')) { function mw_get_vip_img_html($uid) { if(empty($uid)) return ''; $growth = db_find_one('mw_user_growth', array('uid'=>$uid)); $points = $growth ? intval($growth['points']) : 0; $thresholds = array( array('level'=>1,'max'=>30), array('level'=>2,'max'=>60), array('level'=>3,'max'=>120), array('level'=>4,'max'=>200), array('level'=>5,'max'=>300), array('level'=>6,'max'=>420), array('level'=>7,'max'=>550), array('level'=>8,'max'=>700), array('level'=>9,'max'=>900), array('level'=>10,'max'=>1180), array('level'=>11,'max'=>1530), array('level'=>12,'max'=>1930), array('level'=>13,'max'=>2380), array('level'=>14,'max'=>2880), array('level'=>15,'max'=>3480), array('level'=>16,'max'=>4180), array('level'=>17,'max'=>4980), array('level'=>18,'max'=>5880), array('level'=>19,'max'=>6880), array('level'=>20,'max'=>7980), array('level'=>21,'max'=>9180), array('level'=>22,'max'=>10580), array('level'=>23,'max'=>12180), array('level'=>24,'max'=>13980), array('level'=>25,'max'=>15980), array('level'=>26,'max'=>18180), array('level'=>27,'max'=>20680), array('level'=>28,'max'=>23480), array('level'=>29,'max'=>26480), array('level'=>30,'max'=>29980), array('level'=>31,'max'=>33980), array('level'=>32,'max'=>38480), array('level'=>33,'max'=>43480), array('level'=>34,'max'=>48980), array('level'=>35,'max'=>54980), array('level'=>36,'max'=>null) ); $level = 1; foreach ($thresholds as $t) { if ($t['max'] === null || $points <= $t['max']) { $level = $t['level']; break; } } $level = $level < 1 ? 1 : $level; // 优先检查个性称号外显 if (isset($growth['display_badge']) && !empty($growth['display_badge'])) { $badge_name = $growth['display_badge']; // 验证用户确实拥有该称号 $owned = db_find_one('mw_user_badges', array('uid' => $uid, 'badge_name' => $badge_name)); if (!empty($owned)) { // 对文件名进行安全处理 $safe_name = basename($badge_name); return ' ' . htmlspecialchars(pathinfo($safe_name, PATHINFO_FILENAME)) . ''; } } // VIP等级称号外显(允许佩戴自定义且不高于实际等级的专属称号图标) if (isset($growth['display_level']) && intval($growth['display_level']) > 0 && intval($growth['display_level']) <= $level) { $level = intval($growth['display_level']); } $img_num = 20 + $level; return ' V'.$level.''; } } ?>