与 Sagepay 官方 PHP 集成套件的总交易金额

Total transaction amount with Sagepay official PHP Integration Kit

使用协议 3.0 的 official Sagepay PHP integration 套件似乎没有办法实际设置总交易金额。交易的总价值是根据篮子里的物品用SagepayBasket->addItem(SagepayItem $item)的方式计算出来的。

基本设置是这样的:

$config = SagepaySettings::getInstance($configs,true);
$api = SagepayApiFactory::create('SERVER', $config);
$basket = new SagepayBasket();

您可以添加项目:

$item = new SagepayItem();
$item->setDescription($oproduct['oc_item_title']);
$item->setUnitTaxAmount($oproduct['oc_item_vat']);
$item->setQuantity($oproduct['oc_qty']);
$item->setUnitNetAmount(($oproduct['oc_net_item_price']));
$basket->addItem($item);

您还可以添加送货信息:

$basket->setDeliveryNetAmount($order['shipping_cost_net']);
$basket->setDeliveryTaxAmount($order['shipping_cost_vat']);

但是,购物篮总数也取决于折扣。您可以使用以下方式向购物篮添加折扣:

$discounts = [
    'discount' => [
        'fixed'         =>  $order['voucher_discount'],
        'description'   =>  'Voucher Discount'
    ]
];
$basket->setDiscounts($discounts);

但是,这个数据在总计算中被忽略了。这意味着传递给 Sagepay 的金额不正确。

这可以在 basket.php 中看到,它缺少对 $basket->getDiscounts 方法的调用:

public function getAmount()
{
    $amount = $this->getDeliveryGrossAmount();
    foreach ($this->_items as $item)
    {
        $amount += $item->getTotalGrossAmount();
    }
    return $amount;
}

当您使用此数据调用 Sagepay 时,他们正确地识别出行总计未正确添加到通过发送此响应发送的金额:

StatusDetail=3195 : The line item amount details do not add up correctly

使这项工作可行的唯一选择是修改他们的库,这似乎是错误的,但我看不到其他选择。我已经在这里发布,因为他们将 SO 列为他们的 "support forum" 所以希望来自 Sagepay 的人会看到这个,或者其他使用过他们代码的开发人员可能会指出我哪里出错了。

简而言之 - 不要使用此工具包。根据 Sagepay 的说法,它不是为生产而设计的,因此,我们无意发现此类问题。