【问题标题】:How to display sold out message once an itemruns out of stock with PayPal smart button如何使用 PayPal 智能按钮在商品缺货时显示已售罄消息
【发布时间】:2020-11-07 16:12:44
【问题描述】:

我目前正在为我的网站开发商店。我正在使用 PayPal 智能按钮进行付款。我想知道如何添加库存数量,以便当库存编号为 0 时,无法购买。我在互联网上到处搜索,找不到我的问题的任何答案。这是我当前的代码:

    paypal.Buttons({

    style: {
        shape: 'rect',
        color: 'blue',
        layout: 'vertical',
        label: 'paypal',
        locale: 'en_CY'
    },

    createOrder: function(data, actions) {
        return actions.order.create({
            purchase_units: [{
                amount: {
                    value: ". $row['paypal_price'] .",
                    currency: 'EUR'
                }
            }]
        });
    },
    onApprove: function(data, actions) {
        return actions.order.capture().then(function(details) {
            localStorage.clear();
            window.location.href = 'http://localhost/website/thankyou.php';
            //alert('Transaction completed by ' + details.payer.name.given_name + '!');
            $stock = 0;
        });
    }
}).render('#paypal-button-container');

提前谢谢你!

【问题讨论】:

    标签: php paypal payment-gateway


    【解决方案1】:

    您的问题更多是关于“我如何更新我当前的库存”和“我如何获得我当前的库存”

    Javascript 在客户端运行,因为您在客户端没有当前库存编号,您需要让 Javascript 与您的服务器通信。

    一种方法是通过 ajax。您可以使用fetch-api 来完成此操作。

    这是你必须做的:

    在显示按钮之前(php-code):

    <?php
        // your code ...
        // check stock before you echo. Only echo when $stock is > 0
        
        $stock = /* get current stock-amount */;
    
        if ($stock > 0) {
            echo "paypal.Buttons([...";
        }
    

    在确认付款后更新您的库存:

    // your current code
    localStorage.clear();
    window.location.href = 'http://localhost/website/thankyou.php';
    // alert('Transaction completed by ' + details.payer.name.given_name + '!');
    // $stock = 0;
    
    // add something like this
    const formData = new FormData();
    formData.append('amountOrdered', /* number as string */);
    
    // maybe use await to block further processing until stock has been updated
    fetch('update_stock.php', {
         method: 'POST',
         body: formData
    });
    

    在你的新update_stock.php

    <?php
        // update your stock-source by reducing it by $_POST['amountOrdered']
    

    您需要的最后一步是在创建订单 (JS) 之前检查您的库存:

    // async here needed so you can use await
    createOrder: async function(data, actions) {
        // check stock here
        let stock = (await fetch('get_current_stock.php')).json();
        let currentStock = stock['current'];
    
        // you may want to check for amoutTryingToOrder instead of 1
        if (currentStock < 1) {
            alert('Out of stock, sorry :(');
            return false;
        }
    
        return actions.order.create({
    

    在你的get_current_stock.php

    <?php
        header('Content-Type: application/json');
    
        $currentStock = /* get current stock */;
        
        echo json_encode([
            'current' => $currentStock
        ]);
    

    【讨论】:

    • 谢谢。这很有帮助!
    • 您好,我知道您之前已经回答了我的问题,但我对您的解决方案有疑问。我使用了你的解决方案,但遇到了问题。我已经在 update_stock.php 页面中添加了一条 UPDATE 语句,但是,当一个 peyment 被处理时,所有项目的库存编号都发生了变化,而不是被购买的那个。我尝试了很多解决方案,但都没有奏效。我能做些什么来减少所订购商品的库存。再次感谢!
    • 那么在您的update_stock.php 中,您还必须发送您的商品 ID 并使用此 ID 来减少金额。我不知道你的代码,但如果你使用 sql 更新股票,你必须在你的更新语句中使用 id。例如:update items set stock = &lt;new-stock-value&gt; where item_id = &lt;the-item-id&gt;。如果您省略所有项目的更新位置(这就是您所描述的)。如果这没有帮助,请创建一个新问题并提供所有必要的详细信息。
    【解决方案2】:

    您的 createOrder 函数可以在没有库存时返回 false,而不是继续执行 actions.order.create

    【讨论】:

      猜你喜欢
      • 2021-04-26
      • 2022-08-03
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-04-27
      • 2014-08-29
      • 2021-10-31
      • 2012-09-04
      相关资源
      最近更新 更多