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 '