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

نمونه کد جاوا(وب) برای انتقال به درگاه پرداخت ره پی

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

در صورت استفاده از فریم ورک بوت اسپرینگ و یا تمپلیت انجینی همچون Thymeleaf نیز کدهای زیر با تغییرات متناسب با ویو و فریم ورک قابل استفاده خواهد بود.

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


    <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
    <!DOCTYPE html>
    <html>
        <head>
            <title>rahpay.net</title>
        </head>
        <body>
            <h1><%= "شروع تراکنش - پرداختیار ره پی" %>
            </h1>
            <br/>
            <form action="https://core.rahpay.net/start_transaction" method="post">
                <input type="hidden" name="amount" value="11000">
                <input type="hidden" name="orderId" value="1500abc">
                <input type="hidden" name="merchantId" value="XXXXXXX">
                <input type="hidden" name="terminalId" value="XXXXXXX">
                <input type="hidden" name="description" value="توضیحات فاکتور">
                <input type="hidden" name="cell_number" value="09120010000">
                <button type="submit">پرداخت</button>
            </form>
        </body>
    </html>

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

در صورت استفاده از Maven، نیازمندی های زیر را در تگ dependencies قرار دهید.


    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.json/json -->
    <dependency>
        <groupId>org.json</groupId>
        <artifactId>json</artifactId>
        <version>20201115</version>
    </dependency>

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

کد زیر، برای رات(مسیر) کال بک به سایت شما مورد نیاز خواهد بود. آدرس دقیق کال بک بسته به بک آفیس سایت شما، در زمان عقد و ارسال قرار داده نهایی شده است و لازم است در بکند سایت شما بصورت زیر هندل شود.


    package com.example.demo;

    import java.io.*;
    import java.util.ArrayList;
    import java.util.List;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    import org.apache.http.HttpEntity;
    import org.apache.http.HttpResponse;
    import org.apache.http.NameValuePair;
    import org.apache.http.client.HttpClient;
    import org.apache.http.client.entity.UrlEncodedFormEntity;
    import org.apache.http.client.methods.HttpPost;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.message.BasicNameValuePair;
    import org.apache.http.util.EntityUtils;
    import org.json.JSONObject;
    
    @WebServlet(name = "callback", value = "/callback")
    public class CallbackServlet extends HttpServlet {
    
        public void init() {
        }
    
        public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
            response.setContentType("text/html; charset=UTF-8");
            PrintWriter out = response.getWriter();
            String message = "متد از نوع GET در این کلاس و کلا در روال تایید تراکنش مورد استفاده نخواهد بود!";
    
            out.println("<!DOCTYPE html>");
            out.println("<html lang='fa-IR'>");
            out.println("<head>");
            out.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
            out.println("<meta charset='utf-8'>");
            out.println("</head>");
            out.println("<body dir='rtl'>");
            out.println("<h1>" + message + "</h1>");
            out.println("</body></html>");
        }
    
        public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
            // این متد توسط ره پی، بعد از انجام تراکنش در درگاه، فراخوانی شده و پارامترها بصورت پست در آن قرارداده شده است
            response.setContentType("text/html; charset=UTF-8");
            PrintWriter out = response.getWriter();
            out.println("<!DOCTYPE html>");
            out.println("<html lang='fa-IR'>");
            out.println("<head>");
            out.println("<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>");
            out.println("<meta charset='utf-8'>");
            out.println("</head>");
            out.println("<body dir='rtl'>");
    
            try {
                String refNum = request.getParameter("refNum");
                String orderId = request.getParameter("orderId");
                String amount = request.getParameter("amount");
                String message = request.getParameter("message");
                String transactionStatusCode = request.getParameter("transactionStatusCode");
                String followUpNumber = request.getParameter("followUpNumber");
    
                out.println("<p>refNum: " + refNum + "</p>");
                out.println("<p>transactionStatusCode: " + transactionStatusCode + "</p>");
                out.println("<p>followUpNumber: " + followUpNumber + "</p>");
                out.println("<hr/>");
    
                if (transactionStatusCode.equals("100")) {
                    // acknowledge process
                    // کسر وجه از کارت فرد، موفقیت آمیز است و لازم است که سرور شما روال تصدیق و آگاهی یافتن از تراکنش را با سرور ره پی انجام دهد
                    String merchantId = "XXXXXXX";
                    String terminalId = "XXXXXXX";
    
                    String url = "https://core.rahpay.net/verify_transaction";
                    HttpClient httpclient = HttpClients.createDefault();
                    HttpPost httppost = new HttpPost(url);
    
                    List<NameValuePair> params = new ArrayList<NameValuePair>(5);
                    params.add(new BasicNameValuePair("refNum", refNum));
                    params.add(new BasicNameValuePair("orderId", orderId));
                    params.add(new BasicNameValuePair("amount", amount));
                    params.add(new BasicNameValuePair("merchantId", merchantId));
                    params.add(new BasicNameValuePair("terminalId", terminalId));
                    httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
    
                    HttpResponse rahpay_response = httpclient.execute(httppost);
                    HttpEntity entity = rahpay_response.getEntity();
    
                    if (entity != null) {
                        String responseString = EntityUtils.toString(entity, "UTF-8");
                        JSONObject jsonObj = new JSONObject(responseString);
                        int rr_httpStatus = jsonObj.getInt("httpStatus");
                        Boolean rr_hasError = jsonObj.getBoolean("hasError");
                        int rr_transactionStatusCode = jsonObj.getInt("transactionStatusCode");
                        String rr_refNum = jsonObj.getString("refNum");
                        String rr_message = jsonObj.getString("message");
                        String rr_orderId = jsonObj.getString("orderId");
                        String rr_card = jsonObj.getString("card");
    
                        out.println("<p>rr_transactionStatusCode: " + rr_transactionStatusCode + "</p>");
                        out.println("<p>rr_card: " + rr_card + "</p>");
                        out.println("<hr/>");
    
                        if (rr_httpStatus == 200 && rr_transactionStatusCode == 100) {
                            // روال تراکنش موفقیت آمیز بوده و شما
                            // می توانید بر اساس منطق برنامه خود دیتابیس خود را بروز رسانی کنید
                            out.println("<p> Card:" + rr_card + "</p>");
                        } else {
                            // تراکنش به هر دلیلی تایید نشده است و چنانچه دوباره
                            // verify_transaction
                            // فراخوانی نشود، مبلغ واریزی به کارت واریز کننده برگشت داده می شود
                            out.println("<p> Verify message: " + rr_message + "</p>");
                        }
                    } else {
                        out.println("<p>" + "عدم اتصال یا خطا در اتصال به ره پی" + "</p>");
                    }
                } else {
                    out.println("<p> خطا در روال انجام عملیات برداشت از کارت </p>");
                    out.println("<p>message: " + message + "</p>");
                }
            } catch (Exception e) {
                out.println("<p> Exception Message: " + e.getMessage() + "</p>");
                out.println("<p> Exception : " + e.getLocalizedMessage() + "</p>");
            }
    
            out.println("</body></html>");
        }
    
        public void destroy() {
        }
    }

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