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 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.
@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);
}