Gate payment gateway behind Pro and Business plans.
Deploy Ladill Events / deploy (push) Successful in 46s

Free accounts can no longer connect or use Paystack/Flutterwave/Hubtel;
settings show an upgrade path and checkout requires a paid subscription.
This commit is contained in:
isaacclad
2026-07-15 21:04:03 +00:00
parent 6a793548ad
commit b73b071cb1
5 changed files with 96 additions and 29 deletions
@@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
use App\Models\PaymentGatewaySetting;
use App\Models\QrSetting;
use App\Services\Billing\BillingClient;
use App\Services\Events\SubscriptionService;
use App\Services\Payments\MerchantGatewayService;
use App\Support\AccountBranding;
use App\Support\Qr\QrCornerStyleCatalog;
@@ -21,6 +22,7 @@ class AccountController extends Controller
public function __construct(
private BillingClient $billing,
private MerchantGatewayService $gateway,
private SubscriptionService $subscriptions,
) {}
private function topupUrl(): string
@@ -83,6 +85,7 @@ class AccountController extends Controller
'cornerInnerStyles' => QrCornerStyleCatalog::innerStyles(),
'frameStyles' => QrFrameStyleCatalog::visible(),
'gateway' => $this->gateway->settingFor($account),
'canUsePaymentGateway' => $this->subscriptions->canUsePaymentGateway($account),
]);
}
@@ -164,7 +167,7 @@ class AccountController extends Controller
);
$provider = (string) ($data['gateway_provider'] ?? '');
if ($provider !== '') {
if ($provider !== '' && $this->subscriptions->canUsePaymentGateway($account)) {
$existing = PaymentGatewaySetting::query()->firstOrNew([
'owner_ref' => $account->public_id,
]);
@@ -74,6 +74,12 @@ class SubscriptionService
return $this->hasPaidPlan($user);
}
/** Own payment gateway (Paystack / Flutterwave / Hubtel) requires Pro or Business. */
public function canUsePaymentGateway(User $user): bool
{
return $this->hasPaidPlan($user);
}
public function liveEventCount(User $user): int
{
return QrCode::query()
@@ -4,6 +4,7 @@ namespace App\Services\Payments;
use App\Models\PaymentGatewaySetting;
use App\Models\User;
use App\Services\Events\SubscriptionService;
use Illuminate\Support\Facades\Http;
use RuntimeException;
@@ -18,6 +19,10 @@ class MerchantGatewayService
public function isConfigured(User|string $owner): bool
{
if (! $this->ownerMayUseGateway($owner)) {
return false;
}
return (bool) $this->settingFor($owner)?->isConfigured();
}
@@ -62,6 +67,10 @@ class MerchantGatewayService
protected function requireConfigured(User|string $owner): PaymentGatewaySetting
{
if (! $this->ownerMayUseGateway($owner)) {
throw new RuntimeException('Connecting your own payment gateway requires a paid plan. Upgrade to Pro or Business.');
}
$setting = $this->settingFor($owner);
if (! $setting?->isConfigured()) {
throw new RuntimeException('Connect Paystack, Flutterwave, or Hubtel in Settings before accepting online payments.');
@@ -70,6 +79,19 @@ class MerchantGatewayService
return $setting;
}
protected function ownerMayUseGateway(User|string $owner): bool
{
$user = $owner instanceof User
? $owner
: User::query()->where('public_id', (string) $owner)->first();
if (! $user) {
return false;
}
return app(SubscriptionService::class)->canUsePaymentGateway($user);
}
/**
* @param array<string, mixed> $metadata
* @return array{checkout_url: string, reference: string, provider: string}