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

پکیج nusoap به عنوان یکی از مهم ترین پکیج ها برای تولید درگاه پرداخت بانکی در ایران شناخته می شود. مراحل طراحی تا ساخت درگاه پرداخت در لاراول را به راحت ترین شکل ممکن ارائه کرده ایم. درگاه های پرداخت متعددی در ایران وجود دارند. از بانک های دولتی و تحت نظر بانک مرکزی گرفته تا موسسه هایی که وظیفه ارائه درگاه واسط را به عهده گرفته و زیر نظر بانک مرکزی فعالیت می کنند. در ادامه این آموزش به شما یاد می دهیم که چگونه یک درگاه پرداخت در لاراول با اتصال به زرین پال ایجاد کنید. با ما همراه باشید.

ابتدا به سایت زرین پال بروید و یک حساب در آن ایجاد کنید. ایجاد یک حساب خیلی راحت است و نکته خاصی ندارد و کافی است که دستورالعمل های سایت زرین پال که در هنگام ثبت نام به شما ارائه می شود را دنبال کنید.

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

در ادامه ابتدا با دستور زیر لاراول را نصب می کنیم.

composer create-project --prefer-dist laravel/laravel RoxoPayment

پکیج nusoap چیست؟

از آنجا که تقریبا همه درگاه های بانکی ایران از وب سرویس SOAP استفاده می کنند. این پکیج به کاربران PHP‌ کمک می کند تا به راحتی بتوانند بر اساس یک سری توابع با این وب سرویس ارتباط برقرار کرده و داده ها را رد و بدل کنند. بنابراین برای نصب آن دستور زیر را در CMD خود وارد کرده و سپس دکمه Enter را بفشارید:

composer require econea/nusoap:dev-master

راه اندازی View صفحه پرداخت

حال به مسیر resources -> views بروید و یک ویو با نام shop.blade.php ایجاد کنید و کدهای زیر را در آن قرار دهید

<form method="post" action="{{url('shop')}}">
    {{csrf_field()}}
    <input type="text" name="price">
    <button type="submit">تکمیل خرید</button>
</form>

در کد بالا یک Text Box به همراه یک دکمه قرار دادیم. در Text Box قیمتی که می خواهیم از کاربر دریافت کنیم را وارد کرده و با زدن دکمه خرید کاربر به درگاه متصل شده و می تواند پرداخت را انجام دهد.

توجه: این فرم در واقع یک فرم بسیار ساده برای یادگیری مفاهیم پرداخت در لاراول می باشد. شما می توانید آن را توسعه داده و به فروشگاه خود متصل کنید.

مسیردهی (Routing) درگاه پرداخت در لاراول

حال فایل web.php را باز کرده و کدهای زیر را در آن قرار دهید:

مسیرهای تعریف شده ما به شرح زیر است:

مسیر buy

اگر کاربر به مسیر www.yoursite.com/buy رفت، فرم پرداخت برای آن ظاهر شود.

مسیر order

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

مسیر shop

این مسیر اطلاعات اعم از قیمت نهایی قابل پرداخت، ایمیل و شماره تماس کاربر را دریافت کرده و به سایت زرین پال می فرستد.

ایجاد کنترلر برای درگاه پرداخت در لاراول

سپس دستور زیر را برای ایجاد یک کنترلر وارد کنید.

php artisan make:controller siteController

حال یک پوشه با نام lib در فولدر app ایجاد کنید و داخل پوشه lib یک فایل با نام zarinpal.php بوجود بیاورید و کدهای زیر را در آن قرار دهید.

<?php
namespace App\lib;
use DB;
/*require_once 'nusoap.php';*/
use nusoap_client;
class zarinpal
{
    public $MerchantID;
    public function __construct()
    {
        $this->MerchantID="5e682ada-3b69-11e8-aaf3-005056a205be";
    }
    public function pay($Amount,$Email,$Mobile)
    {
                    $Description = 'فروش محصول';  // Required
                    $CallbackURL = url('/order'); // Required
            
            
                $client = new nusoap_client('https://www.zarinpal.com/pg/services/WebGate/wsdl', 'wsdl');
                $client->soap_defencoding = 'UTF-8';
                $result = $client->call('PaymentRequest', [
                    [
                        'MerchantID'     => $this->MerchantID,
                        'Amount'         => $Amount,
                        'Description'    => $Description,
                        'Email'          => $Email,
                        'Mobile'         => $Mobile,
                        'CallbackURL'    => $CallbackURL,
                    ],
                ]);
            
                //Redirect to URL You can do it also by creating a form
                if ($result['Status'] == 100) {
                    return $result['Authority'];
                } else {
                    return false;
                }
                
    
    
    }
 
}

این کلاس توسط زرین پال برای اتصال سایت ها به درگاه بانکی، ارائه شده است.

وقتی که در سایت زرین پال ثبت نام کرده و برای سایت تان درخواست یک درگاه می کنید، زرین پال پس از موافقت با درخواست شما، یک MerchantID به شما تحویل می دهد که در ابتدای این مقاله به آن اشاره کردیم.

حال شما باید این MerchantID را در فایل zarinpal.php وارد کنید.

  .....

class zarinpal
{
    public $MerchantID;
    public function __construct()
    {
        $this->MerchantID="5e682ada-3b69-11e8-aaf3-005056a205be";//کد مربوط به خودتان را وارد کنید
    }

    ......

قسمت description و callbackURL را باید ویرایش کنید.

  1. callbackURL همان آدرسی است که کاربر پس از انجام پرداخت به آن هدایت می شود
  2. description در واقع توضیحاتی است که به هنگام خرید توسط سیستم به درگاه پرداخت زرین پال ارائه می شود
 public function pay($Amount,$Email,$Mobile)
    {
                    $Description = 'فروش محصول';  // Required
                    $CallbackURL = url('/order'); // Required
            
            
                $client = new nusoap_client('https://www.zarinpal.com/pg/services/WebGate/wsdl', 'wsdl');
                $client->soap_defencoding = 'UTF-8';
                $result = $client->call('PaymentRequest', [
                    [
                        'MerchantID'     => $this->MerchantID,
                        'Amount'         => $Amount,
                        'Description'    => $Description,
                        'Email'          => $Email,
                        'Mobile'         => $Mobile,
                        'CallbackURL'    => $CallbackURL,
                    ],
                ]);
            
                //Redirect to URL You can do it also by creating a form
                if ($result['Status'] == 100) {
                    return $result['Authority'];
                } else {
                    return false;
                }
                
    
    
    }

حال کنترلر siteController.php را باز کرده و کدهای زیر را در آن قرار دهید.

   //siteController.php

    ......

     public function add_order(Request $request)
    {

        $order = new zarinpal();
        $res = $order->pay($request->price,"myroxo24@gmail.com","0912111111");
        return redirect('https://www.zarinpal.com/pg/StartPay/' . $res);

    }
    ..........

در واقع در این متد تعریف کرده ایم که وقتی کاربر روی گزینه ثبت سفارش کلیک کرد یک کلاس جدید از zarinpal ایجاد کرده و سپس مقدار res را با ارائه اطلاعات (قیمت، ایمیل کاربر و شماره تماس) به وب سرویس زرین پال بدست بیاوریم.

تست کردن درگاه پرداخت در لاراول

بنابراین برای ارسال اطلاعات، مقدار res را به آدرس وب سرویس زرین پال ریدایرکت می کنیم. برای تست کردن این متد لطفا مراحل زیر را طی کنید:

حال مرورگر را باز کرده و به آدرس localhost:8000/buy بروید.

بعد از باز شدن صفحه، یک مقدار به عنوان قیمت در Text Box وارد کنید و دکمه خرید را بزنید.

بعد از زدن دکمه به سایت زرین پال منتقل می شوید و می توانید پرداخت را انجام دهید.

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

برای اینکار یک متد به نام Order در کنترلر siteController.php تعریف کرده و صحت پرداخت کاربر را در آن بررسی می کنیم.

public function order(Request $request){

        $MerchantID = '5e682ada-3b69-11e8-aaf3-005056a205be';
        $Authority =$request->get('Authority') ;
                
        //ما در اینجا مبلغ مورد نظر را بصورت دستی نوشتیم اما در پروژه های واقعی باید از دیتابیس بخوانیم
        $Amount = 100;
        if ($request->get('Status') == 'OK') {
            $client = new nusoap_client('https://www.zarinpal.com/pg/services/WebGate/wsdl', 'wsdl');
            $client->soap_defencoding = 'UTF-8';

            //در خط زیر یک درخواست به زرین پال ارسال می کنیم تا از صحت پرداخت کاربر مطمئن شویم
            $result = $client->call('PaymentVerification', [
                [
                    //این مقادیر را به سایت زرین پال برای دریافت تاییدیه نهایی ارسال می کنیم
                    'MerchantID'     => $MerchantID,
                    'Authority'      => $Authority,
                    'Amount'         => $Amount,
                ],
            ]);

            if ($result['Status'] == 100) {
                    return 'پرداخت با موفقیت انجام شد.';

            } else {
                    return 'خطا در انجام عملیات';
            }
        }
        else
        {
            return 'خطا در انجام عملیات';
        }



    }

نتیجه گیری

پس از پرداخت، وب سایت زرین پال یک پاسخ را در قالب متغییر request (مشابه درخواست ها در لاراول) برای ما ارسال می کند. در این حالت باید request را مورد بررسی قرار دهیم. داخل request اطلاعاتی به شرح زیر است:

  • Authority: بیانگر وضعیت احراز هویت کاربر برای پرداخت می باشد
  • status: بیانگر وضعیت پرداخت می باشد

در نظر داشته باشید که این اطلاعات با متد GET به سایت لاراولی ما ارسال می شود. بنابراین مسیری که به نام order تعریف کرده ایم از این متد پیروی می کند.

حال اگر مقدار status برابر ۱۰۰ بود بدین منظور است که عملیات موفقیت آمیز بوده و شما می توانید دستورهای مورد نیاز خودتان را اعم از ارسال فایل به کاربر یا ثبت سفارش و … انجام دهید. در غیر اینصورت پرداخت نا موفق می باشد.

برای دریافت اطلاعات سایر اعدادی که وضعیتهای (status) متفاوتی را به ما گزارش می دهند، لطفا به سایت زرین پال رفته و مستندات آن را مطالعه کنید.

چنانکه در این خصوص سوالی داشتید همکاران ما در بخش پشتیبانی آماده پاسخگویی به شما هستند.