/** * 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; }
/** * 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'); }