ره پی، خدمات امن و نوین پرداختهای خٌرد
  • شنبه, ۶ مرداد ۱۴۰۳

نمونه کد C شارپ برای انتقال به درگاه پرداخت ره پی - الگوی ASP.net

برای انتقال به درگاه ره پی لازم است یک کلاس با متدها و پراپرتی های زیر توسعه داده شود. در کد زیر MERCHANT_ID و TERMINAL_ID را با مقادیر متناظر که در ترمینال فروشگاه نمایش داده می شوند جایگزین کنید. در صورت نیاز به ارسال کد سفارش orderId را نیز با توجه به داده های دیتابیس خود مقدار دهی کنید. مقدار amount به ریال است و همان جمع ریالی فاکتور شماست. برای شروع پرداخت، در یک ایونت و یا رخدادی که مد نظر شماست، متد GoToRahpay را با آرگومان های مورد نیاز، فراخونی کنید.

چنانچه در تگ فرم زیر، مقدار cell_number وارد شود، در زمان پرداخت، کارت های ثبت شده با شماره ی موبایل وارد شده، به کاربر نمایش داده می شود. در غیر اینصورت میتوان مقدار شماره ی موبایل را خالی ارسال کرد.

            
private const string TERMINAL_ID = "xxxxxxxxxxxx";
private const string MERCHANT_ID = "xxxxxxxxxxxx";
private const string REDIRECT_PAGE = "https://core.rahpay.net/start_transaction";
private const string VERIFY_PAGE = "https://core.rahpay.net/verify_transaction";
        
public static string GoToRahpay(int amount, long invoiceNumber, string description, string cell_number)
{
    string res = "0";
    try
    {
        HttpContext.Current.Response.Clear();
        StringBuilder sb = new StringBuilder();
        sb.Append("<html dir='rtl'>");
        sb.Append("<head>");
        sb.Append("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />");
        sb.Append("<title>انتقال به بانک</title>");
        sb.Append("<style>@font-face {font-family: \"B Yekan\";src: url(\"../fonts/BYekan.ttf\") format(\"truetype\");}</style>");
        sb.Append("</head>");
        sb.Append("<body onload='document.forms[\"form\"].submit()' style='font-family: tahoma; background-color: whitesmoke; color: DodgerBlue;'>");
        sb.AppendFormat("<form name='form' action='{0}' method='post'>", REDIRECT_PAGE);
        sb.AppendFormat("<input type='hidden' name='amount' value='{0}'>", amount);
        sb.AppendFormat("<input type='hidden' name='orderId' value='{0}'>", invoiceNumber);
        sb.AppendFormat("<input type='hidden' name='merchantId' value='{0}'>", MERCHANT_ID);
        sb.AppendFormat("<input type='hidden' name='terminalId' value='{0}'>", TERMINAL_ID);
        sb.AppendFormat("<input type='hidden' name='description' value='{0}'>", description); // توضیحات فاکتور
        sb.AppendFormat("<input type='hidden' name='cell_number' value='{0}'>", cell_number); // شماره موبایل پرداخت کننده. این مقدار می تواند خالی باشد.
        sb.Append("<div style=\"text-align: center; margin-top: 20%; \"><img src=\"Images/Preloader.gif\" alt=\"Loading ...\" /></div>");
        sb.Append("<div style=\"margin-top: 20px;\"><center>شما در حال انتقال به صفحه ره پی می باشید.<br />لطفا منتظر بمانید.<br />با تشکر</center></div>");
        sb.Append("</form>");
        sb.Append("</body>");
        sb.Append("</html>");
        HttpContext.Current.Response.Write(sb.ToString());
        HttpContext.Current.Response.End();
        res = "1";
    }
    catch (Exception ex)
    {
        res = "-1";
    }
    return res;
}
            
        

پس از redirect شدن به ره پی، کاربر شما مستقیما به درگاه پرداخت بانکی منتقل شده و وجه را از طریق کارت خود پرداخت می نماید. پس از آن ره پی، درخواست را به آدرس بازگشتی (callback) که در هنگام ثبت نام وارد کرده اید، ارجاع داده و داده های زیر را بصورت POST ارسال می نماید.

            
//Callback page                
protected void Page_Load(object sender, System.EventArgs e)
{
    RahpayResponse rahResponse = new RahpayResponse();
    try
    {
        if (Request.Form["refNum"] != null && !string.IsNullOrEmpty(Request.Form["refNum"]))
        {
            rahResponse.refNum = Request.Form["refNum"];
        }
        if (Request.Form["orderId"] != null && !string.IsNullOrEmpty(Request.Form["orderId"]))
        {
            rahResponse.orderId = Request.Form["orderId"];
        }
        if (Request.Form["amount"] != null && !string.IsNullOrEmpty(Request.Form["amount"]))
        {
            rahResponse.amount = Convert.ToInt32(Request.Form["amount"]);
        }
        if (Request.Form["message"] != null && !string.IsNullOrEmpty(Request.Form["message"]))
        {
            rahResponse.message = Request.Form["message"];
        }
        if (Request.Form["transactionStatusCode"] != null && !string.IsNullOrEmpty(Request.Form["transactionStatusCode"]))
        {
            rahResponse.transactionStatusCode = Request.Form["transactionStatusCode"];
        }
        if (!string.IsNullOrEmpty(rahResponse.orderId))
        {
            Boolean bUnsuccessPayment = true;
            if (rahResponse.transactionStatusCode == "100")
            {
                string verifyMessage = string.Empty;
                Boolean bRes = BllServiceRaypay.Verify(rahResponse, ref verifyMessage);
                if (bRes)
                {
                    bUnsuccessPayment = false;
                    // "پرداخت موفق، شماره فاکتور: " + rahResponse.orderId
                }
                rahResponse.message = verifyMessage;
            }
            
            if (bUnsuccessPayment)
            {
                // "پرداخت ناموفق"
            }
        }
    }
    catch (Exception ex)
    {
    }
}
            
        

بعد از دریافت داده های ارسالی ره پی، لازم است برنامه شما در یک تراکنش تصدیق یا acknowledge کرده و به سرور ره پی اطلاع دهد که متوجه انجام شدن تراکنش شده است. برای این منظور از متد زیر استفاده کنید. در صورتی که transactionStatusCode برابر با مقدار ۱۰۰ باشد، ﻋﻤﻠﻴﺎﺕ ﺑﺎ ﻣﻮﻓﻘﻴﺖ ﺍﻧﺠﺎﻡ ﮔﺮﺩﻳﺪﻩ ﺍﺳﺖ و این بدان معناست که می بایست refNum برای تایید نهایی تراکنش از طریق وب سرویس verify_transaction به ره پی اطلاع داده شود. در کد زیر MERCHANT_ID و TERMINAL_ID را با مقادیر متناظر که در ترمینال فروشگاه نمایش داده می شوند جایگزین کنید.

            
public class VerificationResult
{
    public int httpStatus { get; set; }
    public bool hasError { get; set; }
    public int transactionStatusCode { get; set; }
    public string refNum { get; set; }
    public string message { get; set; }
    public string orderId { get; set; }
    public string card { get; set; }
}

public class VerificationRequest
{
    public string refNum { get; set; }
    public string orderId { get; set; }
    public string amount { get; set; }
    public string merchantId { get; set; }
    public string terminalId { get; set; }
}

public class RahpayResponse
{
    public string refNum { get; set; }
    public string orderId { get; set; }
    public int amount { get; set; }
    public string message { get; set; }
    public string transactionStatusCode { get; set; }
    public string followUpNumber { get; set; }
}

public static Boolean Verify(RahpayResponse rahResponse, ref string message)
{
    Boolean bResult = false;
    try 
    {
        if (rahResponse.transactionStatusCode == "100")
        {
            string returnee = string.Empty;
            var settlementRequest = new VerificationRequest()
            {
                amount = rahResponse.amount.ToString(),
                merchantId = MERCHANT_ID,
                refNum = rahResponse.refNum,
                orderId = rahResponse.orderId,
                terminalId = TERMINAL_ID
            };

            var httpWebRequest = (HttpWebRequest)WebRequest.Create(VERIFY_PAGE);
            httpWebRequest.ContentType = "application/json; charset=utf-8";
            httpWebRequest.Method = "POST";
            using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
            {
                var content = new JavaScriptSerializer().Serialize(settlementRequest);
                streamWriter.Write(content.ToString());
                streamWriter.Flush();
            }
            var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
            using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
            {
                returnee = streamReader.ReadToEnd();

                if (httpResponse.StatusCode == HttpStatusCode.OK && !string.IsNullOrEmpty(returnee) && !returnee.StartsWith("<!DOCTYPE html>"))
                {
                    var rahpayVerificationResult = Newtonsoft.Json.JsonConvert.DeserializeObject<VerificationResult>(returnee);
                    result = rahpayVerificationResult.message;
                    if (rahpayVerificationResult.httpStatus == 200 && rahpayVerificationResult.transactionStatusCode == 100)
                    {
                        bResult = true;
                        // تراکنش با موفقیت تایید شد
                    }
                    else
                    {
                        // تراکنش به هر دلیلی تایید نشده است
                    }
                }
                else
                {
                    message = "اشکال در تایید تراکنش";
                }
            }
            // به روز رسانی وضعیت تراکنش در دیتابیس
        }
    }
    catch(Exception ex)
    {
    }
    return bResult;
}
            
        

در صورتی که وب سرویس verify_transaction فراخوانده و موفقیت آمیز باشد خروجی آن یک شی از نوع VerificationResult است که البته باید از json به شی VerificationResult تبدیل شود. این کد، در بالاتر، نمایش داده شده است.