php,商城库存,订单支付成功后扣库存?

发布于 2022-09-04 12:34:26 字数 292 浏览 19 评论 0

php商城网站,我是下单后,支付成功了在扣库存;
应该场景,商城商品比较特殊;一些产品只有一件库存
出个问题场景,
商品一,只有一件;
用户一跟用户二,同时操作商品一下单;
用户一,购买商品一,生成订单,选择支付宝扫码支付,直接扫码支付了,成功后,回调扣了库存;商品库存为 0
用户二,购买商品一,生成订单,在选支付宝扫码支付时后,没支付;等了半分钟,在扫码支付,成功后,回调扣了库存 商品库存为 -1

那么,因为第三方支付二维码,是下单时请求时生了;怎么在扫第三方支付二维码时在判断,商品库存;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(8

旧街凉风 2022-09-11 12:34:26

优化业务逻辑,改进如下:
当订单生成的时候,立即扣除库存
订单超过24小时,未付款,自动取消订单,恢复库存。
没有库存的时候,不能生成订单。

剩余の解释 2022-09-11 12:34:26

特殊业务特殊处理,下单扣库存,3~5分钟后未支付就取消订单恢复库存。

多次下单却不支付的用户,进行限制购买的处理。

东风软 2022-09-11 12:34:26

首先订单的生成和支付一瓣是属于两个业务逻辑。比较通行的做法是订单生成时以transaction进行数据库更新,扣除库存等。这个可以确保一件商品不会同时被两个人买的问题。支付成功后对订单状态更新,进入后续流程。未支付的订单进行超时处理,给库存一个补足

放肆 2022-09-11 12:34:26

可以在订单生成之前 在购物车阶段就扣库存 后台定时任务检测订单状态 如果超过XX分钟未支付 恢复库存

怎樣才叫好 2022-09-11 12:34:26

我觉得高票说的没错。题主的思绪有些问题

  1. 只有一件商品两个人同时下了订单,excause me?怎么会有这种情况出现?这又不是拍卖会难道谁出的价钱高、谁出手速度快就卖给谁吗?

  2. 下订单我们就当做预定,既然是预定,你可以给用户说明一个预定后-购买时间10-30min不等,因为我们家这件商品只有一件库存,你不若不购买就给别人了,这个情况一定要让用户知道。不然,我订了一件商品,我5分钟后去支付,这之间别人下订单买走了,我去支付的时候你告诉我这个商品没了?这样对网站信誉度好吗

  3. 正常逻辑楼上的回答者已经说了,这里就不说了。商城的购物规则差不多都是一样的。

滴情不沾 2022-09-11 12:34:26

你这逻辑就有问题啊, 按照你这逻辑这问题是没办法避免的, 应该是下单的时候就减库存,或者冻结库存啊, 不用等到支付成功啊。

不必了 2022-09-11 12:34:26
elseif($_REQUEST['act'] = 'done')
{
    /*------------------------------------------------------ */
    //-- 完成所有订单操作,提交到数据库
    /*------------------------------------------------------ */

    ...
    /* 检查商品库存 */
    /* 如果使用库存,且下订单时减库存,则减少库存 */
    if ($_CFG['use_storage'] == '1' && $_CFG['stock_dec_time'] == SDT_PLACE)
    {
        $cart_goods_stock = get_cart_goods();
        $_cart_goods_stock = array();
        foreach ($cart_goods_stock['goods_list'] as $value)
        {
            $_cart_goods_stock[$value['rec_id']] = $value['goods_number'];
        }
        flow_cart_stock($_cart_goods_stock);
        unset($cart_goods_stock, $_cart_goods_stock);
    }
    ...
}
/**
 * 取消一个用户订单
 *
 * @access  public
 * @param   int         $order_id       订单ID
 * @param   int         $user_id        用户ID
 *
 * @return void
 */
function cancel_order($order_id, $user_id = 0)
{
    /* 查询订单信息,检查状态 */
    $sql = "SELECT user_id, order_id, order_sn , surplus , integral , bonus_id, order_status, shipping_status, pay_status FROM " .$GLOBALS['ecs']->table('order_info') ." WHERE order_id = '$order_id'";
    $order = $GLOBALS['db']->GetRow($sql);

    if (empty($order))
    {
        $GLOBALS['err']->add($GLOBALS['_LANG']['order_exist']);
        return false;
    }

    // 如果用户ID大于0,检查订单是否属于该用户
    if ($user_id > 0 && $order['user_id'] != $user_id)
    {
        $GLOBALS['err'] ->add($GLOBALS['_LANG']['no_priv']);

        return false;
    }

    // 订单状态只能是“未确认”或“已确认”
    if ($order['order_status'] != OS_UNCONFIRMED && $order['order_status'] != OS_CONFIRMED)
    {
        $GLOBALS['err']->add($GLOBALS['_LANG']['current_os_not_unconfirmed']);

        return false;
    }

    //订单一旦确认,不允许用户取消
    if ( $order['order_status'] == OS_CONFIRMED)
    {
        $GLOBALS['err']->add($GLOBALS['_LANG']['current_os_already_confirmed']);

        return false;
    }

    // 发货状态只能是“未发货”
    if ($order['shipping_status'] != SS_UNSHIPPED)
    {
        $GLOBALS['err']->add($GLOBALS['_LANG']['current_ss_not_cancel']);

        return false;
    }

    // 如果付款状态是“已付款”、“付款中”,不允许取消,要取消和商家联系
    if ($order['pay_status'] != PS_UNPAYED)
    {
        $GLOBALS['err']->add($GLOBALS['_LANG']['current_ps_not_cancel']);

        return false;
    }

    //将用户订单设置为取消
    $sql = "UPDATE ".$GLOBALS['ecs']->table('order_info') ." SET order_status = '".OS_CANCELED."' WHERE order_id = '$order_id'";
    if ($GLOBALS['db']->query($sql))
    {
        /* 记录log */
        order_action($order['order_sn'], OS_CANCELED, $order['shipping_status'], PS_UNPAYED,$GLOBALS['_LANG']['buyer_cancel'],'buyer');
        /* 退货用户余额、积分、红包 */
        if ($order['user_id'] > 0 && $order['surplus'] > 0)
        {
            $change_desc = sprintf($GLOBALS['_LANG']['return_surplus_on_cancel'], $order['order_sn']);
            log_account_change($order['user_id'], $order['surplus'], 0, 0, 0, $change_desc);
        }
        if ($order['user_id'] > 0 && $order['integral'] > 0)
        {
            $change_desc = sprintf($GLOBALS['_LANG']['return_integral_on_cancel'], $order['order_sn']);
            log_account_change($order['user_id'], 0, 0, 0, $order['integral'], $change_desc);
        }
        if ($order['user_id'] > 0 && $order['bonus_id'] > 0)
        {
            change_user_bonus($order['bonus_id'], $order['order_id'], false);
        }

        /* 如果使用库存,且下订单时减库存,则增加库存 */
        if ($GLOBALS['_CFG']['use_storage'] == '1' && $GLOBALS['_CFG']['stock_dec_time'] == SDT_PLACE)
        {
            change_order_goods_storage($order['order_id'], false, 1);
        }

        /* 修改订单 */
        $arr = array(
            'bonus_id'  => 0,
            'bonus'     => 0,
            'integral'  => 0,
            'integral_money'    => 0,
            'surplus'   => 0
        );
        update_order($order['order_id'], $arr);

        return true;
    }
    else
    {
        die($GLOBALS['db']->errorMsg());
    }

}

来源ECSHOP:https://share.notestore.cn/e1...

人间不值得 2022-09-11 12:34:26

首先指出你的问题,为何库存会变成-1?我想你应该在数据库字段存取了个“库存数”字段,但根据数据库设计原则,凡是能计算出的值,都不应该另建个字段存储
言归正传,这个问题理论上是没办法解决的,甚至淘宝也有这个问题,所以下面的方法只能说避免这个问题的发生,我之前是这样做的,下单时先判断库存是否大于10件,如果大于十件,则正常下单,小于10件就锁定库存。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文