آموزش ساخت درگاه پرداخت در لاراول (Laravel) - زرین پال

آموزش ساخت درگاه پرداخت لاراول - زرین پال

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

پکیج 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 را باز کرده و کدهای زیر را در آن قرار دهید:

Route::get('buy',function(){
    return view('shop');
});

Route::get('order','siteController@order');
Route::post('shop','siteController@add_order');

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

مسیر buy

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

مسیر order

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

مسیر shop

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

توضیحات مسیر order و shop در ادامه آمده است.

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

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

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

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) متفاوتی را به ما گزارش می دهند، لطفا به سایت زرین پال رفته و مستندات آن را مطالعه کنید.

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

نویسنده شوید

دیدگاه‌های شما (16 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

mohsen
14 آبان 1400
سلام این خطا رو میده و به درگاه کتصل نمیشه Class "nusoap_client" not found

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

ص
04 اردیبهشت 1400
سلام ببخشید این پکیج برا درگاه مستقیم هم قابل استفاده هست؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

خدابنده
25 آبان 1399
سلام وقتی پرداخت انجام میشه چطور میتونم اینکه کدوم پرداخت با موفقیت انجام شده رو در دیتابیش ذخیره کنم ؟ مبلغ پرداخت از دیتابیش میخونم و یک فیلد activeبرای اینکه مشخص کنم پرداخت شده یا خیر قراردادم ولی بعد از بررسی صحت پرداخت در تابع add_order نمیدونم چطور مشخص کنم کدوم پرداخت شده! میشه لطفا راهنمایی کنید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

خدابنده
22 آبان 1399
سلام ممنون از آموزش های خوبتون من یک مشکلی دارم http://localhost/RoxoPayment/public/order?Authority=A00000000000000000000000000224830443&Status=OK حالت status ، اوکی هستش و مبلغ از حساب کسر میشه ولی پیغامی که نمایش میده خطا در انجام عملیاته دلیلش چیه ؟؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
23 آبان 1399
سلام وقت شما بخیر باید با استفاده از دستور dd بررسی کنید که مقدار کد بازگشتی چی هست. این کد نشون میده که زرین پال در ازای پرداخت شما چه پاسخی رو ارسال می کنه!

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مهدی
31 اردیبهشت 1399
سلام خسته نباشید ..یه راهنمایی میخاستم من یه سایتی زدم فروش اپ ولی توسایت فروش انجام نمیشه....تیم اپ اپلیکیشن این سایتو زدن ولی میخان هنگام خرید به سایت وصل بشن خریدانجام بگیره ...بمن این نمونه فیلدارو دادن ...نمیدونم کجا بکار بگیرمشون ... لینک درخواست: http://194.5.188.147:8888/api/zarinpal//// #توضیحات: ✅sale_plane_id : اگر 1 باشه میشه خرید کل پایه ها 5000 اگر 2 باشه میشه خرید تک پایه 2000 ✅verify: یک کد یونیک ✅type: mobile #نمونه: /api/zarinpal/mobile/0919647777/1/55347788091755 http://194.5.188.147:8888/api/mobile/zarinpal-callback با متد GET اون کد یونیک یعنی verify را بفرستند تا جواب را بگیرند. کدی که دریافت می‌کنند یعنی ✅ transaction 4000 : اگر پرداخت موفقیت امیز باشه. 3000 : اگر پرداخت با مشکلی را بشه کاربر انصراف بده و اگر هم پول کسر شه برگروونده میشه. Null : هنوز اقدام به خرید نکرده. اینارو کجابزارم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مهدی خانزادی
17 اردیبهشت 1399
سلام. اگه از لاراول استفاده میکنید یه نگاهی به پکیج زیر بندازید. تمام درگاه های بانکی کشور رو تقریبا ساپورت میکنه https://github.com/shetabit/payment

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

شاهو قادری
05 اردیبهشت 1399
ممنون خیلی خوب بود دمت گرم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی راد
22 اسفند 1398
سلام وقتی روی پرداختم کلیک میکنم زرین پال یه json برمی گردونه که خطای ۴۰۴ میده در واقع تا جایی که تست کردم بازگشت تابع pay فالس هستش و دلیلش هم نمیدونم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

ص
20 اسفند 1398
سلام اگه بخاییم درگاه اشتراکی شناور بسازیم هم میتونیم از این متودا استغاده کنیم؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

مهدی خانزادی
24 آذر 1398
سلام. میتونید از پکیج زیر استفاده کنید. تمامی درگاه های بانکی ایران رو پوشش میده و با یکبار کد نویسی میتونید به تمامی درگاه ها متصل بشید و دیگه نیازی نیست به ازای هر درگاه کد بزنید. https://github.com/shetabit/payment/blob/HEAD/README-FA.md اگه یه اموزش ازش بزارید روی سایتتون خیلی خوب میشه :)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

افشین
11 آذر 1398
سلام این مراحل رو رفتم روی لوکال کاملا درسته و بدون هیچ خطایی به درگاه وصل میشه و حتی پرداخت هم کردم و برگشت اما وقتی فرستادمش روی هاست . دیگه کار نمیکنه خروجی از فایل zarinpal.php که میگیرم میبینم $res رو داره false بر میگردونه . در حالی که روی لوکال مقدارش یه همچین چیزیه "000000000000000000000000000140058106" سواپ و بقیه موارد رو هم بررسی کردم . مشکلی ندارن اصلا پشتیبانی زرین پال هم میگه درگاه درسته و کد ها مشکل داره . میتونید یه کمکی بکنید ?

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

سارا
14 شهریور 1400
منم به همین مشکل خوردم.راه حلی داره؟

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

افشین
28 مرداد 1398
سلام طبق کدهای شما کار رو انجام دادم . روی لوکال درست کار میکنه اما روی هاست خطا میده {"meta":{"code":404,"error_type":"NotFound","error_message":"404 NotFound."}}

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی راد
23 اسفند 1398
سلام من روی لوکال اشکال داشتم که برطرفش کردم مشکل من از curl بود باید php curl رو فعال کنید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

reza
27 مرداد 1398
سلام مرسی از اموزش عالیتون فقط یه سوال من الان چجوری میتونم تست کنمش یعنی میرم صفحه پرداخت اما بدون اینکه شماره کارت و اینا رو بزنم بتونم برگردم به فانکشن بعدی که کارهای دیگه اش رو بکنم یادمه زین پال یه تست هم داشت

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

صدیقه
25 بهمن 1397
سلام تو قسمت کلاس(siteController) زرین پال رو(zarinpal) چطوری باید use کنیم من با این خطا مواجه شدم. Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_ERROR) Class 'App\Http\Controllers\zarinpal' not found

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

روکسو
26 بهمن 1397
سلام وقت شما بخیر برای حل این مشکل شما باید کلاسی که در lib می نویسید را use کنید. جهت انجام اینکار لطفا این مطلب را مطالعه کنید.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

احسان
08 دی 1397
سلام ممنون از آموزشتون یک سوال دارم: برای قسمت تست یا verify اونجایی که مقدار رو 100 وارد کردید، چطور باید مقدار صورتحساب مربوطه رو از دیتابیس خوند؟ چون در قسمت ارسال مقادیر پرداخت به زرین پال امکان اینکه مثلا شناسه سفارش یا هر دیتای مشخصی رو در دیتابیس ذخیره و بعد اون دیتا رو در قسمت verify از دیتابیس بازگردانی بخونیم وجود نداره!

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

پوریا
04 خرداد 1398
ممنون از آموزش عالیتون... منم همین مشکل رو دارم، ممنون میشم یه راه حلی ارائه کنید.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

reza
27 مرداد 1398
راهی که به ذهنم رسیده اینه که شما توی متد add_order یک رکوردی رو توی جدولتون تو دیتابیس ایجاد کنید(خودم حدولی به نام payment درست کردم با فیلد های مورد نیازم مثل قیمت و آی دی کاربر و ...) و چون authority که برمیگردونه منحصر به فرد هستش, توی متد order با یک select بگیریدش و اونجا مقادیری که مورد نیازتونه مثل قیمت و ... رو بخونین یا اصلا همون رکورد رو آپدیت کنین.

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

سعید
12 آذر 1397
سلام ممنون از آموزشتون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.