select_first_row('sq_trade', '*', array('tradeno' => $_GET['tradeno']), 'AND')) { tips('订单信息拉取失败,无法继续支付'); } if ($tradinfo['status'] != '1') { tips('订单状态不正常,也许是已经支付成功了'); } if ($tradinfo['paymoney'] == 0) { $time = time(); $db->update('sq_trade', array('tradeno' => $_GET['tradeno']), 'AND', array('overtime' => $time, 'status' => '2')); tips('该订单为免费订单,点击确定跳转到结果页...', wq_site_base_url() . "/payresult.php?tradeno=" . $_GET['tradeno']); } if ($tradinfo['paytype'] == 'zxzf') { if ($tradinfo['onlinepaytype'] === 'zfb') { if ($G['config']['alipaytype'] == '2') { tips('支付宝在线支付渠道目前已关闭,请选择其他支付方式!'); } if ($G['config']['alipaytype'] == '0') { //免签约支付echo '111'; mqyturn('alipay'); } if ($G['config']['alipaytype'] == '1') { //支付宝签约支付 } } if ($tradinfo['onlinepaytype'] === 'wx') { if ($G['config']['wxpaytype'] == '2') { tips('微信在线支付渠道目前已关闭,请选择其他支付方式!'); } if ($G['config']['wxpaytype'] == '0') { //免签约支付 mqyturn('wxpay'); } if ($G['config']['wxpaytype'] == '1') { //微信签约支付 } } if ($tradinfo['onlinepaytype'] === 'qq') { if ($G['config']['qqpaytype'] == '2') { tips('QQ钱包在线支付渠道目前已关闭,请选择其他支付方式!'); } if ($G['config']['qqpaytype'] == '0') { //免签约支付 mqyturn('qqpay'); } if ($G['config']['qqpaytype'] == '1') { //QQ签约支付 } } tips('What the fuck?'); } if ($tradinfo['paytype'] == 'czkm') { $usekey = $tradinfo['kami']; if (!$keyinfo = $db->select_first_row('sq_key', '*', array('kami' => $usekey), 'AND')) { tips('卡密不存在!'); } if ($keyinfo['lastmoney'] < $tradinfo['paymoney']) { tips('卡密余额不足!'); } if ($keyinfo['status'] != '1') { tips('卡密已被封禁,无法使用!'); } $time = time(); $paymoney = (float)$tradinfo['paymoney']; // P0-07: 原子占用订单(status=1 -> 2),防同一订单被并发重复支付 if (!$db->query("UPDATE sq_trade SET overtime=" . $time . ", status='2' WHERE tradeno='" . addslashes($_GET['tradeno']) . "' AND status='1'")) { tips('系统内部错误!'); } if ((int)$db->affected_num() === 0) { tips('订单状态已变化(可能已支付成功),请勿重复操作'); } // P0-07: 原子核销卡密:前置条件(未被封禁/余额充足)并入 WHERE,消除「先读后写」双花窗口 if (!$db->query("UPDATE sq_key SET lastmoney=lastmoney-" . $paymoney . ", lastusetime=" . $time . ", firstusetime=IF(firstusetime=0," . $time . ",firstusetime) WHERE kami='" . addslashes($usekey) . "' AND status='1' AND lastmoney>=" . $paymoney)) { tips('系统内部错误!'); } if ((int)$db->affected_num() === 0) { // 卡密被并发核销或已封禁:回滚订单占用,提示重试 $db->query("UPDATE sq_trade SET status='1' WHERE tradeno='" . addslashes($_GET['tradeno']) . "' AND status='2' AND overtime=" . $time); tips('卡密状态已变化(可能已被并发使用或余额不足),请重试'); } $lastmoney = $keyinfo['lastmoney'] - $paymoney; $db->insert_back_id('sq_log_kami', array('keyid' => $keyinfo['ID'], 'type' => 'info', 'spendmoney' => $tradinfo['paymoney'], 'lastmoney' => $lastmoney, 'time' => $time, 'object' => $tradinfo['user'], 'IP' => get_real_ip(), 'msg' => $tradinfo['name'])); tips('已成功使用卡密进行支付,点击确认跳转至结果页面...', wq_site_base_url() . "/payresult.php?tradeno=" . $_GET['tradeno']); } if ($tradinfo['paytype'] == 'yezf') { if (empty($tradinfo['agentid']) || $tradinfo['agentid'] == 0) { tips('错误的付款方式,请重新选择!'); } if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('ID' => $tradinfo['agentid']), 'AND')) { tips('代理信息获取失败,无法继续支付!'); } if (($_SESSION['agent_username'] != $agentinfo['username']) || ($_SESSION['agent_password'] != $agentinfo['password'])) { tips('当前登录的代理账号或密码与订单代理或密码不匹配!'); } if ($agentinfo['status'] != '1') { tips('代理状态不正常,无法继续支付!'); } if ($agentinfo['money'] < $tradinfo['paymoney']) { tips('很抱歉,您的余额不足,无法支付!'); } $time = time(); $paymoney = (float)$tradinfo['paymoney']; // P0-07: 原子占用订单(status=1 -> 2),防同一订单被并发重复支付 if (!$db->query("UPDATE sq_trade SET overtime=" . $time . ", status='2' WHERE tradeno='" . addslashes($_GET['tradeno']) . "' AND status='1'")) { tips('系统内部错误!'); } if ((int)$db->affected_num() === 0) { tips('订单状态已变化(可能已支付成功),请勿重复操作'); } // P0-07: 原子扣除代理余额(状态/余额前置条件并入 WHERE),消除「先读后写」双花窗口 // 同步修复原 bug:allspend 只读进内存从未落库,此处一并原子累加 if (!$db->query("UPDATE sq_agent SET money=money-" . $paymoney . ", allspend=allspend+" . $paymoney . " WHERE ID=" . (int)$tradinfo['agentid'] . " AND status='1' AND money>=" . $paymoney)) { tips('系统内部错误!'); } if ((int)$db->affected_num() === 0) { // 代理被并发冻结或余额不足:回滚订单占用 $db->query("UPDATE sq_trade SET status='1' WHERE tradeno='" . addslashes($_GET['tradeno']) . "' AND status='2' AND overtime=" . $time); tips('代理状态已变化(被冻结或余额不足),请重试'); } $lastmoney = $agentinfo['money'] - $paymoney; $db->insert_back_id('sq_log_agent', array('time' => $time, 'aid' => $agentinfo['ID'], 'ip' => get_real_ip(), 'msg' => '使用余额支付' . $tradinfo['paymoney'] . '元购买' . $tradinfo['name'] . ',余额:' . $lastmoney)); tips('您已成功使用余额付款,点击确认跳转至结果页...', wq_site_base_url() . "/payresult.php?tradeno=" . $_GET['tradeno']); } tips('What the fuck?'); function mqyturn($paytype) { global $G; global $tradinfo; echo ' 正在跳转到支付页面,请稍后 '; require_once(__DIR__ . "/pay/epay/lib/epay_submit.class.php"); $alipay_config['partner'] = $G['config']['epay_pid']; $alipay_config['key'] = $G['config']['epay_key']; $alipay_config['sign_type'] = strtoupper('MD5'); $alipay_config['input_charset'] = strtolower('utf-8'); $alipay_config['transport'] = 'http'; $alipay_config['apiurl'] = 'http://' . $G['config']['pay_domain'] . '/'; // P0-07: 回调/回跳 URL 的 host 取自配置域名(weburl),防 HTTP_HOST 头投毒 $notify_url = str_replace("\\", '/', str_replace("\/", '/', wq_site_base_url() . "/pay/epay/notify_url.php")); $return_url = str_replace("\\", '/', str_replace("\/", '/', wq_site_base_url() . "/pay/epay/return_url.php")); $out_trade_no = $_GET['tradeno']; $type = $paytype; $name = $tradinfo['name']; $money = $tradinfo['paymoney']; $sitename = $G['config']['sitename']; $parameter = array( "pid" => trim($alipay_config['partner']), "type" => $type, "notify_url" => $notify_url, "return_url" => $return_url, "out_trade_no" => $out_trade_no, "name" => $name, "money" => $money, "sitename" => $sitename ); $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter); echo $html_text; echo ' '; die(); }