我正在尝试破解paypal模块以更改通过Express Checkout API发送的订单详细信息。
使用PS 1.5.4和最新的Paypal模块,paypal页面如下所示:
Item Name Amount + Tax
Item Description
Item Number
Item Price + Tax
Quantity
...
Item Total Total + Tax
Shipping And Handling Shipping + Tax
Total Total
我宁愿让它显示税前价格,然后只需要这样的总税线:
Item Name Amount
Item Description
Item Number
Item Price
Quantity
...
Item Total Total
Shipping And Handling Shipping
Total Tax Total Tax
Total Total
我已对process.php进行了修改但我必须遗漏一些东西,因为我的“hacked”process.php出错了。当我将其切换回默认值时,它可以正常工作。
这是github repo上原始process.php文件的链接: https://github.com/PrestaShop/PrestaShop-modules/blob/master/paypal/express_checkout/process.php
我的hacked process.php的差异和原始的备份:
Comparing files process.php and PROCESS.PHP.BAK
***** process.php
private function setProductsList(&$fields, &$index, &$total) {
...
$fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($product['price'], $this->decimals);
$fields['L_PAYMENTREQUEST_0_QTY'.$index] = $product['quantity'];
$product_tax = $product['price_wt'] - $product['price'];
$total = $total + (($fields['L_PAYMENTREQUEST_0_AMT'.$index] + $product_tax) * $product['quantity']);
***** PROCESS.PHP.BAK
private function setProductsList(&$fields, &$index, &$total) {
...
$fields['L_PAYMENTREQUEST_0_AMT'.$index] = Tools::ps_round($product['price_wt'], $this->decimals);
$fields['L_PAYMENTREQUEST_0_QTY'.$index] = $product['quantity'];
*****
***** process.php
private function setPaymentValues(&$fields, &$index, &$total, &$taxes){
...
else
$shipping_cost_wt = $this->context->cart->getTotalShippingCost(null, false);
***** PROCESS.PHP.BAK
private function setPaymentValues(&$fields, &$index, &$total, &$taxes){
...
else
$shipping_cost_wt = $this->context->cart->getTotalShippingCost();
*****
***** process.php
private function setPaymentValues(&$fields, &$index, &$total, &$taxes) {
...
$fields['PAYMENTREQUEST_0_AMT'] = $total + $fields['PAYMENTREQUEST_0_SHIPPINGAMT'];
$fields['PAYMENTREQUEST_0_TAXAMT'] = $this->context->cart->getOrderTotal() - $this->context->cart->getOrderTotal(
false);
}
***** PROCESS.PHP.BAK
private function setPaymentValues(&$fields, &$index, &$total, &$taxes) {
...
$fields['PAYMENTREQUEST_0_AMT'] = $total + $fields['PAYMENTREQUEST_0_SHIPPINGAMT'];
}
*****
这是我得到的错误。
Error occurred:
Please try to contact the merchant:
PayPal response:
TIMESTAMP -> 2013-04-04T09:09:42Z
L_ERRORCODE0 -> 10413
L_SHORTMESSAGE0 -> Transaction refused because of an invalid argument. See additional error messages for details.
L_LONGMESSAGE0 -> The totals of the cart item amounts do not match order amounts.
L_SEVERITYCODE0 -> Error
任何人都有任何建议。
答案 0 :(得分:0)
将PAYMENTREQUEST_0_ITEMAMT
与$fields['L_PAYMENTREQUEST_0_AMT'.$index]
的总和添加到您的API调用中。
当我开始向PAYMENTREQUEST_0_AMT
添加运费时,我遇到了这个问题,而这不是完全正在发生的事情。
我最好的建议是,只要项目费用总和与PAYMENTREQUEST_0_ITEMAMT
不同,就可以添加PAYMENTREQUEST_0_AMT
。
答案 1 :(得分:0)
确定, 我终于修好了。我可以写出具体的代码修复,但我觉得它太专业了我的情况和这个版本的prestashop。如果有人要求,我会添加它。
更重要的部分是我如何发现错误。 由于模块发送请求,然后必须从响应中找出是否存在错误,因此无法通过var_dump或echo进行调试。
相反,我编写了一个简单的自定义日志文件来将值转储到进程中。 我已经读过,由于潜在的锁定问题,对apache日志这样做是不受欢迎的。
所以TLDR: 使用PHP文件函数并将总计和其他变量记录到同一目录中的文件中。