Dodawanie płatności DotPay z użyciem jQuery

0

Witajcie!
Napisałem następujący skrypt do testowania możliwości DotPay, jednak co chwilę wyskakuje mi instrukcja z errora:

  var jSonAttributes = { "id": "12345", "amount": "3", "currency": "PLN", "description": "terefere", "lang" : "pl"};

        $.ajax({
            type: "POST",
            url: "https://ssl.dotpay.pl/",
            dataType: "json",
            data: JSON.stringify(jSonAttributes),
            async: false,
            contentType: "application/json; charset=utf-8",
            success: function (data) {
                result = data;
            },
            error: function () {
                alert(JSON.stringify(jSonAttributes));
            }
        });

Co robię nie tak?

1

Czemu właściwie nie złapiesz errora, zeby zobaczyć w czym problem?

error: function (ex) {
    console.log(ex);
}
1

Też jak strzelasz pod inną domenę, to powinieneś użyć raczej dataType: "jsonp".

0

Nowa wiedza :) dzięki!
z pozostawionym datatype: json
"NetworkError: Failed to execute 'send' on 'XMLHttpRequest': Failed to load 'https://ssl.dotpay.pl/t2'."

Zmiana na datatype: jsonp spowodowała, że otrzymałe komunikat z konsoli: "Uncaught SyntaxError: Unexpected token <". Przyznam szczerze, że nawet nie wiem czy to lepiej.

Nie mniej nadal nie mam pojęcia co może być nie tak :(

0

To może oznaczać, ze serwer nie akceptuje Twojej domeny/IP (CORS).
A jeśli to nie jest problemem, może async: false powinno być true?

0

zmiana na async: true nic nie zmieniła.

Nie mniej sam zabieg użycia dataType jsonp spowodowała pojawienie się w konsoli dwóch komunikatów:
readyState: 4, status: 200, statusText: "load"
czyli (chyba) dobrze, skoro status 200 i readyState 4.
Pozostaje tylko drugi komuniat o nieoczekiwanym tokenie.

Wiadomość pochodzi z https://ssl.dotpay.pl/t2 z czwartej linijki wyglądającej tak:

<!DOCTYPE html> <html lang="pl"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1" /> <script type="text/javascript" src="/t2/jsi18n/"></script> <style type="text/css">
1

A jesteś w ogóle pewien, że API DotPaya umożliwia wyciągnięcie w ten sposób informacji, na mój gust to tu brakuję tokena, security code, czy innego badziewia.
Wydaję mi się raczej, powinieneś zrobić metodę u Siebie w aplikacji, która łączy się z operatorem (za pomocą curla, czy Url, nie wiem w jakim języku piszesz) i dopiero wtedy lokalnie bym do tego strzelał.
Na Twoim miejscu najpierw bym sięgnął po dokumentację DotPaya.

0

Piszę w mvc .net / jquery. Z dokumentacji zrozumiałem, że wystarczy wysłać POST na adres https://ssl.dotpay.pl/t2 z danymi jak wypisałem, ale jest szansa, że coś niewłaściwie rozumiem. Też mi się wydawało, że to nie wygląda najbezpieczniej.
Wiem, że można jeszcze wygenerować konkretne linki z tokenami na konkretne kwoty wpłat, niestety charakter zadania na to nie pozwala, kwota ma się generować.

1

Przejrzałem pobieżnie dokumentację i wydaję mi się, że ajaxem nic tutaj nie zawojujesz.
Żeby klient mógł opłacić przez DotPay-a robisz zwykły input opakowany w formie z hiddenami. Klient go submituję i tam już na stronie operatora, dostaję do wyboru kanały płatności i tyle.

0

Finalnie zrezygnowałem z ajaxa (częściowo) i zrobiłem to w klasycznym, nudnym, niewidzialnym formie:

            
            <form action="https://ssl.dotpay.pl/test_payment/" method="post" id="dotpay_redirection_form">
                <input name="api_version" value="dev" type="hidden" />
                <input name="lang" value="pl" type="hidden" />
                <input name="id" value="123456" type="hidden" />
                <input name="amount" value="" id="PaymentAmountHidden" type="hidden" />
                <input name="currency" value="PLN" type="hidden" />
                <input name="description" value="" id="description" type="hidden" />
                <input name="chk" value="" id="chk" type="hidden" />
                <button class="centralize paymentSubmitButton" type="submit" form="dotpay_redirection_form" value="Submit">OPŁAĆ DOSTĘP</button>
            </form>

Do tego należy oczywiście dodać obliczony kod z sprawdzający o enigmatycznej nazwie "chk". W tym celu zrobiłem sobie funkcję javaScriptową:

 
    function SetChk() {
        $.ajax({
            method: "GET",
            url: "/Payments/GetChkForDotPay",
            data:
                {
                    amount:$("#PaymentAmount").val(),
                    description: $("#description").val()
                }
        })
       .done(function (content) {
           $("#chk").val(content);
       })
       .fail(function () {
           $("#chk").val("");
       });
    }

Sama zaś funkcja obliczająca chk znajduje się, naturalnie, w PaymentsController i wygląda tak:

 

public String GetChkForDotPay(string amount, string description)
        {
            string PIN = "ABCDE123455",
                   api_version = "dev",
                   lang = "pl",
                   id = "123456",
                   currency = "PLN",
                   concatOfParameters;

            concatOfParameters = PIN + api_version + lang + id + amount + currency + description;

            return EncodeToSha256(concatOfParameters);
        }

        private string EncodeToSha256(string concatOfStrings)
        {
            SHA256Managed sha256 = new SHA256Managed();
            string resultString = null;

            byte[] byteConcat = Encoding.UTF8.GetBytes(concatOfStrings);
            int byteNumber = Encoding.UTF8.GetByteCount(concatOfStrings);

            byte[] result = sha256.ComputeHash(byteConcat, 0, byteNumber);

            foreach (byte a in result)
            {
                resultString += a.ToString("x2");
            }

            return resultString;
        }

Do tego wszystkiego potrzebujemy bibliotek:

using System.Security.Cryptography;
using System.Text;
 

Kod PIN możemy pobrać z naszego panelu w DotPay Ustawienia -> Powiadomienia -> Konfiguracja urlc. Należy również odfajkować blokowanie zewnętrznych URLC.

Edit:
PS. Szukam pracy w Trójmieście jako junior .NET developer :p

1

Ok, tylko przy takim podejściu, proponuję ustawić input-a na disabled albo założyć jakąś maskę na content, żeby nie było tak klient kliknie input-a szybciej zanim dostanie zwrotkę z ajax-a z ustawioną wartością chk.

0

racja. Tak zrobię. Przycisk submit klasy "paymentSubmitButton" rozpoczyna swoją egzystencję jako disabled.

 function SetChk() {

        $(".paymentSubmitButton").attr("disabled", true);

        $.ajax({
            method: "GET",
            url: "/Payments/GetChkForDotPay",
            data:
                {
                    amount:$("#PaymentAmount").val(),
                    description: $("#description").val()
                }
        })
       .done(function (content) {
           $("#chk").val(content);
       })
       .fail(function () {
           $("#chk").val("");
       });
    }
    
         if (totalCost != 0)
            $(".paymentSubmitButton").attr("disabled", false);

BTW, myślicie, że mogę to wrzucić do tutejszej bazy wiedzy? Może komuś się przyda, a mnie działa.

0

Disabled ustaw przy inpucie, przy wolniejszym necie, użytkownik może zobaczyć aktywny przycisk.
Poza tym proponuję przypisać obiekt do zmiennej i już na nim działać var chkValue = $("#chk"), tak żeby nie przeszukiwać znowu DOM-u.

0
Wybitny Samiec napisał(a):

Disabled ustaw przy inpucie, przy wolniejszym necie, użytkownik może zobaczyć aktywny przycisk.
Poza tym proponuję przypisać obiekt do zmiennej i już na nim działać var chkValue = $("#chk"), tak żeby nie przeszukiwać znowu DOM-u.

Chciaż tutaj ma to raczej mniejsze znaczenie ($("#chk")), bo wykona Ci się albo success albo fail.

1 użytkowników online, w tym zalogowanych: 0, gości: 1