PHP code example of digitaltunnel / moyasar

1. Go to this page and download the library: Download digitaltunnel/moyasar 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/ */

    

digitaltunnel / moyasar example snippets


use DigitalTunnel\Moyasar\Facades\Moyasar;

$payment = Moyasar::payments()->create(
    CreatePaymentRequest::make()
        ->amountInMajorUnits(150.00)         // 150.00 SAR
        ->callbackUrl(route('checkout.return'))
        ->source(CreditCardSource::make('Sara A.', '4111111111111111', 12, 2030, '123'))
);

return $payment->

use DigitalTunnel\Moyasar\Facades\Moyasar;
use DigitalTunnel\Moyasar\Requests\CreatePaymentRequest;
use DigitalTunnel\Moyasar\Sources\CreditCardSource;

// 1) Create the payment and send the customer to the 3DS challenge.
public function checkout(Request $request, Order $order)
{
    $payment = Moyasar::payments()->create(
        CreatePaymentRequest::make()
            ->amount($order->total_halalah)                // integer halalah
            ->currency('SAR')
            ->givenId((string) Str::uuid())                // idempotency key
            ->callbackUrl(route('checkout.return'))
            ->description("Order #{$order->id}")
            ->metadata(['order_id' => (string) $order->id])
            ->source(
                CreditCardSource::make(
                    name: $request->string('name'),
                    number: $request->string('number'),
                    month: $request->integer('month'),
                    year: $request->integer('year'),
                    cvc: $request->string('cvc'),
                )->with3ds()                               // default; ->without3ds() to skip
            )
    );

    return redirect($payment->transactionUrl());
}

use DigitalTunnel\Moyasar\Exceptions\CallbackVerificationException;

// 2) Moyasar redirects back to callback_url with ?id=&status=&message=.
//    NEVER trust those query params — re-fetch and verify server-side.
public function return(Request $request)
{
    $order = Order::findOrFail(/* from your own state/session */);

    try {
        $payment = Moyasar::payments()->verifyCallback(
            id: $request->string('id'),
            expectedAmount: $order->total_halalah,
            expectedCurrency: 'SAR',
        );
    } catch (CallbackVerificationException $e) {
        report($e);                                        // $e->payment is attached
        return redirect()->route('checkout.failed');
    }

    $order->markPaid($payment->id);

    return redirect()->route('checkout.success');
}

use DigitalTunnel\Moyasar\Sources\ApplePaySource;

// Merchant-validation handshake (from a backend proxy):
$session = Moyasar::applePay()->requestSession(
    validationUrl: $request->input('validationURL'),
    displayName: config('app.name'),
    domainName: $request->getHost(),
);
return response()->json($session->toArray());

// Charge the Apple Pay token:
Moyasar::payments()->create(
    CreatePaymentRequest::make()
        ->amount(10000)->givenId((string) Str::uuid())
        ->source(ApplePaySource::make($request->input('token')))
);

use DigitalTunnel\Moyasar\Sources\SamsungPaySource;

Moyasar::payments()->create(
    CreatePaymentRequest::make()->amount(10000)->givenId((string) Str::uuid())
        ->source(SamsungPaySource::make($samsungToken))
);

use DigitalTunnel\Moyasar\Sources\StcPaySource;

$payment = Moyasar::payments()->create(
    CreatePaymentRequest::make()->amount(10000)->givenId((string) Str::uuid())
        ->source(StcPaySource::make(mobile: '0512345678'))
);

// After the user enters the OTP they received — returns a hydrated Payment:
$payment = Moyasar::payments()->verifyStcPayOtp($payment->transactionUrl(), $otp);

if ($payment->isPaid()) {
    // fulfilled
}

use DigitalTunnel\Moyasar\Sources\TokenSource;

// Charge a previously-saved token (tokenize on the client with the publishable key).
Moyasar::payments()->create(
    CreatePaymentRequest::make()
        ->amount(10000)->callbackUrl(route('checkout.return'))
        ->source(TokenSource::make('token_abc')->cvc('123')->with3ds())
);

Moyasar::tokens()->find('token_abc');   // status is a typed TokenStatus enum
Moyasar::tokens()->delete('token_abc');

use DigitalTunnel\Moyasar\Requests\CreateInvoiceRequest;

$invoice = Moyasar::invoices()->create(
    CreateInvoiceRequest::make()
        ->amountInMajorUnits(250.00)
        ->description('Annual subscription')
        ->callbackUrl(route('checkout.return'))
        ->expiresAt(now()->addDays(3))
        ->metadata(['plan' => 'pro'])
);

return redirect($invoice->paymentUrl());   // hosted Moyasar page

Moyasar::invoices()->find($invoice->id);
Moyasar::invoices()->list(['status' => 'paid']);
Moyasar::invoices()->bulkCreate([$requestA, $requestB]);
Moyasar::invoices()->cancel($invoice->id);

Moyasar::payments()->find('pay_...');
Moyasar::payments()->update('pay_...', metadata: ['tag' => 'vip']);
Moyasar::payments()->refund('pay_...', amount: 5000);   // partial; omit for full
Moyasar::payments()->capture('pay_...');                 // for manual-capture auths
Moyasar::payments()->void('pay_...');

// Page through results, or stream every match without managing pages:
$page = Moyasar::payments()->list(['status' => 'paid', 'metadata' => ['order_id' => '42']]);

foreach (Moyasar::payments()->each(['status' => 'paid']) as $payment) {
    // walks every page lazily until there are no more
}

use DigitalTunnel\Moyasar\Events\PaymentPaid;

Event::listen(PaymentPaid::class, function (PaymentPaid $event) {
    // $event->payment is a Payment DTO; $event->webhook is the full WebhookPayload
    Order::findByMoyasarId($event->payment->id)?->markPaid();
});

Route::post('my-path', \DigitalTunnel\Moyasar\Http\Controllers\WebhookController::class)
    ->middleware([\DigitalTunnel\Moyasar\Http\Middleware\VerifyWebhookSignature::class]);

use DigitalTunnel\Moyasar\Models\MoyasarPayment;

MoyasarPayment::where('status', 'paid')->sum('amount');

// Associate a mirror row with your own model:
MoyasarPayment::upsertFromDto($event->payment)->payable()->associate($order)->save();

use DigitalTunnel\Moyasar\Support\Amount;

Amount::toMinorUnits(100.00);   // 10000
Amount::toMajorUnits(10000);    // 100.0
Amount::format(10000, 'SAR');   // "100.00 SAR"

$payment->amountInMajorUnits(); // 100.0

use DigitalTunnel\Moyasar\Exceptions\InvalidRequestException;

try {
    Moyasar::payments()->create($request);
} catch (InvalidRequestException $e) {
    $e->fieldErrors();              // ['source.number' => ['is invalid'], ...]
    $e->firstErrorFor('source.cvc');
}

use DigitalTunnel\Moyasar\Testing\MoyasarFake;

it('creates a pending payment', function () {
    MoyasarFake::fakePaymentCreated();

    $this->post('/checkout', [...])->assertRedirect();

    MoyasarFake::assertCreated();
});

it('surfaces validation errors', function () {
    MoyasarFake::fakeValidationError(['source.cvc' => ['is invalid']]);
    // ...
});
bash
php artisan moyasar:install            # add --migrations for the local mirror tables
php artisan migrate                    # only if you published migrations
bash
php artisan route:list --name=moyasar.webhook
# POST  webhooks/moyasar ... VerifyWebhookSignature
bash
php artisan moyasar:webhook register          # uses route('moyasar.webhook') + your secret
php artisan moyasar:webhook list
php artisan moyasar:webhook delete wh_abc