Zkuste si ten podpis vypočítat jinak, ručně, a porovnat s tím, co vypočítá váš kód. Osobně mi připadá odvážné jen tak pospojovat všechny proměnné jako text a celé to nacpat do md5. Třeba už jen proto, že md5 se počítá z bajtů, vy tam ale vkládáte text – takže se text musí nějak převést na bajty, a to by se mělo dít definovaným (a PayU stanoveným) způsobem, ne „jak to zrovna vyjde“.