/**
  * Creates WebPay control for handling WebPay requests/responses
  *
  * @param vStore\Shop\Order
  * @param Nette\Callback callback for successful payment handling
  * @param Nette\Callback callback for unsuccessful payment handling
  *
  * @return vStore\Application\UI\Controls\WebPay
  */
 function createComponent(Order $order, Nette\Callback $onSuccessCallback, Nette\Callback $onErrorCallback)
 {
     $wp = new WebPay();
     $wp->setRequestUrl($this->_muzoGatewayUrl);
     $wp->setMerchantNumber($this->_muzoMerchantNumber);
     $wp->setPublicKey($this->_muzoGatewayPublicKey);
     $wp->setPrivateKey($this->_muzoMerchantPrivateKey, $this->_muzoMerchantPasspharse);
     // Vytvareni pozadavku
     $wp->onCreate[] = function (WebPay $webPay, WebPayRequest $request) use($order) {
         // Pořadové číslo objednávky. Je potřeba při každém i nepovedeném požadavku změnit.
         // Maximální délka je 15 číslic (YYMM NNNN SSSSSSS)
         $orderNumber = $order->timestamp->format('ym') . str_pad(mb_substr($order->id, 6), 4, "0", STR_PAD_LEFT);
         // 2*Y + 2*M + {1..4}N => 8 cifer
         $timeDiff = abs(time() - $order->timestamp->getTimestamp());
         // Pokud je objednavka starsi jak cca 115 dni, tak by doslo k preteceni citace (Mame k dispozici jen 7 cifer)
         if ($timeDiff > 9999999) {
             throw new Nette\InvalidStateException("Order is too old for direct payment.");
         }
         $request->setOrderNumber($orderNumber . str_pad($timeDiff, 7, "0", STR_PAD_LEFT));
         // Cena objednavky v halirich
         $request->setAmount(($order->total + $order->ceiling) * 100, 'CZK', true);
     };
     // Pri uspesne dokoncene objednavce (PRCODE = 0, SRCODE = 0, overeno verejnym certifikatem)
     $wp->onResponse = array();
     $wp->onResponse[] = function (WebPay $webPay, WebPayResponse $response) use($onSuccessCallback, $order) {
         $order->isPaid = true;
         $order->save();
         $onSuccessCallback->invoke($order);
     };
     // Pri chybe (PRCODE <> 0 || SRCODE <> 0)
     $wp->onError = array();
     $wp->onError[] = function (WebPay $webPay, WebPayException $exception) use($onErrorCallback, $order) {
         $msg = $exception->getMessage();
         // Překlad chybových zpráv
         if ($exception->getPrimaryCode() == 30) {
             switch ($exception->getSecondaryCode()) {
                 case 1001:
                     $msg = "Neúspěšná autorizace – karta blokovaná.";
                     break;
                 case 1002:
                     $msg = "Autorizace zamítnuta.";
                     break;
                 case 1003:
                     $msg = "Neúspěšná autorizace – problém karty. Kontaktujte vydavatele karty.";
                     break;
                 case 1004:
                     $msg = "Neúspěšná autorizace – technický problém v autorizačním centru.";
                     break;
                 case 1005:
                     $msg = "Neúspěšná autorizace – problém účtu. Kontaktujte vydavatele karty.";
                     break;
                 default:
                     Nette\Diagnostics\Debugger::log($exception);
             }
         } elseif ($exception->getPrimaryCode() == 28) {
             switch ($exception->getSecondaryCode()) {
                 case 3000:
                     $msg = "Neúspěšné ověření držitele karty. Kontaktujte vydavatele karty.";
                     break;
                 case 3001:
                     $msg = "Autorizace zamítnuta.";
                     break;
                 case 3002:
                     $msg = "Vydavatel karty nebo karta není zapojena do 3D. Kontaktujte vydavatele karty.";
                     break;
                 case 3004:
                     $msg = "Vydavatel karty není zapojen do 3D nebo karta\nnebyla aktivována. Kontaktujte vydavatele.";
                     break;
                 case 3005:
                     $msg = "Technický problém při ověření držitele karty.\nKontaktujte vydavatele karty.";
                     break;
                 case 3006:
                     $msg = "Technický problém při ověření držitele karty.";
                     break;
                 case 3007:
                     $msg = "Technický problém v systému zúčtující banky. Kontaktujte obchodníka.";
                     break;
                 case 3008:
                     $msg = "Použit nepodporovaný karetní produkt. Kontaktujte vydavatele karty.";
                     break;
                 default:
                     Nette\Diagnostics\Debugger::log($exception);
             }
         } elseif ($exception->getPrimaryCode() == 17) {
             $msg = "Částka k úhradě překročila autorizovanou částku.";
         } elseif ($exception->getPrimaryCode() == 18) {
             $msg = "Součet kreditovaných částek překročil uhrazenou částku.";
         } elseif ($exception->getPrimaryCode() == 35) {
             $msg = "Vypršel časový limit pro provedení platby.";
         } else {
             Nette\Diagnostics\Debugger::log($exception);
         }
         $onErrorCallback->invoke($order, $msg);
     };
     return $wp;
 }
Exemple #2
0
 /**
  * Defaultní událost při chybové odpovědi od banky.
  * Přidá chybu jako flashMessage na presenter.
  * @see self::$onError
  * @param WebPay
  * @param WebPayException Chyba od banky.
  * @return void
  */
 public static function defaultError(WebPay $webPay, WebPayException $exception)
 {
     $webPay->getParent()->flashMessage($exception->getMessage(), 'error');
 }