From a65dab6c5580092c4a6fecd4cf33bd88d82e3d89 Mon Sep 17 00:00:00 2001 From: gthedev Date: Thu, 12 May 2016 13:21:48 +0100 Subject: [PATCH 01/12] Getter & Setter for "useOldBasketFormat" in Gateway Added getUseOldBasketFormat and setUseOldBasketFormat for "useOldBasketFormat" parameter in the DirectGateway class --- src/DirectGateway.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/DirectGateway.php b/src/DirectGateway.php index 028c5a1..126db9f 100644 --- a/src/DirectGateway.php +++ b/src/DirectGateway.php @@ -36,6 +36,17 @@ public function setVendor($value) { return $this->setParameter('vendor', $value); } + + public function setUseOldBasketFormat($value){ + $value = (bool)$value; + return $this->setParameter('useOldBasketFormat', $value); + } + + public function getUseOldBasketFormat(){ + $var = $this->getParameter('useOldBasketFormat'); + if(!empty($var)) return true; + return false; + } // Access to the HTTP client for debugging. // NOTE: this is likely to be removed or replaced with something From edc3630bce785dab728e5f17f04949e61bb54bd7 Mon Sep 17 00:00:00 2001 From: gthedev Date: Thu, 12 May 2016 13:23:08 +0100 Subject: [PATCH 02/12] Use old Basket field (instead of BasketXML) if required Added a conditional statement to check which version of basket to send (Basket (old) or BasketXML (newer)) --- src/Message/DirectAuthorizeRequest.php | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Message/DirectAuthorizeRequest.php b/src/Message/DirectAuthorizeRequest.php index 0007ef4..cad2e38 100644 --- a/src/Message/DirectAuthorizeRequest.php +++ b/src/Message/DirectAuthorizeRequest.php @@ -54,9 +54,16 @@ protected function getBaseAuthorizeData() $data['DeliveryPhone'] = $card->getShippingPhone(); $data['CustomerEMail'] = $card->getEmail(); - $basketXML = $this->getItemData(); - if (!empty($basketXML)) { - $data['BasketXML'] = $basketXML; + if($this->getUseOldBasketFormat()){ + $basket = $this->getItemDataNonXML(); + if(!empty($basket)){ + $data['Basket'] = $basket; + } + }else{ + $basketXML = $this->getItemData(); + if (!empty($basketXML)) { + $data['BasketXML'] = $basketXML; + } } return $data; From 1164e933916149985cbf951f4d17714f0ea33901 Mon Sep 17 00:00:00 2001 From: gthedev Date: Thu, 12 May 2016 13:24:14 +0100 Subject: [PATCH 03/12] getItemDataNonXML() Added to AbstractRequest Used if old format of Basket field needs to bent with the request --- src/Message/AbstractRequest.php | 39 +++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/Message/AbstractRequest.php b/src/Message/AbstractRequest.php index 192cbb2..8e6c8e0 100644 --- a/src/Message/AbstractRequest.php +++ b/src/Message/AbstractRequest.php @@ -233,4 +233,43 @@ protected function getItemData() return $result; } + + /** + * Generate Basket string in the old format + * This is called if "useOldBasketFormat" is set to true in the gateway config + * @return string Basket field in format of: + * 1:Item:2:10.00:0.00:10.00:20.00 + * [number of lines]:[item name]:[quantity]:[unit cost]:[item tax]:[item total]:[line total] + */ + protected function getItemDataNonXML(){ + + $result = ''; + $items = $this->getItems(); + $count = 0; + + foreach($items as $basketItem){ + $lineTotal = ($basketItem->getQuantity() * $basketItem->getPrice()); + + $description = $this->filterItemName($basketItem->getName()); + $description = str_replace(':', ' ', $description); // Make sure there aren't any colons in the name + // Perhaps : should be replaced with '-' or other symbol? + + $result .= ':' . $description . // Item name + ':' . $basketItem->getQuantity() . // Quantity + ':' . number_format($basketItem->getPrice(), 2, '.', '') . // Unit cost (without tax) + ':0.00' . // Item tax + ':' . number_format($basketItem->getPrice(), 2, '.', '') . // Item total + ':' . number_format($lineTotal); // Line total + // As the getItemData() puts 0.00 into tax, same was done here + + $count++; + + } + + // Prepend number of lines to the result string + $result = $count.$result; + + return $result; + + } } From 608e676745a0083609d18bed5420a2e4b5e6a199 Mon Sep 17 00:00:00 2001 From: gthedev Date: Thu, 12 May 2016 13:35:18 +0100 Subject: [PATCH 04/12] Setter & Getter for useOldBasketFormat in Request --- src/Message/AbstractRequest.php | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Message/AbstractRequest.php b/src/Message/AbstractRequest.php index 8e6c8e0..1622fb4 100644 --- a/src/Message/AbstractRequest.php +++ b/src/Message/AbstractRequest.php @@ -26,6 +26,15 @@ public function getService() { return $this->action; } + + public function setUseOldBasketFormat($value){ + $value = (bool)$value; + return $this->setParameter('useOldBasketFormat', $value); + } + + public function getUseOldBasketFormat(){ + return $this->getParameter('useOldBasketFormat') + } public function getAccountType() { From a1ed7595969a74565999c53cdba8fa57d98d88b5 Mon Sep 17 00:00:00 2001 From: gthedev Date: Thu, 12 May 2016 13:36:02 +0100 Subject: [PATCH 05/12] AbstractRequest - getUseOldBasketFormat typo fix --- src/Message/AbstractRequest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Message/AbstractRequest.php b/src/Message/AbstractRequest.php index 1622fb4..b1acc6a 100644 --- a/src/Message/AbstractRequest.php +++ b/src/Message/AbstractRequest.php @@ -33,7 +33,7 @@ public function setUseOldBasketFormat($value){ } public function getUseOldBasketFormat(){ - return $this->getParameter('useOldBasketFormat') + return $this->getParameter('useOldBasketFormat'); } public function getAccountType() From ba19412c578ad0c84027b2c8ef991ad7ae40cfb3 Mon Sep 17 00:00:00 2001 From: gthedev Date: Thu, 12 May 2016 13:51:44 +0100 Subject: [PATCH 06/12] Merge pull request #1 from gthedev/dev-old-basket-format Old basket format merge back to master --- src/DirectGateway.php | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/DirectGateway.php b/src/DirectGateway.php index 126db9f..682ac8f 100644 --- a/src/DirectGateway.php +++ b/src/DirectGateway.php @@ -43,9 +43,7 @@ public function setUseOldBasketFormat($value){ } public function getUseOldBasketFormat(){ - $var = $this->getParameter('useOldBasketFormat'); - if(!empty($var)) return true; - return false; + return $this->getParameter('useOldBasketFormat'); } // Access to the HTTP client for debugging. From afa7371eb7955c12937aa7bd0b06a44e366fda79 Mon Sep 17 00:00:00 2001 From: gthedev Date: Thu, 12 May 2016 15:10:30 +0100 Subject: [PATCH 07/12] Update README.md Added information about BasketXML & Basket fields --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index 2aaff4d..88efa63 100644 --- a/README.md +++ b/README.md @@ -37,6 +37,10 @@ The following gateways are provided by this package: For general usage instructions, please see the main [Omnipay](https://github.com/thephpleague/omnipay) repository. +### Basket format + +By default [BasketXML](http://www.sagepay.co.uk/support/12/36/protocol-3-00-basket-xml) (Protocol 3.00) field will be sent (if item data is available) with the requests. However, a parameter "useOldBasketFormat" with value of TRUE can be passed to the config, which will in turn send old format [Basket](http://www.sagepay.co.uk/support/error-codes/3021-invalid-basket-format-invalid) field. Old format can be used to enable other Sage products better integrate with Sage Pay, as new BasketXML is not yet supported. + ## Support If you are having general issues with Omnipay, we suggest posting on From 9ac0deb99f0a9819a83637a71c607359f810678d Mon Sep 17 00:00:00 2001 From: Giedrius Date: Fri, 13 May 2016 11:30:41 +0100 Subject: [PATCH 08/12] Formatting --- src/DirectGateway.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/DirectGateway.php b/src/DirectGateway.php index 682ac8f..de757d1 100644 --- a/src/DirectGateway.php +++ b/src/DirectGateway.php @@ -37,12 +37,15 @@ public function setVendor($value) return $this->setParameter('vendor', $value); } - public function setUseOldBasketFormat($value){ + public function setUseOldBasketFormat($value) + { $value = (bool)$value; + return $this->setParameter('useOldBasketFormat', $value); } - public function getUseOldBasketFormat(){ + public function getUseOldBasketFormat() + { return $this->getParameter('useOldBasketFormat'); } From 34930c1d5721994adc08903781d2237953929509 Mon Sep 17 00:00:00 2001 From: Giedrius Date: Fri, 13 May 2016 11:32:18 +0100 Subject: [PATCH 09/12] Formatting --- src/Message/AbstractRequest.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Message/AbstractRequest.php b/src/Message/AbstractRequest.php index b1acc6a..b527613 100644 --- a/src/Message/AbstractRequest.php +++ b/src/Message/AbstractRequest.php @@ -27,12 +27,15 @@ public function getService() return $this->action; } - public function setUseOldBasketFormat($value){ + public function setUseOldBasketFormat($value) + { $value = (bool)$value; + return $this->setParameter('useOldBasketFormat', $value); } - public function getUseOldBasketFormat(){ + public function getUseOldBasketFormat() + { return $this->getParameter('useOldBasketFormat'); } @@ -250,13 +253,14 @@ protected function getItemData() * 1:Item:2:10.00:0.00:10.00:20.00 * [number of lines]:[item name]:[quantity]:[unit cost]:[item tax]:[item total]:[line total] */ - protected function getItemDataNonXML(){ + protected function getItemDataNonXML() + { $result = ''; $items = $this->getItems(); $count = 0; - foreach($items as $basketItem){ + foreach ($items as $basketItem) { $lineTotal = ($basketItem->getQuantity() * $basketItem->getPrice()); $description = $this->filterItemName($basketItem->getName()); @@ -276,7 +280,7 @@ protected function getItemDataNonXML(){ } // Prepend number of lines to the result string - $result = $count.$result; + $result = $count . $result; return $result; From 99cd76ec0fabe237500c59e830df79731ea96c95 Mon Sep 17 00:00:00 2001 From: Giedrius Date: Fri, 13 May 2016 11:33:05 +0100 Subject: [PATCH 10/12] Formatting --- src/Message/DirectAuthorizeRequest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Message/DirectAuthorizeRequest.php b/src/Message/DirectAuthorizeRequest.php index cad2e38..76ee316 100644 --- a/src/Message/DirectAuthorizeRequest.php +++ b/src/Message/DirectAuthorizeRequest.php @@ -54,12 +54,12 @@ protected function getBaseAuthorizeData() $data['DeliveryPhone'] = $card->getShippingPhone(); $data['CustomerEMail'] = $card->getEmail(); - if($this->getUseOldBasketFormat()){ + if ($this->getUseOldBasketFormat()) { $basket = $this->getItemDataNonXML(); - if(!empty($basket)){ + if (!empty($basket)) { $data['Basket'] = $basket; } - }else{ + } else { $basketXML = $this->getItemData(); if (!empty($basketXML)) { $data['BasketXML'] = $basketXML; From 91b59f54818cc20e5477520630ed51fcf56f4ea6 Mon Sep 17 00:00:00 2001 From: Andrew Coates Date: Tue, 24 May 2016 10:36:02 +0100 Subject: [PATCH 11/12] Fix linetotal being truncated --- src/Message/AbstractRequest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Message/AbstractRequest.php b/src/Message/AbstractRequest.php index b527613..dd611a0 100644 --- a/src/Message/AbstractRequest.php +++ b/src/Message/AbstractRequest.php @@ -272,7 +272,7 @@ protected function getItemDataNonXML() ':' . number_format($basketItem->getPrice(), 2, '.', '') . // Unit cost (without tax) ':0.00' . // Item tax ':' . number_format($basketItem->getPrice(), 2, '.', '') . // Item total - ':' . number_format($lineTotal); // Line total + ':' . number_format($lineTotal, 2, '.', ''); // Line total // As the getItemData() puts 0.00 into tax, same was done here $count++; From b9434fc739548babbefdd634a4e40e4ae659ec87 Mon Sep 17 00:00:00 2001 From: Andrew Coates Date: Tue, 28 Jun 2016 10:03:01 +0100 Subject: [PATCH 12/12] Improve basket format description --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 88efa63..c174029 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,11 @@ repository. ### Basket format -By default [BasketXML](http://www.sagepay.co.uk/support/12/36/protocol-3-00-basket-xml) (Protocol 3.00) field will be sent (if item data is available) with the requests. However, a parameter "useOldBasketFormat" with value of TRUE can be passed to the config, which will in turn send old format [Basket](http://www.sagepay.co.uk/support/error-codes/3021-invalid-basket-format-invalid) field. Old format can be used to enable other Sage products better integrate with Sage Pay, as new BasketXML is not yet supported. +Sagepay currently supports two different formats for sending cart/item information to them: + - [BasketXML](http://www.sagepay.co.uk/support/12/36/protocol-3-00-basket-xml) + - [Basket](http://www.sagepay.co.uk/support/error-codes/3021-invalid-basket-format-invalid) + +These are incompatible with each other, and cannot be both sent in the same transaction. *BasketXML* is the most modern format, and is the default used by this driver. *Basket* is an older format which may be deprecated one day, but is also the only format currently supported by some of the Sage accounting products (Line 50, etc) which can pull transaction data directly from Sagepay. Therefore for users who require this type of integration, an optional parameter `useOldBasketFormat` with a value of `true` can be passed in the driver's `initialize()` method. ## Support