Az Übercart Credit Card modulja fura hibákat produkál, ha ékezetes nevet megadva próbál az ember fizetni.
Belefutottam ebbe a "kis" problémába, és gondoltam leírom a tapasztalataimat.
Ott kezdődik a gond, hogy ha az Übercart Credit Card payment modulját bekapcsolod, és beállítod, hogy kérjen kártyán szereplő nevet is, majd megpróbálsz egy olyan nevet megadni a fizetésnél, amiben van ékezet, akkor ahelyett, hogy jelezné hogy ez a probléma, a következő hibaüzenetekkel töltődik újra az oldal:
user warning: in site_könyvtár\modules\dblog\dblog.module on line 147.
user warning: in site_könyvtár\modules\dblog\dblog.module on line 147.
A bankkártya adatai kitörlődnek, ha a böngészőben frissül a rendelési előnézetet, mindez annak érdekében történik, hogy a kártyahasználó személyes adatai 3. személyhez ne kerülhessen. Újból meg kell adni a kártyaszámot majd be kell küldeni az űrlapot.
És tényleg, a kártya adatok kitörlődnek az űrlapból.
A hiba alapvető oka, hogy az uc_credit modul egy saját titkosító eljárást használ a kártya-adatok ideiglenes tárolására. Az ezt megvalósító függvényekbe pedig "bele van égetve", hogy milyen karaktereket hajlandó elkódolni:
$this->scramble1 = '! #$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`"abcdefghijklmnopqrstuvwxyz{|}~'; $this->scramble2 = 'f^jAE]okIOzU[2&q1{3`h5w_794p@6s8?BgP>dFV=m" D<TcS%Ze|r:lGK/uCy.Jx)HiQ!#$~(;Lt-R}Ma,NvW+Ynb*0X';
A problémát tetőzi, hogy a hibát megpróbálja belogolni a watchdog-ba, de mivel érvénytelen karakter van a hibaüzenetben is emiatt, ezért a watchdog is hibát jelez (ezért az első 2 user warning).
Ha helyregyógyítja az ember az us_store.module uc_store_encryption_errors függvényét mondjuk egy utf8_encode()-al, akkor már legalább beíródik a watchdogba, hogy mi is a baja.
Persze ez továbbra sem jelenik meg a felhasználónak. Szóval azt gondolná az ember, hogy akkor most vagy fogadja el az ékezeteket, vagy ha nem, legalább írja ki. De ezen hiba-burjázás midkét esetet meghiúsítja.
A problémára van egy issue: http://drupal.org/node/912742 ez azonban csak egy patch, mely az alábbi kódrészlettel egészíti ki a modult:
// Transliterate owner name field if possible. if (module_exists('transliteration')) { $cc_data['cc_owner'] = check_plain(transliteration_get($_POST['cc_owner'])); }
Azaz, ha fel van telepítve a Transliterate modul, akkor meghívja az átakakító függvényét, így a Molnár Rolandból Molnar Roland lesz. Ezt persze korántsem tartom megfelelő megoldásnak, hiszen ekkor a kártyafeldolgozó gateway-nek is így lesz átadva a kártyán szereplő név. Persze tudtommal a kártyaelfogadó rendszereket ez nem nagyon zavarja, de azért hát mégis... :)
Szóval a fent említett patch működik, megszűnik tőle a fent leírt hiba, de tényleges megoldás az lenne, ha az uc_store.module-ban lévő uc_encryption_class-t írnák újra, hogy mondjuk ne csak az angol ábécével menjen. Másik alternatíva lehet még, hogyha a kártyaszám validálásával egyidőben leellenőrizzük, hogy ezen "scramble1"-nek megfelel-e a beírt név, és hibaüzenettel kidobjuk, ha nem. Na persze ezt is megpróbáltam, de érdekes módon ha az encryption-ben hiba van, nem jelenített meg semmilyen drupal_set_message() által kiíratandó hibaüzenetet nekem. Bevallom, nem volt kedvem tovább vacakolni, maradt a Transliterate és a patch :/
Ehhez kapcsolódóan másik érdekes probléma, hogy ha hibával újratöltődik a checkout képernyő, a beírt kártyaszám kicserélődik arra, hogy
(Utolsó 4) XXXX
- ahol az XXXX a beírt szám utolsó 4 jegye. Na és most jön a vicc: ezt az űrlapot így újra beküldve megint jönnek a watchdog warning-ok, mert hát az ó betű sem tetszik az encrypt-nek, és persze ezt próbálja logolni és persze ezen elhasal a watchdog :)
Ekkor már nagyon ideges az ember, és a fordításban kicserélni az '(Utolsó 4)' szöveget a sokkal egyértelműbb XXXX XXXX XXXX -re (vagy ---- ---- ---- vagy hasonló, kinek mi tetszik). :)
Übercart verzió: 6.x-2.4