Tworzenie modułu przelewy24 dla systemu Nopcommerce

0

Tworzę moduł do systemu nopcommerce 4.7 który obsługuje przelewy24 wszystko tak naprawdę działa poprzez odpytania przez postmana ale podczas składania zamówienia poprzez sklep nie otrzymuję informacji tzn jest wykonywana metoda ale nie mam wartości w formCollection aby przeprowadzić weryfikację transakcji.
Całość ma się opierać o tą dokumentacj https://www.przelewy24.pl/storage/app/media/do-pobrania/dokumentacja-techniczna/przelewy24_dokumentacja_3.2.pdf

To url który jest wysyłany do przelewy24 do sprawdzenia transakcji.
string statusUrl = $"https://localhost:57302/PaymentPrzelewy24/Status";

Tak wygląda metoda którą odpytuje przelewy24:

namespace Nop.Plugin.Payments.Przelewy24.Controllers
{
    public class PaymentPrzelewy24Controller : BasePaymentController
    {
        [AllowAnonymous]
        [HttpPost, ActionName("Status")]
        public async Task<IActionResult> Status([FromForm] IFormCollection formCollection)
        {
            var sessionId = formCollection["p24_session_id"].ToString();
            var amount = formCollection["p24_amount"].ToString();
            var orderId = formCollection["p24_order_id"].ToString();
            var posId = formCollection["p24_pos_id"].ToString();
            var merchantId = formCollection["p24_merchant_id"].ToString();
            var method = formCollection["p24_method"].ToString();
            var statement = formCollection["p24_statement"].ToString();
            var currency = formCollection["p24_currency"].ToString();
            var sign = formCollection["p24_sign"].ToString();

            return Content("OK");
        }
    }
}

Przez postmana wysłane są dane w postaci x-www-form-urlencoded i jest dobrze. Od przelewy24 dostałem informację że jest to właśnie x-www-form-urlencoded więc nie wiem dlaczego nie otrzymuję danych w metodzie Status przy automatycznym jej wywołaniu.

Proszę o pomoc w ustaleniu gdzie jest problem.

0

Użyłeś tu bardzo dużo skrótów myślowych, a ten kod za bardzo nic nie mówi, możesz to szerzej opisać?

0

No jak wołany jest EP poprawnie, ale nie masz wartości w form collection to pewnie jest problem z 'przetłumaczeniem' na obiekt tego.
Ten POST od p24 jest na pewno taki sam jak Twój z postmana? (poza wartościami rzecz jasna)

0

W dokumentacji punkt 5.4 jest właśnie napisane że są w postaci p24_ zwracane.
screenshot-20241014155832.png

W postman tak to wygląda
screenshot-20241014160333.png

0

ale gdzie Ty w tym kodzie wysyłasz POSTa do nich?

0

Poprzez metodę Status ja odbieram dane z Przelewy24 potem jest weryfikacja tych danych ale to inna kwestia. I właśnie przy odbiorze danych nie ma w formCollection gdy Przelewy24 automatycznie dostarcza. Gdy robie to przez postman jest okej.

1

Przecież w tej metodzie (kod w oryginalnym poście) nie ma nic nt. wysyłania requesta do Przelewy24, albo ja czegoś nie rozumiem

Wysyłasz request w postmanie i dostajesz zwrotkę z Przelewy24. I to ma sens.

W tym kodzie C# nie ma wysyłania requesta, no chyba że tu jest jakiś trik związany z NopCommercem, bo tego nie wiem.

Chyba że to działa w ten sposób, że wcześniej mówisz Przelewy24 aby wysłali pinga/hooka/requesta do ciebie pod dany URL gdy transakcja przejdzie i oni to robią - taki callback.

No ale wtedy jeżeli ty odpalasz to lokalnie, to twój serwer komputer nie jest widoczny dla ich serwerów.

1

Tak, to jest zwrotka od p24, że dokończona została płatność.

1
PiotrSz772 napisał(a):

To url który jest wysyłany do przelewy24 do sprawdzenia transakcji.
string statusUrl = $"https://localhost:57302/PaymentPrzelewy24/Status";

Ale jakim cudem przelewy24 ma Ci wysłać coś na localhost?

0

@Veo
@szydlak

Też tak uważam, no tylko czemu mu to w postmanie działa? 😄

Chyba że nie działa :D

0

Mam aplikację uruchomioną w sieci pod domeną więc wywoływana jest ta akcja ale nie ma wartości w formCollection.
Chyba że to działa w ten sposób, że wcześniej mówisz Przelewy24 aby wysłali pinga/hooka/requesta do ciebie pod dany URL gdy transakcja przejdzie i oni to robią - taki callback.

  • Tak właśnie jest callback
0

A jak zamienisz [FromForm] na [FromBody]? A, no i oczywiście odpowiedni typ zamiast IFormCollection, ale w sumie dla testów mógłbyś tam nawet chyba dynamic dać, lub najlepiej stworzyć odpowiedni model (klase) aby model binding zadziałał

I jeszcze dodałbym jakiś log/Console.WriteLine("dupa") czy w ogóle wchodzi do tego handlera

0

Jednak nie działa dla automatycznego wywołania z przelewy24 (Dla HttpPost) teraz po ponownym sprawdzeniu widzę w logach tylko to:

5.252.202.254 - - [15/Oct/2024:12:18:52 +0200] "POST /PaymentPrzelewy24/Status HTTP/1.1" 301 194 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
5.252.202.254 - - [15/Oct/2024:12:18:52 +0200] "GET /PaymentPrzelewy24/Status HTTP/1.1" 302 0 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
Tak jakby było przekierowanie i nie czytało że to wywołanie POST jest.

Gdy usunę [HttpPost, ActionName("Status")] czyli mam:

namespace Nop.Plugin.Payments.Przelewy24.Controllers
{
    public class PaymentPrzelewy24Controller : BasePaymentController
    {
        [AllowAnonymous]
        // usunięty HttpPost
        public async Task<IActionResult> Status([FromForm] IFormCollection formCollection)
        {
            await _logger.InformationAsync($"Get STATUS notification");

            var sessionId = formCollection["p24_session_id"].ToString();
            var amount = formCollection["p24_amount"].ToString();
            var orderId = formCollection["p24_order_id"].ToString();
            var posId = formCollection["p24_pos_id"].ToString();
            var merchantId = formCollection["p24_merchant_id"].ToString();
            var method = formCollection["p24_method"].ToString();
            var statement = formCollection["p24_statement"].ToString();
            var currency = formCollection["p24_currency"].ToString();
            var sign = formCollection["p24_sign"].ToString();

            await _logger.InformationAsync($"Get form collection currency {currency} amount {amount} orderId {orderId}");

            return Content("OK");
        }
    }
}

to wywołuje się automatycznie po złożeniu zamówienia funkcja status i logger jest widoczny ale w formCollection nic nie ma.
screenshot-20241015123333.png

Tutaj w logach mam

5.252.202.254 - - [15/Oct/2024:12:34:12 +0200] "POST /PaymentPrzelewy24/Status HTTP/1.1" 301 194 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"
5.252.202.254 - - [15/Oct/2024:12:34:12 +0200] "GET /PaymentPrzelewy24/Status HTTP/1.1" 500 1238 "-" "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"

3

Niepotrzebnie testujesz dwie rzeczy na raz - przyjście requestu z zewnętrznego serwisu i databinding do jakichś obiektów, przez co nie wiadomo gdzie jest problem. Odpal wiresharka albo dodaj logowanie surowego body na poziomie twojego serwera WWW, to zobaczysz, czy w ogóle coś przychodzi.

Tam w logu masz HTTP 301 - to jest podejrzane, bo raczej to twój kod powinien obsłużyć ten request? Zobacz, co powoduje to przekierowanie. Kiedyś spotkałem się z zachowaniem, że POST zamieniał się w GET przy przekierowaniu i się body traciło - ale nie pamiętam jak to rozwiązałem.

0

Udało się rozwiązać problem właśnie był w tym że przekazywałem http zamiast https w url-u do przekazania powiadomienia o transakcji.

Czyli w nopcommerce dla SSL powinno być to:
string storeLocation = _webHelper.GetStoreLocation(true);
zamiast
string storeLocation = _webHelper.GetStoreLocation(false);

Dziękuję bardzo za pomoc @kelog w naprowadzeniu :) Wiem, że nie przesyłałem pełnego kodu więc było ciężej doradzić coś, ale ograniczenie od strony firmy na mnie to wymusiło.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.