v7‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT language = $this->getConfig('language', 2); // English default for testing. $a->merchantnumber = $this->getConfig('id'); $a->orderid = $invoice->public_id; $a->currency = Am_Currency::getNumericCode($invoice->currency); $a->amount = $invoice->first_total * 100; $a->accepturl = $this->getReturnUrl(); $a->declineurl = $this->getCancelUrl(); $a->callbackurl = $this->getPluginUrl('ipn'); $a->instantcallback = 1; // Call callback before user returned to accept_url $a->instantcapture = 1; $a->ordertext = $invoice->getLineDescription(); $a->windowstate = 2; if ($invoice->rebill_times) { $a->subscription = 1; $a->subscriptionname = sprintf('Invoice %s, User %s', $invoice->public_id, $invoice->getLogin()); } $a->md5key = $this->getOutgoingMd5($a); $result->setAction($a); } function getSupportedCurrencies() { return array('EUR', 'USD', 'GBP', 'DKK', 'NOK', 'SEK'); } function renameElement(Am_Form $form, $from, $to) { foreach ($form->getElementsByName($from) as $el) $el->setName($to); } public function _doBill(Invoice $invoice, $doFirst, CcRecord $cc=null, Am_Paysystem_Result $result) { $transaction = new Am_Paysystem_Transaction_EpaySale($this, $invoice, null, $doFirst); $transaction->run($result); } public function _initSetupForm(Am_Form_Setup $form) { $form->addText('id')->setLabel('MerchantNumber'); $form->addText('key')->setLabel('Security Key'); $form->addSelect('language', array(), array('options' => array( 2 => 'English', 1 => 'Danish', 3 => 'Swedish', 4 => 'Norwegian', 5 => 'Greenland', 6 => 'Iceland', 7 => 'German', 8 => 'Finnish', 9 => 'Spanish' )))->setLabel('Language'); } public function isConfigured() { return strlen($this->getConfig('id')) && strlen($this->getConfig('key')); } function getEpayError($epay_code, $pbs_code){ $result = $this->APIRequest("subscription", "getEpayError", array( 'merchantnumber' => $this->getConfig('id'), 'language' => $this->getConfig('language'), 'epayresponsecode' => $epay_code )); $result1 = $this->APIRequest("subscription", "getPbsError", array( 'merchantnumber' => $this->getConfig('id'), 'language' => $this->getConfig('language'), 'pbsResponseCode' => $pbs_code )); $xml = $this->getResponseXML($result); $xml1 = $this->getResponseXML($result1); return $xml->getEpayErrorResponse->epayResponseString."
".$xml1->getPbsErrorResponse->pbsResponseString; } /** * * @param String $response * @return SimpleXmlElement */ public function getResponseXML($response){ if(!$response) throw new Am_Exception_InternalError("Can't cancel subscription. Empty result received from epay server!"); // We do this to not deal with namespaces. $response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $response); $xml = simplexml_load_string($response); if($xml === false) throw new Am_Exception_InternalError("Can't parse XML!. Got response: $response"); return $xml->soapBody; } public function cancelInvoice(Invoice $invoice) { $subscriptionid = $invoice->data()->get(self::SUBSCRIPTIONID); if(!$subscriptionid) throw new Am_Exception_InternalError('Subscriptionid is empty in invoice! Nothing to cancel. '); $result = $this->APIRequest("subscription", "deletesubscription", array( 'merchantnumber' => $this->getConfig('id'), 'subscriptionid'=>$subscriptionid )); $xml = $this->getResponseXML($result); if($xml->deletesubscriptionResponse->deletesubscriptionResult != 'true') { throw new Am_Exception_InternalError("Subscription was not cancelled! Got: ".$xml->deletesubscriptionResponse->epayresponse); } // Cancelled; return ; } function createXML($type, $method, $vars){ $request = << CUT; $x = new SimpleXMLElement($request); $ns = $x->getNamespaces(); $m = $x->children($ns['soap'])->addChild($method,"", 'https://ssl.ditonlinebetalingssystem.dk/remote/'.$type); foreach($vars as $k=>$v){ $m->addChild($k, $v); } $xml = $x->asXML(); return $xml; } function APIRequest($type='subscription', $function='',$vars=array()){ try{ $client = new Am_HttpRequest(sprintf("https://ssl.ditonlinebetalingssystem.dk/remote/%s.asmx?op=%s", $type, $function), Am_HttpRequest::METHOD_POST); $client->setHeader('Content-type', 'text/xml'); $client->setHeader('SOAPAction', sprintf("https://ssl.ditonlinebetalingssystem.dk/remote/%s/%s", $type, $function)); $client->setBody($xml = $this->createXML($type, $function, $vars)); $response = $client->send(); }catch(Exception $e){ $this->getDi()->errorLogTable->logException($e); throw new Am_Exception_InputError("Unable to contact webservice. Got error: ".$e->getMessage()); } if(!$response->getBody()) throw new Am_Exception_InputError("Empty response received from API"); return $response->getBody(); } function createTransaction(Am_Mvc_Request $request, Am_Mvc_Response $response, array $invokeArgs) { return new Am_Paysystem_Transaction_Epay($this, $request, $response, $invokeArgs); } function getOutgoingMd5(Am_Paysystem_Action $a) { return md5($a->currency.$a->amount.$a->orderid.$this->getConfig('key')); } function getIncomingMd5(Am_Mvc_Request $r) { $key = md5($s = $r->get('amount').$r->get('orderid').$r->get('tid').$this->getConfig('key')); return $key; } function processRefund(InvoicePayment $payment, Am_Paysystem_Result $result, $amount) { $result = $this->APIRequest("payment", "credit", array( 'merchantnumber' => $this->getConfig('id'), 'transactionid'=> $payment->receipt_id, 'amount' => $amount*100 )); $xml = $this->getResponseXML($result); if($xml->creditResponse->creditResult == 'true'){ $trans = new Am_Paysystem_Transaction_Manual($this); $trans->setAmount($amount); $trans->setReceiptId($payment->receipt_id.'-epay-refund'); $result->setSuccess($trans); }else{ $result->setFailed(array('Error Processing Refund!')); } } function getReadme(){ return << "Payment system" -> "Go to settings for the "Payment system" Here you have 3 options for MD5 Security check 1: Don't want to use MD5 Disable the MD5 security feature 2: On accepturl only Only your accepturl will be using MD5 security check 3: On accepturl and by authorization Your accepturl and the authorization will be using MD5 security check Select option 2 or 3 then enter a MD5 security key in the "key" field CUT; } } class Am_Paysystem_Transaction_Epay extends Am_Paysystem_Transaction_Incoming{ public function getUniqId() { return $this->request->get('tid'); } public function findInvoiceId() { return $this->request->get('orderid'); } public function validateSource() { return $this->getPlugin()->getIncomingMd5($this->request) == $this->request->get('eKey'); } public function validateStatus() { return true; } public function validateTerms() { return $amount == ($this->first_total *100); } public function processValidated() { $this->invoice->addPayment($this); if($this->request->get('subscriptionid')){ $this->invoice->data()->set(Am_Paysystem_Epay::SUBSCRIPTIONID, $this->request->get('subscriptionid'))->update(); } } } class Am_Paysystem_Transaction_EpaySale extends Am_Paysystem_Transaction_CreditCard { protected $ret; public function run(Am_Paysystem_Result $result) { $subscriptionid = $this->invoice->data()->get(Am_Paysystem_Epay::SUBSCRIPTIONID); $req = $this->plugin->APIRequest('subscription', 'authorize', $vars= array( 'merchantnumber' => $this->plugin->getConfig('id'), 'subscriptionid' => $subscriptionid, 'orderid' => $this->invoice->public_id."-".$this->invoice->getPaymentsCount(), 'amount' => $this->invoice->second_total*100, 'currency' => Am_Currency::getNumericCode($this->invoice->currency), 'instantcapture' => 1, 'description' => 'Recurring payment for invoice '.$this->invoice->public_id, 'email' => $this->invoice->getEmail(), 'ipaddress' => $this->invoice->getUser()->remote_addr )); $log = $this->getInvoiceLog(); $log->add(print_r($vars, true)); $this->ret = $this->plugin->getResponseXML($req); $log->add(print_r($this->ret, true)); if($this->ret->authorizeResponse->authorizeResult != 'true') { $result->setFailed(___("Payment failed"). ":" . $this->plugin->getEpayError($this->ret->authorizeResponse->epayresponse)); } else { $result->setSuccess($this); $this->processValidated(); } } public function getUniqId() { return $this->ret->authorizeResponse->transactionid; } public function parseResponse() { } public function validate() { $this->result->setSuccess($this); } public function processValidated() { $this->invoice->addPayment($this); } }