Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

v3 #48

Merged
merged 5 commits into from
Apr 4, 2024
Merged

v3 #48

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions .github/workflows/run-tests.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,9 @@ jobs:
strategy:
fail-fast: true
matrix:
os: [ubuntu-latest, windows-latest]
php: [8.2, 8.1]
laravel: [10.*, 9.*, 8.*]
os: [ubuntu-latest]
php: [8.3, 8.2, 8.1]
laravel: [11.*, 10.*, 9.*, 8.*]
stability: [prefer-stable]
include:
- laravel: 8.*
Expand All @@ -23,9 +23,13 @@ jobs:
testbench: 7.*
- laravel: 10.*
testbench: 8.*
- laravel: 11.*
testbench: 9.*
exclude:
- laravel: 8.*
php: 8.2
- laravel: 11.*
php: 8.1

name: P${{ matrix.php }} - L${{ matrix.laravel }} - ${{ matrix.stability }} - ${{ matrix.os }}

Expand Down
15 changes: 7 additions & 8 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,22 +19,21 @@
],
"require": {
"php": "^8.1",
"creagia/redsys-php": "^2.0",
"illuminate/contracts": "^8.73|^9.0|^10.0",
"spatie/data-transfer-object": "^3.7",
"creagia/redsys-php": "dev-main",
"illuminate/contracts": "^8.73|^9.0|^10.0|^11.0",
"spatie/laravel-package-tools": "^1.9.2"
},
"require-dev": {
"laravel/pint": "^1.6",
"nunomaduro/collision": "^5.10|^6.0",
"nunomaduro/collision": "^5.10|^6.0|^8.0",
"nunomaduro/larastan": "^1.0|^2.0",
"orchestra/testbench": "^6.23|^7.0|^8.0",
"pestphp/pest": "^1.21",
"pestphp/pest-plugin-laravel": "^1.1",
"orchestra/testbench": "^6.23|^7.0|^8.0|^9.0",
"pestphp/pest": "^1.21|^2.34",
"pestphp/pest-plugin-laravel": "^1.1|^2.3",
"phpstan/extension-installer": "^1.1",
"phpstan/phpstan-deprecation-rules": "^1.0",
"phpstan/phpstan-phpunit": "^1.0",
"phpunit/phpunit": "^9.5"
"phpunit/phpunit": "^9.5|^10.5"
},
"autoload": {
"psr-4": {
Expand Down
4 changes: 0 additions & 4 deletions src/Concerns/CanCreateRedsysRequests.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,9 @@
use Creagia\Redsys\Enums\PayMethod;
use Creagia\Redsys\Enums\TransactionType;
use Creagia\Redsys\Support\RequestParameters;
use Spatie\DataTransferObject\Exceptions\UnknownProperties;

trait CanCreateRedsysRequests
{
/**
* @throws UnknownProperties
*/
public function createRedsysRequest(
PayMethod $payMethod = PayMethod::Card,
ConsumerLanguage $language = ConsumerLanguage::Auto,
Expand Down
4 changes: 2 additions & 2 deletions src/Controllers/RedsysLocalGatewayController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Creagia\LaravelRedsys\Controllers;

use Creagia\Redsys\RedsysNotification;
use Creagia\Redsys\RedsysResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;

Expand All @@ -25,7 +25,7 @@ public function index(Request $request): \Illuminate\Contracts\View\View
public function post(Request $request): \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
{
$params = json_decode(urldecode(base64_decode(strtr($request->get('Ds_MerchantParameters'), '-_', '+/'))), true);
$authorised = RedsysNotification::isAuthorisedCode((int) $request->responseCode);
$authorised = RedsysResponse::isAuthorisedCode((int) $request->responseCode);

$fakeGateway = new \Creagia\Redsys\RedsysFakeGateway(
$request->all(),
Expand Down
30 changes: 20 additions & 10 deletions src/Controllers/RedsysNotificationController.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,32 +6,42 @@
use Creagia\LaravelRedsys\Events\RedsysNotificationEvent;
use Creagia\LaravelRedsys\Events\RedsysSuccessfulEvent;
use Creagia\LaravelRedsys\Events\RedsysUnsuccessfulEvent;
use Creagia\LaravelRedsys\Exceptions\RedsysConfigError;
use Creagia\LaravelRedsys\Exceptions\RedsysRequestNotFound;
use Creagia\LaravelRedsys\RedsysCard;
use Creagia\LaravelRedsys\RedsysNotificationLog;
use Creagia\LaravelRedsys\RedsysRequestStatus;
use Creagia\LaravelRedsys\Request;
use Creagia\Redsys\Exceptions\DeniedRedsysPaymentNotification;
use Creagia\Redsys\RedsysNotification;
use Creagia\Redsys\Exceptions\DeniedRedsysPaymentResponseException;
use Creagia\Redsys\Exceptions\ErrorRedsysResponseException;
use Creagia\Redsys\Exceptions\InvalidRedsysResponseException;
use Creagia\Redsys\RedsysResponse;
use Illuminate\Http\Request as HttpRequest;
use Illuminate\Support\Str;

class RedsysNotificationController
{
/**
* @throws DeniedRedsysPaymentResponseException
* @throws RedsysRequestNotFound
* @throws InvalidRedsysResponseException
* @throws ErrorRedsysResponseException
* @throws RedsysConfigError
*/
public function __invoke(HttpRequest $httpRequest, CreateRedsysClient $createRedsysClient): void
{
$inputs = $httpRequest->all();
RedsysNotificationEvent::dispatch($inputs);

$redsysClient = $createRedsysClient();
$redsysNotification = new RedsysNotification($redsysClient);
$redsysNotification->setParametersFromResponse($inputs);
$redsysResponse = new RedsysResponse($redsysClient);
$redsysResponse->setParametersFromResponse($inputs);

$redsysNotificationLog = RedsysNotificationLog::create([
'merchant_parameters' => $redsysNotification->merchantParametersArray,
'merchant_parameters' => $redsysResponse->merchantParametersArray,
]);

$request = Request::where('order_number', $redsysNotification->parameters->order)->first();
$request = Request::where('order_number', $redsysResponse->parameters->order)->first();

if (! $request) {
throw new RedsysRequestNotFound('Redsys Request not found from bank response');
Expand All @@ -40,11 +50,11 @@ public function __invoke(HttpRequest $httpRequest, CreateRedsysClient $createRed
$redsysNotificationLog->redsysRequest()->associate($request);
$redsysNotificationLog->save();

$request->response_code = $redsysNotification->parameters->responseCode ?? null;
$request->auth_code = (empty($authCode = trim($redsysNotification->parameters->responseAuthorisationCode))) ? null : $authCode;
$request->response_code = $redsysResponse->parameters->responseCode ?? null;
$request->auth_code = (empty($authCode = trim($redsysResponse->parameters->responseAuthorisationCode))) ? null : $authCode;

try {
$notificationData = $redsysNotification->checkResponse();
$notificationData = $redsysResponse->checkResponse();

RedsysSuccessfulEvent::dispatch($request, $notificationData->toArray());
$request->status = RedsysRequestStatus::Paid;
Expand Down Expand Up @@ -74,7 +84,7 @@ public function __invoke(HttpRequest $httpRequest, CreateRedsysClient $createRed

$redsysCard->save();
}
} catch (DeniedRedsysPaymentNotification $e) {
} catch (DeniedRedsysPaymentResponseException $e) {
$errorMessage = $e->getMessage();
RedsysUnsuccessfulEvent::dispatch($request, $errorMessage);

Expand Down
4 changes: 2 additions & 2 deletions src/RedsysNotificationLog.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace Creagia\LaravelRedsys;

use Creagia\Redsys\RedsysNotification;
use Creagia\Redsys\RedsysResponse;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

Expand Down Expand Up @@ -32,7 +32,7 @@ public function getStatus(): RedsysRequestStatus
return RedsysRequestStatus::Pending;
}

return RedsysNotification::isAuthorisedCode($this->merchant_parameters['Ds_Response'])
return RedsysResponse::isAuthorisedCode($this->merchant_parameters['Ds_Response'])
? RedsysRequestStatus::Paid
: RedsysRequestStatus::Denied;
}
Expand Down
2 changes: 1 addition & 1 deletion src/RequestBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ public function redirect(): Response
return response($this->redsysRequest->getRedirectFormHtml());
}

public function post(): \Psr\Http\Message\ResponseInterface
public function post(): \Creagia\Redsys\Support\NotificationParameters|\Creagia\Redsys\Support\PostRequestError
{
$this->create();

Expand Down
1 change: 1 addition & 0 deletions tests/LocalGatewayTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
use Creagia\LaravelRedsys\Tests\Models\TestModel;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Config;

use function Pest\Laravel\post;
use function Pest\Laravel\withoutExceptionHandling;

Expand Down
15 changes: 9 additions & 6 deletions tests/NotificationTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,11 @@
use Creagia\LaravelRedsys\Events\RedsysNotificationEvent;
use Creagia\LaravelRedsys\Events\RedsysSuccessfulEvent;
use Creagia\LaravelRedsys\Events\RedsysUnsuccessfulEvent;
use Creagia\Redsys\Exceptions\InvalidRedsysNotification;
use Creagia\LaravelRedsys\RequestBuilder;
use Creagia\LaravelRedsys\Tests\Models\TestModel;
use Creagia\Redsys\Exceptions\InvalidRedsysResponseException;
use Illuminate\Support\Facades\Event;

use function Pest\Laravel\post;
use function Pest\Laravel\withoutExceptionHandling;

Expand All @@ -21,9 +24,9 @@
it('throws exception if bank response is invalid', function () {
withoutExceptionHandling();
post(action(RedsysNotificationController::class), ['Ds_MerchantParameters' => '']);
})->throws(InvalidRedsysNotification::class);
})->throws(InvalidRedsysResponseException::class);

it('saves notification attempt to database', function ($testModel, $redsysRequestBuilder) {
it('saves notification attempt to database', function (TestModel $testModel, RequestBuilder $redsysRequestBuilder) {
$redirectResponse = $redsysRequestBuilder->redirect();

$fakeGateway = new \Creagia\Redsys\RedsysFakeGateway(
Expand All @@ -38,7 +41,7 @@
]);
})->with('payment');

it('changes Redsys payment status to paid', function ($testModel, $redsysRequestBuilder) {
it('changes Redsys payment status to paid', function (TestModel $testModel, RequestBuilder $redsysRequestBuilder) {
$redirectResponse = $redsysRequestBuilder->redirect();
$request = $redsysRequestBuilder->request;

Expand All @@ -53,7 +56,7 @@
expect($request->status)->toBe(\Creagia\LaravelRedsys\RedsysRequestStatus::Paid->value);
})->with('payment');

it('changes Redsys payment status to denied', function ($testModel, $redsysRequestBuilder) {
it('changes Redsys payment status to denied', function (TestModel $testModel, RequestBuilder $redsysRequestBuilder) {
$redirectResponse = $redsysRequestBuilder->redirect();
$request = $redsysRequestBuilder->request;

Expand All @@ -68,7 +71,7 @@
expect($request->status)->toBe(\Creagia\LaravelRedsys\RedsysRequestStatus::Denied->value);
})->with('payment');

it('executes payable model paid method', function ($testModel, $redsysRequestBuilder) {
it('executes payable model paid method', function (TestModel $testModel, RequestBuilder $redsysRequestBuilder) {
$redirectResponse = $redsysRequestBuilder->redirect();
$request = $redsysRequestBuilder->request;

Expand Down
2 changes: 1 addition & 1 deletion tests/PayableTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
use Creagia\LaravelRedsys\RequestBuilder;
use Creagia\LaravelRedsys\Tests\Models\TestModel;

it('can return total amount', function (TestModel $testModel) {
it('can return total amount', function (TestModel $testModel, RequestBuilder $requestBuilder) {
expect($testModel->getTotalAmount())->toEqual(12345);
})->with('payment');

Expand Down
3 changes: 2 additions & 1 deletion tests/RedirectTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
use Creagia\Redsys\Enums\ConsumerLanguage;
use Creagia\Redsys\Enums\PayMethod;
use Illuminate\Support\Facades\Config;

use function Pest\Laravel\withoutExceptionHandling;

it('can redirect to Redsys', function ($testModel, RequestBuilder $redsysRequestBuilder) {
it('can redirect to Redsys', function (TestModel $testModel, RequestBuilder $redsysRequestBuilder) {
withoutExceptionHandling();
$redirectResponse = $redsysRequestBuilder->redirect();
expect($redirectResponse->content())->toContain('realizarPago');
Expand Down
3 changes: 2 additions & 1 deletion tests/StandalonePaymentTest.php
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
<?php

use Creagia\Redsys\Enums\Currency;

use function Pest\Laravel\withoutExceptionHandling;

it('can redirect to Redsys with standalone payment', function () {
Expand All @@ -15,4 +16,4 @@
)
);
expect($redsysRequest->redirect()->content())->toContain('realizarPago');
})->with('payment');
});