پیاده‌سازی درگاه پرداخت زرین‌پال روی دات‌نت (.NET)

پیاده‌سازی درگاه پرداخت زرین‌پال روی دات‌نت (.NET)

زرین‌پال برای .NET کتابخانه‌ای فراهم کرده که پیاده‌سازی را ساده می‌کند. در ادامه راهنمای کامل گام‌به‌گام برای این کار ارائه می‌شود:

 پیش‌نیازها:

  1. اکانت تاییدشده در زرین‌پال و دریافت مرچنت کد (Merchant ID)

  2. محیط توسعه .NET Core یا .NET Framework (ترجیحاً .NET Core 3.1 یا بالاتر)

  3. نصب کتابخانه Zarinpal از طریق NuGet

۱. نصب کتابخانه زرین‌پال

در ترمینال یا Package Manager Console:

dotnet add package ZarinPal.Classic

یا در Visual Studio:

Install-Package ZarinPal.Classic

۲. ارسال درخواست پرداخت

ابتدا باید درخواست پرداخت را برای زرین‌پال بفرستید:

using Zarinpal.Classic;
using Zarinpal.Classic.Models;

public class PaymentService
{
    private const string MerchantId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"; // کد مرچنت
    private const string CallbackUrl = "https://yourdomain.com/payment/verify";

    public async Task<string> CreatePaymentRequest(int amount, string description)
    {
        var payment = new Payment(MerchantId);
        var result = await payment.Request(new PaymentRequest()
        {
            Amount = amount,
            CallbackUrl = CallbackUrl,
            Description = description
        });

        if (result.Status == 100)
        {
            return $"https://www.zarinpal.com/pg/StartPay/{result.Authority}";
        }
        else
        {
            throw new Exception($"خطا در ایجاد درخواست پرداخت: {result.Status}");
        }
    }
}

۳. هدایت کاربر به صفحه پرداخت

در کنترلر مربوطه، کاربر را به لینک دریافتی (StartPay) ریدایرکت کنید:

public async Task<IActionResult> Pay()
{
    var service = new PaymentService();
    var url = await service.CreatePaymentRequest(10000, "خرید محصول X");
    return Redirect(url);
}

۴. بررسی وضعیت پرداخت (Verify)

بعد از پرداخت، کاربر به CallbackUrl هدایت می‌شود. در این مرحله باید تاییدیه پرداخت گرفته شود:

public async Task<IActionResult> Verify(string Authority, string Status)
{
    if (Status == "OK")
    {
        var payment = new Payment(MerchantId);
        var result = await payment.Verify(new VerificationRequest()
        {
            Amount = 10000, // مبلغ را حتما با مقدار اولیه یکسان بفرستید
            Authority = Authority
        });

        if (result.Status == 100)
        {
            ViewBag.Message = $"پرداخت موفق بود. کد رهگیری: {result.RefId}";
        }
        else
        {
            ViewBag.Message = $"پرداخت ناموفق بود. کد وضعیت: {result.Status}";
        }
    }
    else
    {
        ViewBag.Message = "پرداخت توسط کاربر لغو شد.";
    }

    return View();
}

نکات مهم

  • برای تست درگاه، از sandbox زرین‌پال استفاده کنید:
    https://sandbox.zarinpal.com/pg/services/WebGate/wsdl

  • در محیط واقعی، حتما SSL فعال باشد و Callback URL امن باشد.

  • وضعیت‌های مختلف result.Status را بررسی کنید (مثلاً 101 یعنی پرداخت قبلاً تایید شده).

منبع رسمی