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

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

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

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

            
@Code
    ViewData("Title") = "شروع تراکنش - پرداختیار ره پی"
End Code

<form action="https://core.rahpay.net/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="توضیحات فاکتور">
    <input type="hidden" name="cell_number" value="09120010000">
    <button type="submit">پرداخت</button>
</form>
            
        

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

            
Public Class RahpayResponse
    Public Property refNum() As String
    Public Property orderId() As String
    Public Property amount() As Integer
    Public Property message() As String
    Public Property transactionStatusCode() As String
    Public Property followUpNumber() As String
End Class
            
        

سایر کلاس های مورد نیاز، نیز عبارتند از:

            
Public Class VerificationResult
    Public Property httpStatus() As Integer
    Public Property hasError() As Boolean
    Public Property transactionStatusCode() As Integer
    Public Property refNum() As String
    Public Property message() As String
    Public Property orderId() As String
    Public Property card() As String
End Class

Public Class VerificationRequest
    Public Property refNum() As String
    Public Property orderId() As String
    Public Property amount() As String
    Public Property merchantId() As String
    Public Property terminalId() As String
End Class
            
        

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

            
Imports System.Net.Http
Imports System.Threading.Tasks
Imports System.Web.Script.Serialization
' به ایمپورت های فوق توجه کنید



Async Function Callback(Input As RahpayResponse) As Task(Of ActionResult)
    ' الگوی ام.وی.سی
    ' این اکشن متد توسط ره پی، بعد از انجام تراکنش در درگاه، فراخوانی شده و پارامترها بصورت پست در آن قرارداده شده است
    ViewBag.Message = "فراخوانی صفحه بازگشتی از ره پی و تایید تراکنش از سمت پذیرنده"

    If (Input.transactionStatusCode = "100") Then
        ' کسر وجه از کارت فرد، موفقیت آمیز است
        Dim settlementRequest As New VerificationRequest With
            {
                .amount = Input.amount.ToString(),
                .merchantId = "MERCHANT_ID",
                .refNum = Input.refNum,
                .orderId = Input.orderId,
                .terminalId = "TERMINAL_ID"
            }

        Using client As New HttpClient
            client.BaseAddress = New Uri("https://core.rahpay.net/")

            'HTTP POST
            Dim Response = Await client.PostAsync("/verify_transaction", New StringContent(
                    New JavaScriptSerializer().Serialize(settlementRequest), Encoding.UTF8, "application/json"))
            Dim returnee = Response.Content.ReadAsStringAsync().Result

            If (Response.IsSuccessStatusCode) Then
                ' پکیج نیوتن سافت را بوسیله نوگت در پروژه نصب کنید
                Dim rahpayVerificationResult = Newtonsoft.Json.JsonConvert.DeserializeObject(Of VerificationResult)(returnee)

                If (rahpayVerificationResult.httpStatus = 200 And rahpayVerificationResult.transactionStatusCode = 100) Then
                    'روال تراکنش موفقیت آمیز بوده و شما
                    ' می توانید بر اساس منطق برنامه خود دیتابیس خود را بروز رسانی کنید
                Else
                    'تراکنش به هر دلیلی تایید نشده است و چنانچه دوباره
                    ' verify_transaction
                    ' فراخوانی نشود، مبلغ واریزی به کارت واریز کننده برگشت داده می شود
                End If

                ViewBag.Message = rahpayVerificationResult.card & " " & returnee
            Else
                ViewBag.Message = "Error! " & Response.ReasonPhrase & " " & Response.StatusCode.ToString() & " " _
                        & " " & returnee
            End If
        End Using
    End If

    Return View(Input)
End Function
            
        

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