# تأیید پرداخت (Payment Verification)

متد verify به شما امکان می‌دهد تا پس از بازگشت کاربر از درگاه پرداخت، وضعیت تراکنش را بررسی و تأیید کنید. با استفاده از این متد، شما می‌توانید صحت پرداخت و جزئیات تراکنش را بررسی کنید و در صورت موفقیت‌آمیز بودن پرداخت، آن را تأیید نمایید.

این متد معمولاً پس از بازگشت کاربر به آدرس callback_url که در درخواست پرداخت مشخص شده بود، استفاده می‌شود.

# پارامترهای تأیید پرداخت

در جدول زیر پارامترهای ارسالی به متد verify و توضیحات مربوط به آن‌ها آورده شده است:

نام پارامتر نوع الزامی توضیحات
authority String بله کد authority که پس از درخواست پرداخت از درگاه دریافت می‌شود و در کوئری استرینگ بازگشت به callback_url وجود دارد.
amount Integer بله مبلغ پرداختی که باید با مبلغ اصلی تراکنش مطابقت داشته باشد. این مقدار باید از دیتابیس استخراج شود.

# نمونه کد

در ادامه، نمونه کدی ارائه شده است که ابتدا کد authority از کوئری استرینگ دریافت می‌شود، سپس مبلغ مربوط به این authority از دیتابیس استخراج شده و برای تأیید به زرین‌پال ارسال می‌شود:

<?php
require_once __DIR__ . '/../vendor/autoload.php';
use Http\Client\Common\Plugin\HeaderDefaultsPlugin;
use ZarinPal\Sdk\ClientBuilder;
use ZarinPal\Sdk\Options;
use ZarinPal\Sdk\ZarinPal;
use ZarinPal\Sdk\Endpoint\PaymentGateway\RequestTypes\VerifyRequest;
use ZarinPal\Sdk\HttpClient\Exception\ResponseException;
$clientBuilder = new ClientBuilder();
$clientBuilder->addPlugin(new HeaderDefaultsPlugin([
    'Accept' => 'application/json',
]));
$options = new Options([
    'client_builder' => $clientBuilder,
    'sandbox' => false,
    'merchant_id' => '67887a6d-e2f8-4de2-86b1-8db27bc171b5',
]);
$zarinpal = new ZarinPal($options);
$paymentGateway = $zarinpal->paymentGateway();
$authority = filter_input(INPUT_GET, 'Authority', FILTER_SANITIZE_STRING);
$status = filter_input(INPUT_GET, 'Status', FILTER_SANITIZE_STRING);
if ($status === 'OK') {
    $amount = getAmountFromDatabase($authority); // تابع فرضی برای دریافت مبلغ از دیتابیس
    if ($amount) {
        $verifyRequest = new VerifyRequest();
        $verifyRequest->authority = $authority;
        $verifyRequest->amount = $amount;
        try {
            $response = $paymentGateway->verify($verifyRequest);
            if ($response->code === 100) {
                echo "Payment Verified: \n";
                echo "Reference ID: " . $response->ref_id . "\n";
                echo "Card PAN: " . $response->card_pan . "\n";
                echo "Fee: " . $response->fee . "\n";
            } else if ($response->code === 101) {
                echo "Payment already verified: \n";
            } else {
                echo "Transaction failed with code: " . $response->code;
            }
        } catch (ResponseException $e) {
            echo 'Payment Verification Failed: ' . $e->getErrorDetails();
        } catch (\Exception $e) {
            echo 'Payment Error: ' . $e->getMessage();
        }
    } else {
        echo 'No Matching Transaction Found For This Authority Code.';
    }
} else {
    echo 'Transaction was cancelled or failed.';
}