1. Go to this page and download the library: Download ttpryg/payment-engine 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/ */
ttpryg / payment-engine example snippets
namespace MyNamespace\Gateways;
use Ttpryg\PaymentEngine\Contracts\PaymentGatewayInterface;
use Ttpryg\PaymentEngine\DTOs\GatewayResponse;
use Ttpryg\PaymentEngine\DTOs\GatewayStatusResponse;
use Ttpryg\PaymentEngine\DTOs\RefundResponse;
use Ttpryg\PaymentEngine\DTOs\WebhookVerificationResult;
use Ttpryg\PaymentEngine\Entities\Payment;
use Ttpryg\PaymentEngine\ValueObjects\Money;
class XenditPaymentGateway implements PaymentGatewayInterface
{
public function getName(): string
{
return 'xendit';
}
public function createTransaction(Payment $payment, array $options = []): GatewayResponse
{
// Call Xendit API using $payment->totalAmount->amount
return new GatewayResponse(
isSuccessful: true,
transactionReference: 'xendit_invoice_123',
redirectUrl: 'https://checkout.xendit.co/web/123'
);
}
public function verifyWebhook(array $payload, array $headers = []): WebhookVerificationResult
{
// Validate signature token
return new WebhookVerificationResult(
isValid: true,
transactionReference: $payload['id'] ?? null,
eventId: $payload['event_id'] ?? null,
mappedStatus: \Ttpryg\PaymentEngine\Enums\PaymentStatus::COMPLETED,
paidAmount: new Money((int) $payload['paid_amount'], 'IDR')
);
}
public function checkStatus(string $transactionReference): GatewayStatusResponse
{
// Query gateway API
}
public function refund(Payment $payment, Money $amount, ?string $reason = null): RefundResponse
{
// Execute refund API
}
}
$gatewayManager = new GatewayManager();
$gatewayManager->register(new MockPaymentGateway('mock'));
$gatewayManager->register(new ManualTransferGateway('manual'));
$gatewayManager->register(new XenditPaymentGateway());
// Partial refund
$refund = $refundService->issueRefund(
paymentId: 'pay-001',
amount: new Money(50000, 'IDR'),
reason: 'Defective item returned'
);
// Payment status automatically transitions to PARTIALLY_REFUNDED.
// When all paid amount has been refunded, status becomes REFUNDED.
use PDO;
use Ttpryg\PaymentEngine\Enums\PaymentMethod;
use Ttpryg\PaymentEngine\Gateways\GatewayManager;
use Ttpryg\PaymentEngine\Gateways\ManualTransferGateway;
use Ttpryg\PaymentEngine\Gateways\MockPaymentGateway;
use Ttpryg\PaymentEngine\Repositories\Pdo\PdoPaymentAttemptRepository;
use Ttpryg\PaymentEngine\Repositories\Pdo\PdoPaymentHistoryRepository;
use Ttpryg\PaymentEngine\Repositories\Pdo\PdoPaymentRefundRepository;
use Ttpryg\PaymentEngine\Repositories\Pdo\PdoPaymentRepository;
use Ttpryg\PaymentEngine\Repositories\Pdo\PdoWebhookEventRepository;
use Ttpryg\PaymentEngine\Services\PaymentRefundService;
use Ttpryg\PaymentEngine\Services\PaymentService;
use Ttpryg\PaymentEngine\Services\PaymentStatusService;
use Ttpryg\PaymentEngine\Services\WebhookProcessorService;
use Ttpryg\PaymentEngine\ValueObjects\PayableReference;
use Ttpryg\PaymentEngine\ValueObjects\PayerReference;
// 1. Setup PDO & Repositories
$pdo = new PDO('mysql:host=localhost;dbname=payment_db', 'root', 'secret');
$paymentRepo = new PdoPaymentRepository($pdo);
$attemptRepo = new PdoPaymentAttemptRepository($pdo);
$refundRepo = new PdoPaymentRefundRepository($pdo);
$historyRepo = new PdoPaymentHistoryRepository($pdo);
$webhookRepo = new PdoWebhookEventRepository($pdo);
// 2. Setup Gateway Manager
$gatewayManager = new GatewayManager();
$gatewayManager->register(new MockPaymentGateway('mock'));
$gatewayManager->register(new ManualTransferGateway('manual'));
// 3. Initialize Services
$statusService = new PaymentStatusService($paymentRepo, $historyRepo);
$paymentService = new PaymentService($paymentRepo, $attemptRepo, $historyRepo, $gatewayManager, $statusService, pdo: $pdo);
$refundService = new PaymentRefundService($paymentRepo, $refundRepo, $historyRepo, $gatewayManager);
$webhookProcessor = new WebhookProcessorService($gatewayManager, $webhookRepo, $paymentRepo, $attemptRepo, $historyRepo, $statusService);
// 4. Create Payment
$payment = $paymentService->createPayment(
id: 'pay-001',
payable: new PayableReference('order', 'ORD-2026-001'),
amount: 250000, // IDR 250,000 (integer)
method: PaymentMethod::QRIS,
gatewayProvider: 'mock',
payer: new PayerReference('user', 'usr-100'),
fee: 1500
);
// 5. Ingest Inbound Gateway Webhook (Safe & Idempotent)
$webhookProcessor->process('mock', [
'event_id' => 'evt_12345',
'transaction_reference' => $payment->metadata['redirect_url'] ?? 'mock_tx_...',
'status' => 'completed',
'paid_amount' => 251500,
]);
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.