ecshop支付中的bug问题
ecshop中有一个比较隐蔽的支付问题,本问题可能导致用户支付成功,但是系统返回的是支付失败。
问题出现情况
1,首先选择商品下好订单,不要选择余额支付,使用余额支付部分。但是订单不要支付。
2,去用户中心用余额再支付一部分。
3,用其它在线支付方式支付剩下的金额。
这样就会出现付款成功,但是系统提示支付不成功。
问题原因
由于ecshop在用户中心选择用余额支付部分时,支付日志表中并没有修改需要支付的金额,所以后导致支付成功验证是金额不对应报错。
解决思路
在用户中心修改时,修改支付日志的总额。
解决办法
修改使用余额支付的处理代码,在act为act_edit_surplus里边。大概在user.php1920行
$pay_fee = 0;
if ($order['pay_id'] > 0)
{
$pay_fee = pay_fee($order['pay_id'], $order['order_amount'], $cod_fee);
}
$order['pay_fee'] = $pay_fee;
$order['order_amount'] += $pay_fee;
代码下边添加一行$db->query("UPDATE ".$ecs->table('pay_log')." SET order_amount='".$order['order_amount']."' WHERE order_id='".$order['order_id']."'");
在user.php中的1932下if ($order['order_status'] == OS_UNCONFIRMED)
{
$order['order_status'] = OS_CONFIRMED;
$order['confirm_time'] = gmtime();
}
$order['pay_status'] = PS_PAYED;
$order['pay_time'] = gmtime();
下添加$db->query("UPDATE ".$ecs->table('pay_log')." SET order_amount='0' ,is_paid='1' WHERE order_id='".$order['order_id']."'");
添加后的完成act_edit_surplus如下
/* 编辑使用余额支付的处理 */
elseif ($action == 'act_edit_surplus')
{
/* 检查是否登录 */
if ($_SESSION['user_id'] <= 0)
{
ecs_header("Location: ./\n");
exit;
}
/* 检查订单号 */
$order_id = intval($_POST['order_id']);
if ($order_id <= 0)
{
ecs_header("Location: ./\n");
exit;
}
/* 检查余额 */
$surplus = floatval($_POST['surplus']);
if ($surplus <= 0)
{
$err->add($_LANG['error_surplus_invalid']);
$err->show($_LANG['order_detail'], 'user.php?act=order_detail&order_id=' . $order_id);
}
include_once(ROOT_PATH . 'includes/lib_order.php');
/* 取得订单 */
$order = order_info($order_id);
if (empty($order))
{
ecs_header("Location: ./\n");
exit;
}
/* 检查订单用户跟当前用户是否一致 */
if ($_SESSION['user_id'] != $order['user_id'])
{
ecs_header("Location: ./\n");
exit;
}
/* 检查订单是否未付款,检查应付款金额是否大于0 */
if ($order['pay_status'] != PS_UNPAYED || $order['order_amount'] <= 0)
{
$err->add($_LANG['error_order_is_paid']);
$err->show($_LANG['order_detail'], 'user.php?act=order_detail&order_id=' . $order_id);
}
/* 计算应付款金额(减去支付费用) */
$order['order_amount'] -= $order['pay_fee'];
/* 余额是否超过了应付款金额,改为应付款金额 */
if ($surplus > $order['order_amount'])
{
$surplus = $order['order_amount'];
}
/* 取得用户信息 */
$user = user_info($_SESSION['user_id']);
/* 用户帐户余额是否足够 */
if ($surplus > $user['user_money'] + $user['credit_line'])
{
$err->add($_LANG['error_surplus_not_enough']);
$err->show($_LANG['order_detail'], 'user.php?act=order_detail&order_id=' . $order_id);
}
/* 修改订单,重新计算支付费用 */
$order['surplus'] += $surplus;
$order['order_amount'] -= $surplus;
if ($order['order_amount'] > 0)
{
$cod_fee = 0;
if ($order['shipping_id'] > 0)
{
$regions = array($order['country'], $order['province'], $order['city'], $order['district']);
$shipping = shipping_area_info($order['shipping_id'], $regions);
if ($shipping['support_cod'] == '1')
{
$cod_fee = $shipping['pay_fee'];
}
}
$pay_fee = 0;
if ($order['pay_id'] > 0)
{
$pay_fee = pay_fee($order['pay_id'], $order['order_amount'], $cod_fee);
}
$order['pay_fee'] = $pay_fee;
$order['order_amount'] += $pay_fee;
$db->query("UPDATE ".$ecs->table('pay_log')." SET order_amount='".$order['order_amount']."' WHERE order_id='".$order['order_id']."'");
}
/* 如果全部支付,设为已确认、已付款 */
if ($order['order_amount'] == 0)
{
if ($order['order_status'] == OS_UNCONFIRMED)
{
$order['order_status'] = OS_CONFIRMED;
$order['confirm_time'] = gmtime();
}
$order['pay_status'] = PS_PAYED;
$order['pay_time'] = gmtime();
$db->query("UPDATE ".$ecs->table('pay_log')." SET order_amount='0' ,is_paid='1' WHERE order_id='".$order['order_id']."'");
}
$order = addslashes_deep($order);
update_order($order_id, $order);
/* 更新用户余额 */
$change_desc = sprintf($_LANG['pay_order_by_surplus'], $order['order_sn']);
log_account_change($user['user_id'], (-1) * $surplus, 0, 0, 0, $change_desc);
/* 跳转 */
ecs_header('Location: user.php?act=order_detail&order_id=' . $order_id . "\n");
exit;
}
贴出代码供大家参考