ره پی، خدمات امن و نوین پرداختهای خٌرد
  • جمعه, ۲۹ شهریور ۱۳۹۸

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

برای انتقال به درگاه ره پی لازم است یک فرم HTML با تگ فرم بصورت زیر توسعه داده شود. در کد زیر MERCHANT_ID و TERMINAL_ID با مقادیر متناظر که در ترمینال فروشگاه نمایش داده می شوند جایگزین کنید. در صورت نیاز به ارسال کد سفارش orderId را نیز با توجه به داده های دیتابیس خود مقدار دهی کنید. مقدار amount به ریال است و همان جمع ریالی فاکتور شماست. توجه داشته باشید که کدهای زیر برای الگوی طراحی مبتنی بر MVC است، ولی با حداقل تغییر در syntax در فرم های ASP.net نیز قابل استفاده است.

            
@{
    ViewBag.Title = "شروع تراکنش - پرداختیار ره پی";
}

<form action="https://rahpay.net/payment/start_transaction" method="post">
    <input type="hidden" name="amount" value="1100">
    <input type="hidden" name="orderId" value="223">
    <input type="hidden" name="merchantId" value="MERCHANT_ID">
    <input type="hidden" name="terminalId" value="TERMINAL_ID">
    <input type="hidden" name="description" value="توضیحات فاکتور">
    <button type="submit">پرداخت</button>
</form>
            
        

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

            
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 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; }
}
            
        

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

            
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using System.Web.Script.Serialization;
// به یوزینگ های فوق توجه کنید

[HttpPost]
[Route("payment/callback")]
public async Task Callback(RahpayResponse input)
{
    // الگوی ام.وی.سی
    // این اکشن متد توسط ره پی، بعد از انجام تراکنش در درگاه، فراخوانی شده و پارامترها بصورت پست در آن قرارداده شده است
    ViewBag.Message = "فراخوانی صفحه بازگشتی از ره پی و تایید تراکنش از سمت پذیرنده";

    if (input.transactionStatusCode == "100")
    {
        // کسر وجه از کارت فرد، موفقیت آمیز است
        var settlementRequest = new VerificationRequest()
        {
            amount = input.amount.ToString(),
            merchantId = "MERCHANT_ID",
            refNum = input.refNum,
            orderId = input.orderId,
            terminalId = "TERMINAL_ID"
        };

        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://rahpay.net/");

            //HTTP POST
            var response = await client.PostAsync("payment/verify_transaction", new StringContent(
                new JavaScriptSerializer().Serialize(settlementRequest), Encoding.UTF8, "application/json"));
            var returnee = response.Content.ReadAsStringAsync().Result;

            if (response.IsSuccessStatusCode)
            {
                // پکیج نیوتن سافت را بوسیله نوگت در پروژه نصب کنید
                var rahpayVerificationResult = Newtonsoft.Json.JsonConvert.DeserializeObject(returnee);

                if (rahpayVerificationResult.httpStatus == 200 && rahpayVerificationResult.transactionStatusCode == 100)
                {
                    // روال تراکنش موفقیت آمیز بوده و شما
                    // می توانید بر اساس منطق برنامه خود دیتابیس خود را بروز رسانی کنید
                }
                else
                {
                    // تراکنش به هر دلیلی تایید نشده است و چنانچه دوباره
                    // verify_transaction
                    // فراخوانی نشود، مبلغ واریزی به کارت واریز کننده برگشت داده می شود
                }
                ViewBag.Message = rahpayVerificationResult.card + " " + returnee;
            }
            else
            {
                ViewBag.Message = "Error! " + response.ReasonPhrase + " " + response.StatusCode.ToString() + " "
                    + " " + returnee;
            }
        }
    }

    return View(input);
}
            
        

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