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

[BUG] App\Cancellation\OrderRefundException: Order Can't Be Refunded! #1112

Open
d1str4ught opened this issue Sep 25, 2023 · 2 comments
Open
Labels
bug Features or code that is not working correctly

Comments

@d1str4ught
Copy link

I can't refund an order using Stripe SCA.

I have to following in log:
[2023-09-25 19:33:40] production.DEBUG: Total Order Value: Ft 4950.00 [2023-09-25 19:33:40] production.DEBUG: Already refunded amount: Ft 0.00 [2023-09-25 19:33:40] production.DEBUG: Maxmimum refundable amount: Ft 4950.00 [2023-09-25 19:33:40] production.DEBUG: Organiser Tax Rate: 0.00% [2023-09-25 19:33:40] production.DEBUG: Ticket Price: Ft 4500.00 [2023-09-25 19:33:40] production.DEBUG: Ticket Organiser Fee: Ft 450.00 [2023-09-25 19:33:40] production.DEBUG: Ticket Tax: Ft 0.00 [2023-09-25 19:33:40] production.DEBUG: Requested Refund should include Tax: Ft 4950.00 [2023-09-25 19:33:40] production.ERROR: App\Cancellation\OrderRefundException: Order Can't Be Refunded! in /storage/www/ticketvibe/app/Cancellation/OrderRefund.php:123 Stack trace: #0 /storage/www/ticketvibe/app/Cancellation/OrderRefund.php(20): App\Cancellation\OrderRefund->checkValidRefundState() #1 /storage/www/ticketvibe/app/Cancellation/OrderRefund.php(31): App\Cancellation\OrderRefund->__construct() #2 /storage/www/ticketvibe/app/Cancellation/OrderCancellation.php(55): App\Cancellation\OrderRefund::make() #3 /storage/www/ticketvibe/app/Http/Controllers/EventOrdersController.php(227): App\Cancellation\OrderCancellation->cancel() #4 [internal function]: App\Http\Controllers\EventOrdersController->postCancelOrder() #5 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): call_user_func_array() #6 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\Routing\Controller->callAction() #7 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/Route.php(219): Illuminate\Routing\ControllerDispatcher->dispatch() #8 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/Route.php(176): Illuminate\Routing\Route->runController() #9 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/Router.php(681): Illuminate\Routing\Route->run() #10 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\Routing\Router->Illuminate\Routing\{closure}() #11 /storage/www/ticketvibe/app/Http/Middleware/FirstRunMiddleware.php(35): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #12 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): App\Http\Middleware\FirstRunMiddleware->handle() #13 /storage/www/ticketvibe/vendor/mcamara/laravel-localization/src/Mcamara/LaravelLocalization/Middleware/LaravelLocalizationViewPath.php(33): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #14 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath->handle() #15 /storage/www/ticketvibe/vendor/mcamara/laravel-localization/src/Mcamara/LaravelLocalization/Middleware/LaravelLocalizationRedirectFilter.php(45): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #16 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter->handle() #17 /storage/www/ticketvibe/vendor/mcamara/laravel-localization/src/Mcamara/LaravelLocalization/Middleware/LocaleSessionRedirect.php(64): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #18 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect->handle() #19 /storage/www/ticketvibe/app/Http/Middleware/SetViewVariables.php(44): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #20 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): App\Http\Middleware\SetViewVariables->handle() #21 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/Middleware/SubstituteBindings.php(41): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #22 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Routing\Middleware\SubstituteBindings->handle() #23 /storage/www/ticketvibe/app/Http/Middleware/Authenticate.php(45): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #24 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): App\Http\Middleware\Authenticate->handle() #25 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php(76): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #26 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Foundation\Http\Middleware\VerifyCsrfToken->handle() #27 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/View/Middleware/ShareErrorsFromSession.php(49): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #28 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\View\Middleware\ShareErrorsFromSession->handle() #29 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Session/Middleware/StartSession.php(56): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #30 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Session\Middleware\StartSession->handle() #31 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/AddQueuedCookiesToResponse.php(37): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #32 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse->handle() #33 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Cookie/Middleware/EncryptCookies.php(66): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #34 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Cookie\Middleware\EncryptCookies->handle() #35 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #36 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/Router.php(683): Illuminate\Pipeline\Pipeline->then() #37 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/Router.php(658): Illuminate\Routing\Router->runRouteWithinStack() #38 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/Router.php(624): Illuminate\Routing\Router->runRoute() #39 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Routing/Router.php(613): Illuminate\Routing\Router->dispatchToRoute() #40 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(170): Illuminate\Routing\Router->dispatch() #41 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(130): Illuminate\Foundation\Http\Kernel->Illuminate\Foundation\Http\{closure}() #42 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/ValidatePostSize.php(27): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #43 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Foundation\Http\Middleware\ValidatePostSize->handle() #44 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #45 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() #46 /storage/www/ticketvibe/vendor/fideloper/proxy/src/TrustProxies.php(57): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #47 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Fideloper\Proxy\TrustProxies->handle() #48 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/TransformsRequest.php(21): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #49 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Foundation\Http\Middleware\TransformsRequest->handle() #50 /storage/www/ticketvibe/app/Http/Middleware/GeneralChecks.php(26): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #51 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): App\Http\Middleware\GeneralChecks->handle() #52 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/CheckForMaintenanceMode.php(63): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #53 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(171): Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode->handle() #54 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Pipeline/Pipeline.php(105): Illuminate\Pipeline\Pipeline->Illuminate\Pipeline\{closure}() #55 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(145): Illuminate\Pipeline\Pipeline->then() #56 /storage/www/ticketvibe/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php(110): Illuminate\Foundation\Http\Kernel->sendRequestThroughRouter() #57 /storage/www/ticketvibe/public/index.php(55): Illuminate\Foundation\Http\Kernel->handle() #58 {main}

@d1str4ught d1str4ught added the bug Features or code that is not working correctly label Sep 25, 2023
@d1str4ught d1str4ught changed the title [BUG] Describe your bug [BUG] App\Cancellation\OrderRefundException: Order Can't Be Refunded! Sep 25, 2023
@d1str4ught
Copy link
Author

Hm, I checked my DB and there is no transaction_id since I use Stripe SCA.

@d1str4ught
Copy link
Author

d1str4ught commented Sep 25, 2023

Solved. We need to get our payment identifier from the payment_intent and initiate the refund via that.
Sorry for not doing a proper commit; we have it on our own version control system (svn), and I don't want to check it out.

StripeSCA.php:

    public function refundTransaction($order, $refund_amount, $refund_application_fee)
    {		
		$paymentIntentResponse = $this->gateway->fetchPaymentIntent([
			'paymentIntentReference' => $order->payment_intent,
		])->send();
		
		if ($paymentIntentResponse->isSuccessful()) {
			$data = $paymentIntentResponse->getData();
			Log::debug($data);
			$chargeId = $data['latest_charge'];
			
			$request = $this->gateway->refund([
				'transactionReference' => $chargeId,
				'amount' => $refund_amount,
				'refundApplicationFee' => $refund_application_fee
			]);

			$response = $request->send();

			if ($response->isSuccessful()) {
				$refundResponse['successful'] = true;
			} else {
				$refundResponse['successful'] = false;
				$refundResponse['error_message'] = $response->getMessage();
			}
		} else {
			$refundResponse['successful'] = false;
			$refundResponse['error_message'] = $response->getMessage();
		}
		
		return $refundResponse;
    }

Also, modify checkValidRefundState in OrderRefund.php so that it will not throw an exception (because originally it only checks for transaction_id, but we don't have that when using SCA, only the payment_intent field.

    private function checkValidRefundState()
    {
        $errorMessage = false;
        if (!$this->order->transaction_id && !$this->order->payment_intent) {
            $errorMessage = trans("Controllers.order_cant_be_refunded");
        }
        if ($this->order->is_refunded) {
            $errorMessage = trans('Controllers.order_already_refunded');
        } elseif ($this->maximumRefundableAmount->isZero()) {
            $errorMessage = trans('Controllers.nothing_to_refund');
        } elseif ($this->refundAmount->isGreaterThan($this->maximumRefundableAmount)) {
            // Error if the partial refund tries to refund more than allowed
            $errorMessage = trans('Controllers.maximum_refund_amount', [
                'money' => $this->maximumRefundableAmount->display(),
            ]);
        }
        if ($errorMessage) {
            throw new OrderRefundException($errorMessage);
        }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Features or code that is not working correctly
Projects
None yet
Development

No branches or pull requests

1 participant