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?
moim zdaniem wystarczy Route::get('/platnosci',...
Dałem sobie routes:
Route::get('/platnosci/{data}', ['as' => 'autoryzacja', 'uses' => 'UserController@endPayUser']);
Sorry, the page you are looking for could not be found. 1/1 NotFoundHttpException in RouteCollection.php line 161:
Route::get('/platnosci', ['as' => 'autoryzacja', 'uses' => 'UserController@endPayUser']);
adres URL, na który system wyśle powiadomienie dotyczące zmiany statusu transakcji kanałem serwer-serwer ( POST )
odpowiedź serwera: R_ERROR: Whoops, looks like something went wrong. 1/1 MethodNotAllowedHttpException in RouteCollection.php line 219
A czy ten serwis z platnosciami nie sle ci przypadkiem tych danych POSTem? Bo ty niestety ustawiles route dla GETa
Tak nosporze, ale czy odbierając dane metodą POST muszę mieć potwierdzenie formularza przez podpis CSRF?
Jeśli dam ten routing na post
Route::post('/endPay', ['as' => 'autoryzacja', 'uses' => 'UserController@endPay']);
Nawet jest to jasno opisane w tym kawałku zacytowanym.
Tak vikingu, natomiast zmiana routa nie pomaga, zapewne CSRF przeszkadza i automatycznie blokuje to połączenie serwerowe
Nie znam laravela ale nie rozumiem czemu CSRF mialby tutaj cokolwiek do gadania. Jesli tak jest, to poszukaj w dokumetnacji jak to wylaczyc.
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 ;/
CSRF można wyłączyć dla konkretnego URL w middleware.
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.
Mój routing to:
Route::group(['middleware' => ['web']], function () { Route::get('/', ['as' => '/', 'uses' => 'FirstController@indexStronaGlowna']); Route::get('/sale', ['as' => '/', 'uses' => 'FirstController@loadAllRoomSite']); Route::get('/cennik', ['as' => '/', 'uses' => 'FirstController@loadPriceListSite']); Route::get('/kontakt', ['as' => '/', 'uses' => 'FirstController@loadContactSite']); Route::get('/rejestracja', ['as' => '/', 'uses' => 'FirstController@loadRegisterSite']); Route::post('/endPay', ['as' => 'autoryzacja2', 'uses' => 'UserController@endPay']); });
public function endPay() { http://www.php.net/echo 'dziala'; }
Jaka wersja lv? Zależy co zrobiłeś w middlewareach i autoryzacji w aplikacji. Możesz wyłączyć sprawdzanie per route.
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);
}
Powyższy kod z Authenticate to prawie oryginał laravel 5.2 master
Ok, więc rozkminiłem
Na początku kontrolera UserControler mam:
public function __construct()
{
$this->middleware('auth');
}
Czyli z wszystkich funkcji sprawdzane jest, czy user jest zalogowany
Funkcję endPay wrzuciłem do UserControler, i własnie middleware blokowało wszystko
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.
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
});
Ok, a jak mam jedną trasę dla gości i dla zalogowanych?
Mam ją dodać do obu grup?
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
Ok, dziękuję za pomoc
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)