contributte/gopay

Nastaveni platebnich kanalu v config.neon provadi nepotrebne volani GoPayWS

Closed this issue · 14 comments

Tenhle kousek kódu.

gopay:
    gopayId        : xxxx
    gopaySecretKey : xxxx
    testMode       : true
    channels:
        card_ceskas: Yes

"Problém" je ve volání $gopay->allowChannel(...) (Gopay/Service.php#L262) které zpusobí volání GoPay WS a to v mém případě zvedne latenci odpovědí celého webu (bez ohledu na použití plateb) o ±400ms.

Přesunul jsem nastavení kanálů do modelu, těsně před volání $gopay->pay(...) ale rád bych nechal konfiguraci tak kde patří.

Nějaké nápady? Nemám zkušenosti s psaním extenzí pro Nette. Ale pokusím se zbastlit nějakou formu lazy loadingu. Nebo možná cache?

Zítra se na to pořádně podívám a zkusím dát dohromady pull request. Pokud z mé snahy vypadne něco kloudného.

@encero 👍

@encero Já jsem si toho všiml až v dobu, kdy nastal problém při komunikaci s GoPay - možná chybný WSDL soubor nebo nějaká jiná chyba při zpracování. Kompletně celá aplikace přestala pracovat (výjimka GopayFatalException('Loading of native Gopay payment channels failed due to communication with WS.')).

Problém jsem řešil rovněž tak, že jsem channels odstranil z configu a přidávám je bezprostředně před voláním $gopay->pay(...).

Řešil už jsi to nějak jinak? Pull-request nevidím a nevím jestli se v tom mám dále vrtat nebo prostě channels v configu NIKDY nepoužívat.

Jinak @hrach díky za skvělou práci :)

@hranicka Nakonec na to nezbyl cas a resil jsem jine veci na projektu. Mam to porad v todo. Ale v tuhle chvili jsme zustali u workaroundu s pridanim platebnich kanalu na "posledni chvili".

První vylepšení implementováno - extenze automaticky registruje metody addPaymentButton a addPaymentButtons do formuláře, a k tomu se vytvářela instance Markette\Gopay\Service. Nyní už tomu tak není, a instance se vytvoří až v okamžiku zavolání těchto metod.

Chápu to dobře, že problém je načítání Gopay kanálů i když používáte jen svoje custom vlastní? Nebylo by pak řešením, kdyby se v allowChannel a denyChannel nejdřív kontrovalo, jestli je kanál znám, a teprve pokud ne, načetly by se ty z Gopay, a kontrola by se opakovala?

Nacitani kanalu bych uplne odstranil - je uplne k nicemu. protoze nevraci relevantni kanaly, ktery dany user muze pouzivat. Jediny k cemu nam muze byt, ze tak jakoby povolime vsechno a nechceme je vyjmenovat, ale to je knicemu, kdyz tam budou pak kanaly, ktery uzivatel nema. Tj. urcite uplne odstranit tuto podporu a nechat uzivatele explicitne kanaly jmenovat.

take bojuji s pochopením

@hrach 👍

@hrach 👍

nedávno měl Gopay výpadek a tak Soap vyhodil warning:

SoapClient::SoapClient(https://testgw.gopay.cz/axis/EPaymentServiceV2?wsdl): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found

a proto nám nefungovala celá aplikace, a to ani na stránkách, které Gopay nepotřebují.

@michallohnisky to je samozrejme vase chyba, kdyz instancujete servicu, kdyz ji nepotrebujete ;) nebo ne?

@michallohnisky také jsem s tím měl problém - celá aplikace přestala fungovat pokud se pokazilo něco při komunikaci s GoPay serverem, řešil jsem to pak:

  • kanály jsem nenastavoval v configu jak píše @encero tady - pokud GoPay neodpovídal, celá aplikace spadla už při inicializaci
  • kanály nastavuji až když je to potřeba a zároveň ošetřuji případný problém při volání ::allowChannel když náhodou GoPay nefunguje
    // ...

    private function pay()
    {
        $goPay = $this->goPay;

        try {
            $this->setChannels($goPay);
            $response = $goPay->pay($payment, $goPay::METHOD_CARD_CESKAS, [$this, 'onResponseCreate']);
            $this->presenter->sendResponse($response);
        } catch (\Exception $e) {
            if ($e instanceof Gopay\GopayException || $e instanceof Gopay\GopayFatalException) {
                Debugger::log($e, Debugger::WARNING);
                $this->presenter->flashMessage('Platební služba GoPay bohužel momentálně nefunguje. Zkuste to prosím za chvíli.');
                $this->runOnError();
            } else {
                throw $e;
            }
        }
    }

    /**
     * @param Gopay\Service $goPay
     * @throws Gopay\GopayFatalException
     */
    private function setChannels(Gopay\Service $goPay)
    {
        $goPay->allowChannel($goPay::METHOD_GOPAY);
        $goPay->allowChannel($goPay::METHOD_CARD_CESKAS);
        $goPay->allowChannel($goPay::METHOD_CARD_UNICREDITB);
        $goPay->allowChannel($goPay::METHOD_SUPERCASH);
        $goPay->allowChannel($goPay::METHOD_PREMIUMSMS);
        $goPay->allowChannel($goPay::METHOD_MPLATBA);
        $goPay->allowChannel($goPay::METHOD_KOMERCNIB);
        $goPay->allowChannel($goPay::METHOD_RAIFFEISENB);
        $goPay->allowChannel($goPay::METHOD_MBANK);
        $goPay->allowChannel($goPay::METHOD_FIOB);
        $goPay->allowChannel($goPay::METHOD_UNICREDITB);
        $goPay->allowChannel($goPay::METHOD_SLOVENSKAS);
        $goPay->allowChannel($goPay::METHOD_TRANSFER);
    }

@hrach Myslím, že stačilo jen v neonu povolit extension a už to bylo. Extension, předpokládám, nejde povolit jen pro některé stránky.
@hranicka Moc díky, vyzkouším.