PHP code example of damms005 / laravel-cashier

1. Go to this page and download the library: Download damms005/laravel-cashier library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

damms005 / laravel-cashier example snippets


use Damms005\LaravelMultipay\Models\Payment;

(new CreateNewPayment())->execute(
    $handler->getUniquePaymentHandlerName(),
    $user->id,
    route('dashboard'),
    $transactionReference,
    'NGN',
    'First month',
    '1170',
    [Payment::METADATA_REQUIRES_REUSABLE_AUTHORIZATION => true],
);

'paystack_recurring_channels' => ['card'],

use Damms005\LaravelMultipay\Services\SubscriptionService;
use Damms005\LaravelMultipay\Contracts\PaymentHandlerInterface;

$handler = app(PaymentHandlerInterface::class);

$plan = SubscriptionService::createPaymentPlan(
    handler: $handler,
    name: 'Pro Monthly',
    amount: '5000',        // in minor currency unit (e.g., kobo, cents)
    interval: 'monthly',   // 'monthly', 'quarterly', 'biannually', or 'yearly'
    description: 'Pro plan - billed monthly',
    currency: 'NGN'
);

$plan = SubscriptionService::findOrCreatePaymentPlan(
    handler: $handler,
    amount: '5000',
    interval: 'monthly',
    description: 'Pro plan - billed monthly',
    currency: 'NGN'
);

use Damms005\LaravelMultipay\Services\SubscriptionService;
use Damms005\LaravelMultipay\Contracts\PaymentHandlerInterface;

$handler = app(PaymentHandlerInterface::class);

return SubscriptionService::subscribeToPlan(
    handler: $handler,
    user: $user,
    plan: $plan,
    completionUrl: route('dashboard')
);

return SubscriptionService::subscribeToPlan(
    handler: $handler,
    user: $user,
    plan: $plan,
    completionUrl: route('dashboard'),
    transactionReference: 'MY-CUSTOM-REF-001',
    metadata: ['order_id' => 123],
    displayAmount: '50.00'  // human-readable amount (e.g., naira) — defaults to plan amount if omitted
);

use Damms005\LaravelMultipay\Services\SubscriptionService;

$subscription = SubscriptionService::getActiveSubscriptionFor($user, $plan);

if ($subscription) {
    // User has an active subscription
    // $subscription->next_payment_due_date
}

use Damms005\LaravelMultipay\Services\SubscriptionService;

// inside your subscription.create webhook handling
SubscriptionService::recordProviderSubscriptionData(
    $subscription,
    subscriptionCode: $request->input('data.subscription_code'),
    emailToken: $request->input('data.email_token'),
);

$details = $handler->getSubscriptionDetails('SUB_xxxxxxxx');
// ['subscription_code' => ..., 'email_token' => ..., 'status' => ..., 'next_payment_date' => ...]

use Damms005\LaravelMultipay\Services\SubscriptionService;
use Damms005\LaravelMultipay\Contracts\PaymentHandlerInterface;

$handler = app(PaymentHandlerInterface::class); // must implement ManagesSubscriptions (Paystack does)

// Pause — subscription stops renewing, status becomes "paused"
SubscriptionService::pauseSubscription($handler, $subscription);

// Resume — only valid for a paused subscription, status becomes "active"
SubscriptionService::resumeSubscription($handler, $subscription);

// Cancel — subscription stops renewing permanently, status becomes "cancelled"
SubscriptionService::cancelSubscription($handler, $subscription);

use Damms005\LaravelMultipay\Contracts\SupportsSubscriptionQuantity;

if ($handler->supports(SupportsSubscriptionQuantity::CAPABILITY)) {
    /** @var SupportsSubscriptionQuantity $handler */
    $change = $handler->changeSubscriptionQuantity(
        subscriptionCode: $subscription->payment_handler_subscription_code,
        newQuantity: 3,
        emailToken: $subscription->payment_handler_email_token,
        prorationBehavior: SupportsSubscriptionQuantity::PRORATION_CREATE, // or ::PRORATION_NONE
    );

    if ($change->replacedPreviousCode) {
        $subscription->update([
            'payment_handler_subscription_code' => $change->newSubscriptionCode,
            'quantity' => 3,
        ]);
    } else {
        $subscription->update(['quantity' => 3]);
    }
}

/**
 * @var Damms005\LaravelMultipay\ValueObjects\ReQuery $outcome
 */
$outcome = LaravelMultipay::reQueryUnsuccessfulPayment($payment)

use Damms005\LaravelMultipay\Models\Payment;
use Damms005\LaravelMultipay\Contracts\WebhookPayloadPackager;

class MyWebhookPayloadPackager implements WebhookPayloadPackager
{
    public function getWebhookPayload(Payment $payment): array
    {
        return [
            'transaction_reference' => $payment->transaction_reference,
            'amount_paid' => $payment->original_amount_displayed_to_user,
            'payment_processor_name' => $payment->payment_processor_name,
            // ...add any app-specific data you need
        ];
    }
}

config()->set(
    'laravel-multipay.webhook.payload_packager',
    \App\Services\MyWebhookPayloadPackager::class,
);

use Damms005\LaravelMultipay\Contracts\ChargesStoredInstruments;

$handler = app(PaymentHandlerInterface::class); // must implement ChargesStoredInstruments

$token = $handler->extractStoredInstrumentToken($transactionReference);

$result = $handler->chargeStoredInstrument(
    token: $token,
    payerEmailAtTokenization: $user->email,
    amount: '3900.00',
    paymentReference: $newReference,
    narration: 'Monthly subscription',
);

use Damms005\LaravelMultipay\Contracts\ManagesMandates;
use Damms005\LaravelMultipay\ValueObjects\MandateRequest;

$handler = app(PaymentHandlerInterface::class); // must implement ManagesMandates

$mandate = $handler->createMandate(new MandateRequest(...));
// send $mandate->authorizationUrl to the payer, then poll:
$mandate = $handler->getMandateStatus($mandate->reference);

if ($mandate->status->isDebitable()) {
    $result = $handler->debitMandate($mandate->reference, '3900.00', $reference, 'Monthly subscription');
}

session(['multipay::paystack_terminal_id' => 'your_terminal_id']);

use Damms005\LaravelMultipay\Services\PaymentHandlers\PaystackTerminal\Terminal;

$terminal = app(Terminal::class);

$payment = $terminal->createPaymentRequest(
    model: 'App\Models\User',
    modelId: 123,
    email: '[email protected]',
    description: 'Product purchase',
    amount: 50000  // Amount in kobo (50,000 kobo = 500 NGN)
);

try {
    $status = $terminal->waitForTerminalHardware();
    // Terminal is online
} catch (\Exception $e) {
    // Terminal is offline or not configured
}

try {
    $eventId = $terminal->pushToTerminal($payment);
    // Payment has been pushed to terminal
} catch (\Exception $e) {
    // Failed to push to terminal
}

try {
    $result = $terminal->terminalReceivedPaymentRequest($eventId);
    // Terminal has received the payment request
} catch (\Exception $e) {
    // Could not verify receipt
}
bash
php artisan vendor:publish --tag=laravel-multipay-config
bash
php artisan migrate
js
    content: [
        ...,
        './vendor/damms005/laravel-multipay/views/**/*.blade.php',
    ],
    ...
bash
php artisan multipay:send-payments-webhook