From 587d5c20b5777a6091f9f3d150980ea067a48f02 Mon Sep 17 00:00:00 2001 From: Stefan Hagspiel Date: Tue, 6 Mar 2018 19:06:48 +0100 Subject: [PATCH] implement cancel action --- Action/Api/CancelAction.php | 90 +++++++++++++++++++++++++++++++++++++ Api.php | 58 +++++++++++++++++++++++- PowerpayGatewayFactory.php | 2 + Request/Api/Cancel.php | 30 +++++++++++++ 4 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 Action/Api/CancelAction.php create mode 100644 Request/Api/Cancel.php diff --git a/Action/Api/CancelAction.php b/Action/Api/CancelAction.php new file mode 100644 index 0000000..005a4c4 --- /dev/null +++ b/Action/Api/CancelAction.php @@ -0,0 +1,90 @@ +api = $api; + } + + /** + * @param Cancel $request + */ + public function execute($request) + { + RequestNotSupportedException::assertSupports($this, $request); + + $details = ArrayObject::ensureArrayObject($request->getModel()); + $details->validateNotEmpty(['card_number']); + + try { + $result = $this->api->generateCancelRequest($details); + + $resultData['response_date'] = $result['ResponseDate']; + $resultData['skipped'] = false; + + //there was an error. + if (isset($result['ResponseCode'])) { + $resultData['response_code'] = $result['ResponseCode']; + } else { + + $resultData['card_statistics_total_number'] = $result['CardStatistics']['Total']['@attributes']['number']; + $resultData['card_statistics_total_amount'] = $result['CardStatistics']['Total']['@attributes']['amount']; + $resultData['card_statistics_purchase_number'] = $result['CardStatistics']['Purchase']['@attributes']['number']; + $resultData['card_statistics_purchase_amount'] = $result['CardStatistics']['Purchase']['@attributes']['amount']; + $resultData['card_statistics_credit_number'] = $result['CardStatistics']['Credit']['@attributes']['number']; + $resultData['card_statistics_credit_amount'] = $result['CardStatistics']['Credit']['@attributes']['amount']; + $resultData['card_statistics_reversal_number'] = $result['CardStatistics']['Reversal']['@attributes']['number']; + $resultData['card_statistics_reversal_amount'] = $result['CardStatistics']['Reversal']['@attributes']['amount']; + + if (isset($result['Skipped'])) { + $resultData['skipped'] = true; + $resultData['skipped_reason'] = $result['Skipped']['Reason']; + } + } + + $request->setResult($resultData); + + } catch (PowerpayException $e) { + $this->populateDetailsWithError($details, $e, $request); + } + } + + /** + * {@inheritDoc} + */ + public function supports($request) + { + return + $request instanceof Cancel && + $request->getModel() instanceof \ArrayAccess; + } +} \ No newline at end of file diff --git a/Api.php b/Api.php index f526f44..8e3c822 100755 --- a/Api.php +++ b/Api.php @@ -174,11 +174,11 @@ public function generateConfirmRequest(ArrayObject $details) $conversion = $xml->addChild('Conversation'); $financialRequest = $conversion->addChild('FinancialRequest'); - $financialRequest->addAttribute('protocol', 'PaymentServer_V2_9'); + $financialRequest->addAttribute('protocol', $protocol); $financialRequest->addAttribute('msgnum', $msgNum); $financialRequest->addChild('RequestDate', $genDate); - $financialRequest->addChild('TransactionType', "debit"); + $financialRequest->addChild('TransactionType', $details['transaction_type']); $financialRequest->addChild('Currency', $details['currency']); $financialRequest->addChild('Amount', $details['amount']); @@ -208,6 +208,60 @@ public function generateConfirmRequest(ArrayObject $details) return $request; } + /** + * @param ArrayObject $details + * @return array + * @throws PowerpayException + */ + public function generateCancelRequest(ArrayObject $details) + { + $msgNum = uniqid(); + $genDate = date('YmdHis'); + $protocol = 'PaymentServer_V2_9'; + + $xml = new \SimpleXMLElement(''); + + $xml->addAttribute('protocol', $protocol); + $xml->addAttribute('msgnum', $msgNum); + $xml->addAttribute('gendate', $genDate); + + $conversion = $xml->addChild('Conversation'); + + $financialRequest = $conversion->addChild('FinancialRequest'); + $financialRequest->addAttribute('protocol', $protocol); + $financialRequest->addAttribute('msgnum', $msgNum); + + $financialRequest->addChild('RequestDate', $genDate); + $financialRequest->addChild('TransactionType', $details['transaction_type']); + $financialRequest->addChild('Currency', $details['currency']); + $financialRequest->addChild('Amount', 0); + + $financialRequest->addChild('MerchantId', $this->options['merchantId']); + $financialRequest->addChild('FilialId', $this->options['filialId']); + $financialRequest->addChild('TerminalId', $this->options['terminalId']); + + $response = $conversion->addChild('Response'); + $response->addAttribute('msgnum', $msgNum); + + $response->addChild('ResponseCode', $details['response_code']); + $response->addChild('ResponseDate', $details['response_date']); + $response->addChild('AuthorizationCode', $details['authorization_code']); + $response->addChild('Currency', $details['currency']); + $response->addChild('Balance', 0); + $response->addChild('CardNumber', $details['card_number']); + $response->addChild('ExpirationDate', $details['expiration_date']); + + try { + $request = $this->doRequest([ + 'xml' => $xml->asXML() + ]); + } catch (\Exception $e) { + throw new PowerpayException($e->getMessage()); + } + + return $request; + } + /** * @param array $fields * diff --git a/PowerpayGatewayFactory.php b/PowerpayGatewayFactory.php index 6c0d44d..ab31291 100755 --- a/PowerpayGatewayFactory.php +++ b/PowerpayGatewayFactory.php @@ -3,6 +3,7 @@ namespace DachcomDigital\Payum\Powerpay; use DachcomDigital\Payum\Powerpay\Action\Api\ActivateAction; +use DachcomDigital\Payum\Powerpay\Action\Api\CancelAction; use DachcomDigital\Payum\Powerpay\Action\Api\ConfirmAction; use DachcomDigital\Payum\Powerpay\Action\Api\ReserveAmountAction; use DachcomDigital\Payum\Powerpay\Action\Api\Transformer\CustomerTransformerAction; @@ -29,6 +30,7 @@ protected function populateConfig(ArrayObject $config) 'payum.action.api.activate' => new ActivateAction(), 'payum.action.api.confirm' => new ConfirmAction(), + 'payum.action.api.cancel' => new CancelAction(), 'payum.action.api.reserve_amount' => new ReserveAmountAction(), 'payum.action.api.transformer.customer' => new CustomerTransformerAction(), diff --git a/Request/Api/Cancel.php b/Request/Api/Cancel.php new file mode 100644 index 0000000..97afa76 --- /dev/null +++ b/Request/Api/Cancel.php @@ -0,0 +1,30 @@ +result = $result; + } + + /** + * @return array + */ + public function getResult() + { + return $this->result; + } + +} \ No newline at end of file