Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Frameworki _ [inny][Symfony2] Laravel: Odebranie danych z metody GET - rounting

Napisany przez: miccom 7.05.2019, 21:59:18

Cześć.
Implementuję na stronie szybkie płatności Cashbill.

Przy prawidłowym wykonaniu przelewu system cashbill wysyła do mnie dane metodą GET

https://moj-adres.pl/platnosci?service=strona_startowa.pl&orderid=TEST_abrazcdo&amount=70&userdata=YToxOntzOjc6InVzZXJfaWQiO2k6Mjt9&status=ok&sign=16111498e098cd3a66e0d88eacc4ae2e

Aktualnie laravel wywala błąd że nie ma takiego routingu.

Jak przygotować routing aby odebrać powyższe dane?

Napisany przez: LowiczakPL 7.05.2019, 22:14:48

moim zdaniem wystarczy Route::get('/platnosci',...

Napisany przez: miccom 8.05.2019, 16:25:07

Dałem sobie routes:

  1. Route::get('/platnosci/{data}', ['as' => 'autoryzacja', 'uses' => 'UserController@endPayUser']);


Otrzymuję komunikat:
  1. Sorry, the page you are looking for could not be found.
  2. 1/1
  3. NotFoundHttpException in RouteCollection.php line 161:


Mam dać tylko zwykły route jak poniżej?
  1. Route::get('/platnosci', ['as' => 'autoryzacja', 'uses' => 'UserController@endPayUser']);


Ok, jestem w domu.
Dziękuję za pomoc smile.gif


A jednak nie jestem w domu...

Usera przekierowuję poprawnie, natomiast płatność cashbill potwierdza przesłaniem danych niejawnie kanałem serwer-serwer

  1. adres URL, na który system wyśle powiadomienie dotyczące zmiany statusu transakcji kanałem serwer-serwer ( POST )


Tam wstawiłem adres URL:
https://www.mojastrona.pl/endPay/

Rout:
Route::get('/endPay', ['as' => 'autoryzacja', 'uses' => 'UserController@endPay']);


Ale w odpowiedzi otrzymuję komunikat:

  1. odpowiedź serwera: R_ERROR:
  2. Whoops, looks like something went wrong.
  3. 1/1
  4. MethodNotAllowedHttpException in RouteCollection.php line 219



Jak ustawić routing serwer-serwer?

Napisany przez: nospor 8.05.2019, 16:30:31

A czy ten serwis z platnosciami nie sle ci przypadkiem tych danych POSTem? Bo ty niestety ustawiles route dla GETa

Napisany przez: miccom 8.05.2019, 16:35:10

Tak nosporze, ale czy odbierając dane metodą POST muszę mieć potwierdzenie formularza przez podpis CSRF?
Jeśli dam ten routing na post

  1. Route::post('/endPay', ['as' => 'autoryzacja', 'uses' => 'UserController@endPay']);



otrzymuję ten sam komunikat sad.gif

Napisany przez: viking 8.05.2019, 16:35:11

Nawet jest to jasno opisane w tym kawałku zacytowanym.

Napisany przez: miccom 8.05.2019, 16:38:25

Tak vikingu, natomiast zmiana routa nie pomaga, zapewne CSRF przeszkadza i automatycznie blokuje to połączenie serwerowe

Napisany przez: nospor 8.05.2019, 16:56:54

Nie znam laravela ale nie rozumiem czemu CSRF mialby tutaj cokolwiek do gadania. Jesli tak jest, to poszukaj w dokumetnacji jak to wylaczyc.

Napisany przez: miccom 8.05.2019, 17:01:29

Wg instrukcji mozna poszczególne routy wyizolować aby nie wymagały csrf,

app/Middleware/VerifyCsrfToken.php

namespace App\Http\Middleware;

use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
//
'/endPay',
];
}

Tam wrzuciłem rout który ma być poza csrf, ale nadal ten sam błąd ;/

Napisany przez: Pyton_000 8.05.2019, 17:02:01

CSRF można wyłączyć dla konkretnego URL w middleware.

Napisany przez: viking 8.05.2019, 17:16:04

Zresztą csrf zwraca error bodajże 419 albo 420. Jeśli masz dalej błąd routingu to coś jeszcze jest nie tak. Może cache. Ściągnij sobie program insomnia i testuj.

Napisany przez: miccom 8.05.2019, 19:22:24

Mój routing to:

  1. Route::group(['middleware' => ['web']], function () {
  2. Route::get('/', ['as' => '/', 'uses' => 'FirstController@indexStronaGlowna']);
  3. Route::get('/sale', ['as' => '/', 'uses' => 'FirstController@loadAllRoomSite']);
  4. Route::get('/cennik', ['as' => '/', 'uses' => 'FirstController@loadPriceListSite']);
  5. Route::get('/kontakt', ['as' => '/', 'uses' => 'FirstController@loadContactSite']);
  6. Route::get('/rejestracja', ['as' => '/', 'uses' => 'FirstController@loadRegisterSite']);
  7. Route::post('/endPay', ['as' => 'autoryzacja2', 'uses' => 'UserController@endPay']);
  8. });




userController.php
  1. public function endPay()
  2. {
  3. http://www.php.net/echo 'dziala';
  4. }



Jeśli wyświetlę sobie adres w insomnia to otwiera mi się strona główna z informacją, że muszę być zalogowany, aby widzieć tą stronę, co mam zmienić?

Jedno pytanie...Dlaczego zamiast pokazać białą stronę z tekstem "działa" odsyła do strony głównej?

Napisany przez: viking 8.05.2019, 19:25:06

Jaka wersja lv? Zależy co zrobiłeś w middlewareach i autoryzacji w aplikacji. Możesz wyłączyć sprawdzanie per route.

Napisany przez: miccom 8.05.2019, 19:33:40

laravel 5.2

W Authenticate mam tak:

public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->guest()) {
if ($request->ajax() || $request->wantsJson()) {
return response('Unauthorized.', 401);
} else {
return redirect()->guest('/')->withErrors(['email'=>'Aby zobaczyć tą stronę musisz się zalogować']);
}
}

return $next($request);
}

Napisany przez: nospor 8.05.2019, 19:41:56

Cytat
Dlaczego zamiast pokazać białą stronę z tekstem "działa" odsyła do strony głównej?

Bo robisz przekierowanie do glownej? O tu:
return redirect()->guest('/')->withErrors(['email'=>'Aby zobaczyć tą stronę musisz się zalogować']);

Napisany przez: miccom 8.05.2019, 20:13:53

Powyższy kod z Authenticate to prawie oryginał laravel 5.2 master

Ok, więc rozkminiłem smile.gif



Na początku kontrolera UserControler mam:

public function __construct()
{
$this->middleware('auth');
}


Czyli z wszystkich funkcji sprawdzane jest, czy user jest zalogowany smile.gif
Funkcję endPay wrzuciłem do UserControler, i własnie middleware blokowało wszystko smile.gif

Przeniosłem funkcję endPay do innego kontrolera ( który nie sprawdza autoryzacji ) i działa pięknie ładnie.
Dziękuję wszystkim za udział w rozwiązaniu mojego problemu.
Pozdrawiam.

Napisany przez: LowiczakPL 8.05.2019, 20:30:25

Systemy płatności nie mogą mieć autoryzowanego adresy, to musi być publiczny adres be żadnej autoryzacji czyli jako gość.

Route::group(['middleware' => ['auth']], function () {
//tylko autoryzowani użytkownicy mogą uzyskać dostęp do tych tras
});

Route::group(['middleware' => ['guest']], function () {
//kazdy ma do tego dostęp i tu robisz jakisz tajny adres do przyjmowania odpowiedzi
});

Napisany przez: miccom 8.05.2019, 20:36:09

Ok, a jak mam jedną trasę dla gości i dla zalogowanych?
Mam ją dodać do obu grup?

Napisany przez: LowiczakPL 8.05.2019, 20:45:24

zalogowany może przecież chodzić wszędzie ale nie zalogowany już nie powinien, to zależy co masz pod tym adresem, czy wrażliwe dane czy publiczne

rozdziel to na grypy ważności, publiczne i prywatne po autoryzacji

no chyba że masz jeszcze grypu zalogowanych osób, to do tego są role użytkowników

Napisany przez: miccom 8.05.2019, 20:49:08

Ok, dziękuję za pomoc wink.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)