Formularz płatności PayU

Witam wszystkich
Mam problem z integracją płatności PayU na swojej stronie, pomoc techniczna nie jest skora do pomocy i dlatego pisze tutaj.
Stworzyłem na swojej stronie formularz dotacji dla fundacji, w której uzytkownik może wybrac kwotę wpłaty z sześciu różnych kwot (pola typu Radio w formularzu), wpisuje imie, nazwisko, adres email i wciska przycisk płacę z PayU.

Wydaje mi się że wszystkie pola wypełniłem poprawnie, aczkolwiek mam problem z polem “totalAmount” ponieważ w ich formularzu to pole jest jedno z konkretna kwotą, a ja daje wybór kwoty, więc to powinno być chyba dynamiczne.

bardzo prosze o pomoc integracji.

Z góry dziekuje i pozdrawiam

Według mnie po prostu gdy użytkownik wybierze jedną z opcji na Twojej stronie to Ty wstawiasz tę sumę w pole totalAmount i wysyłasz do PayU. Przecież do PayU nie wysyłasz ileś tam prawdopodobnych kwot tylko jedną konkretną.

No tak, ale to działa automatycznie, bez mojego udziału. Użytkownik wypełnia formularz zaznaczając kwote, wpisując dane o sobie i klika w przycisk “Płacę z PayU”, po czym zostaje przeniesiony na ich stronę i tylko się loguje, potwierdza i po sprawie.

Ale w jaki sposób komunikujesz się z PayU, jakie dane wysyłasz do PayU? Klikając w przycisk może i Cie przeniesie do PayU, ale sam musisz zdefiniować jakie dane przekazujesz do PayU. Przecież dane o cenie, walucie, produkcie itd. sam wysyłasz.

Formularz ma pola, które mają odpowiednie nazwy narzucone przez PayU, np. pole Imię ma atrybut “name=buyer.firstName” itd. One przekazują do PayU dane, które wprowadza użytkownik.
W ich instruktażowym formularzu, jest pole “name=totalAmount”, które przekazuje konkretną sume do wpłaty, ale to jest jedna, z góry ustalona kwota. A ja chce dać użytkownikowi do wyboru kilka kwot, żeby sobie wybrał, czy chce wpłacić 100 zł czy 500 zł. I tutaj nie moge tego pola odgórnie wpisać do formularza.

Możesz pokażesz jakiś kod, bo totalnie już nie kumam o co chodzi.

@jacula jeśli dobrze Cię rozumiem, to potrzebujesz czegoś takiego:

<input type="radio" name="totalAmount" value="100"> 100<br>
<input type="radio" name="totalAmount" value="200"> 200<br>
<input type="radio" name="totalAmount" value="300"> 300
   kurde, czyżby to było takie proste?
Ich kod z dokumentacji wygląda tak:

W piątej linijce jest pole totalAmount z ustaloną wartością 1000 co daje nam 10zł

    <form method="POST" action="https://secure.payu.com/api/v2_1/orders">
        <input type="hidden" name="customerIp" value="123.123.123.123">
        <input type="hidden" name="merchantPosId" value="145227">
        <input type="hidden" name="description" value="Opis zamówienia">
        <input type="hidden" name="totalAmount" value="1000">
        <input type="hidden" name="currencyCode" value="PLN">
        <input type="hidden" name="products[0].name" value="Produkt 1">
        <input type="hidden" name="products[0].unitPrice" value="1000">
        <input type="hidden" name="products[0].quantity" value="1">
        <input type="hidden" name="notifyUrl" value="http://shop.url/notify">
        <input type="hidden" name="continueUrl" value="http://shop.url/continue">
        <input type="hidden" name="OpenPayu-Signature" type="hidden" value="sender=145227;algorithm=SHA-256;signature=565f9f4dda43c8e24ccab4472133d680e2aa58e1f58bea845c4cf2926965144d">
        <button type="submit" formtarget="_blank">Płacę z PayU</button>
    </form>

Mój kod wygląda tak:
Nadal jest w piątej linijce totalAmount, ale tylko dlatego że nie wiem co z nim zrobić

<form method="POST" action="https://secure.payu.com/api/v2_1/orders">
    <input type="hidden" name="customerIp" value="123.123.123.123">
    <input type="hidden" name="merchantPosId" value="1341657">
    <input type="hidden" name="description" value="Dotacja na DM">
    <input type="hidden" name="totalAmount" value="1000">
    <input type="hidden" name="currencyCode" value="PLN">
    <input type="hidden" name="OpenPayu-Signature" type="hidden" value="sender=1341657;algorithm=SHA-256;signature=565f9f4dda43c8e24ccab4472133d680e2aa58e1f58bea845c4cf2926965144d">
    <p class="form-pay">Wybierz kwotę wpłaty</p>
    <div class="form-payu">
        <div style="width: 50%; float: left; text-align: right; font-size: 150%;">
            <label for="100">100 zł</label>
        </div>
        <div style="width: 50%; float: left;">
            <input type="hidden" name="products[0].name" value="100 zl">
            <input type="radio" name="products[0].unitPrice" value="10000" id="100">
            <input type="hidden" name="products[0].quantity" value="1">
        </div>
    </div>
    <div class="form-payu">
        <div style="width: 50%; float: left; text-align: right; font-size: 150%;">
            <label for="200">200 zł</label>
        </div>
        <div style="width: 50%; float: left;">
            <input type="hidden" name="products[1].name" value="200 zl">
            <input type="radio" name="products[1].unitPrice" value="20000" id="200">
            <input type="hidden" name="products[1].quantity" value="1">
        </div>
    </div>
    <div class="form-payu">
        <div style="width: 50%; float: left; text-align: right; font-size: 150%;">
            <label for="250">250 zł</label>
        </div>
        <div style="width: 50%; float: left;">
            <input type="hidden" name="products[2].name" value="250 zl">
            <input type="radio" name="products[2].unitPrice" value="25000" id="250">
            <input type="hidden" name="products[2].quantity" value="1">
        </div>
    </div>
    <div class="form-payu">
        <div style="width: 50%; float: left; text-align: right; font-size: 150%;">
            <label for="500">500 zł</label>
        </div>
        <div style="width: 50%; float: left;">
            <input type="hidden" name="products[3].name" value="500 zl">
            <input type="radio" name="products[3].unitPrice" value="50000" id="500">
            <input type="hidden" name="products[3].quantity" value="1">
        </div>
    </div>
    <div class="form-payu">
        <div style="width: 50%; float: left; text-align: right; font-size: 150%;">
            <label for="1000">1000 zł</label>
        </div>
        <div style="width: 50%; float: left;">
            <input type="hidden" name="products[4].name" value="1000 zl">
            <input type="radio" name="products[4].unitPrice" value="100000" id="1000">
            <input type="hidden" name="products[4].quantity" value="1">
        </div>
    </div>
    <div class="form-payu">
        <div style="width: 50%; float: left; text-align: right; font-size: 150%;">
            <label for="1500">1500 zł</label>
        </div>
        <div style="width: 50%; float: left;">
            <input type="hidden" name="products[5].name" value="1500 zl">
            <input type="radio" name="products[5].unitPrice" value="150000" id="1500">
            <input type="hidden" name="products[5].quantity" value="1">
        </div>
    </div>
    <p class="person-pay">Dane wpłacającego</p>
    <div class="form-pay">
        <label class="dane" for="imie">Imię</label>
        <input type="text" name="buyer.firstName" id="imie">
    </div>
    <div class="form-pay">
        <label class="dane" for="nazwisko">Nazwisko</label>
        <input type="text" name="buyer.lastName" id="nazwisko">
    </div>
    <div class="form-pay">
        <label class="dane" for="email">Adres email</label>
        <input type="email" name="buyer.email" id="email">
    </div>
    <div class="form-pay">
        <button type="submit" formtarget="_blank"></button>
    </div>
</form>

@jacula Zamiast pola typu hidden zrób select. Doczytaj o różnych polach w formularzach html i jak one działają to zobaczysz, że problem który rozwiązujesz jest trywialny :).

Masz rację, select jest dobrym wyborem, tak samo jak “radio” po wyboru którego, reszta jest pomijana. Różnica chyba tylko w wyświetlaniu, tutaj rozwijalna lista a tam wszystkie opcje widoczne, tylko do zaznaczenia.

na mój rozum, po wyborze jednej z opcji, czy to w jednym czy drugim przypadku, formularz powinien wysłać odpowiednie zapytanie do systemu PayU.

Według mnie, problem leży w tej linijce
<input type="hidden" name="OpenPayu-Signature" type="hidden" value="sender=145227;algorithm=SHA-256;signature=565f9f4dda43c8e24ccab4472133d680e2aa58e1f58bea845c4cf2926965144d">
gdzie w wartości mamy podane
sender - nasz numer klienta payu
algorytm wysyłki
i tutaj najciekawsze
sygnature wyliczoną oddzielnie dla każdego formularza. Ponoć jak się zmieni w ich oryginalnym formularzu (tym z dokumentacji) cenę, to już wyskakuje błąd, gdyż trzeba na nowo wyliczyć sygnaturę. I teraz nie wiem, czy mogę wyliczyc sygnaturę z np. sześcioma polami, niech będą select, dla których są różne pola totalAmount

@jacula Masz jakiś link do dokumentacji PayU (tej części na której działasz)?

http://developers.payu.com/pl/restapi.html#creating_new_order_form

" Integracja poprzez formularz nie jest zalecana i prezentowana jedynie w celach informacyjnych dla istniejących implementacji."

Zrób to ta jak zalecają przez REST API http://developers.payu.com/pl/restapi.html#creating_new_order_api

Czytałem to zdanie dzisiątki razy. Nie jest zalecana, nikt nie potrafi odpowiedzieć dlaczego, może dlatego że do innych płatności czyt. sklepy maja przygotowane gotowe moduły, a tutaj niestandardowa rzecz i zaczynaja się schodki.

Nie mam pomysłu jak inaczej niż formularz zrobić taki punkt wpłat na stronie.

@jacula Pole kwoty załatwisz tak jak pisałem - selectem. Pozostaje jednak najważniejsza kwestia. Musisz przed wysłaniem formularza obliczyć poprawnie wartosć pola OpenPayu-Signature zgodnie z algorytmem opisanym na stronie http://developers.payu.com/pl/restapi.html#references_form_signature. Jeśli wszystkie pola, poza kwotą, są stałe to mógłbyś obliczyć sygnaturę dla każdej z kwot i podmieniać ją javascriptem w zależności od wybranej kwoty. Jeśli to jest niemożliwe (wartości są dynamiczne) to musisz ją obliczać po stronie serwera (np. dlatego że w jej skład wchodzi Twój klucz prywatny).

Formularz, który wysyłasz sobie do kontrolera. Tam odczytujesz parametry, przetwarzasz co tam chcesz - tworzysz strukturę danych jak w dokumentacji, podpisujesz ją i wysyłasz POSTem do payu. Różnica jest taka, że nie wysyłasz formularza do payu tylko do siebie a od siebie wysyłasz requesta do PayU.
Robisz drugi kontroler, który słucha “informacji” od PayU - payu notify i ten uaktualnia statusy płatności.

Czyli w skrócie:
a) przez formularz - przeglądarka komunikuje się z PayU
b) REST API - przeglądarka komunikuje się z backendem a backend z PayU

No dobra. W takim razie moja wiedza z tego zakresu jest za krótka, żeby to samemu ogarnąć.
Bardzo dziękuje wszystkim za cierpliwość i dobre rady.

Pytanie do magików od kodowania :wink:
Czy jest ktoś, kto by się podjął tego zlecenia odpłatnie?

pozdrawiam