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');
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();
});
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();