در این مقاله قصد داریم به آموزش ساخت درگاه پرداخت در لاراول بپردازیم و تراکنش های بانکی در این فریم ورک را با یکدیگر بررسی کنیم.
پکیج nusoap به عنوان یکی از مهم ترین پکیج ها برای تولید درگاه پرداخت بانکی در ایران شناخته می شود. مراحل طراحی تا ساخت درگاه پرداخت در لاراول را به راحت ترین شکل ممکن ارائه کرده ایم. با ما همراه باشید.
درگاه های پرداخت متعددی در ایران وجود دارند. از بانک های دولتی و تحت نظر بانک مرکزی گرفته تا موسسه هایی که وظیفه ارائه درگاه واسط را به عهده گرفته و زیر نظر بانک مرکزی فعالیت می کنند. اما برای روشن تر کردن عبارت درگاه پرداخت واسط، به چندتا از سوالات شما پاسخ می دهیم:
سوال اول: درگاه پرداخت واسط چیست؟
پاسخ: درگاه پرداخت واسط در واقع به عنوان یک واسطه بین شما و بانک عمل می کند و کاربر پس از پرداخت وجه در این درگاه، حساب بانکی شما (کیف پول تان) را در سایت های درگاه واسط شارژ می کند. سپس شما می توانید با درخواست وجه از شرکت مورد نظر، در یک بازه زمانی خاص (مثلا ۱۲ ساعت الی ۴ روز) مبلغ مورد درخواستی را در کارت بانکی خود دریافت کنید.
سوال دوم: آیا درگاه های واسط مورد اعتماد هستند؟
پاسخ: پاسخ به این سوال کمی دشوار است. از طرفی بله و از طرف دیگر خیر. درگاه های پرداخت واسط بسیار زیادی در سرتاسر ایران در حال فعالیت هستند و واقعا کدامیک از آنها را می توان امین و مطمئن شمرد. در حال حاضر تنها درگاه واسط معتبر در ایران، درگاه پرداخت زرین پال می باشد. این شرکت جزو اولین شرکت های پرداخت واسطه بوده که در حال حاضر با امضاء تفاهم نامه همکاری با شاپرک به عنوان یکی از معتبرترین درگاه های واسط شناخته میشود.
در ادامه این آموزش به شما یاد می دهیم که چگونه یک درگاه پرداخت در لاراول با اتصال به زرین پال ایجاد کنید. با ما همراه باشید.
ابتدا به سایت زرین پال بروید و یک حساب در آن ایجاد کنید. ایجاد یک حساب خیلی راحت است و نکته خاصی ندارد و کافی است که دستورالعمل های سایت زرین پال که در هنگام ثبت نام به شما ارائه می شود را دنبال کنید.
سپس از طریق منوی درگاه پرداخت نسبت به ایجاد یک درگاه پرداخت برای سایت خود اقدام کنید. در این حالت شما آدرس وب سایت خود را می دهید و پس از تایید توسط مدیران زرین پال، درگاه پرداخت برای سایت شما فعال می شود. پس از فعال شدن این درگاه یک مرچند کد در اختیارتان قرار می گیرد که در ساخت درگاه پرداخت در لاراول به شما کمک می کند.
ابتدا با دستور زیر لاراول را نصب می کنیم.
composer create-project --prefer-dist laravel/laravel RoxoPayment
از آنجا که تقریبا همه درگاه های بانکی ایران از وب سرویس SOAP استفاده می کنند. این پکیج به کاربران PHP کمک می کند تا به راحتی بتوانند بر اساس یک سری توابع با این وب سرویس ارتباط برقرار کرده و داده ها را رد و بدل کنند. بنابراین برای نصب آن دستور زیر را در CMD خود وارد کرده و سپس دکمه Enter را بفشارید:
composer require econea/nusoap:dev-master
حال به مسیر 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 قیمتی که می خواهیم از کاربر دریافت کنیم را وارد کرده و با زدن دکمه خرید کاربر به درگاه متصل شده و می تواند پرداخت را انجام دهد.
توجه: این فرم در واقع یک فرم بسیار ساده برای یادگیری مفاهیم پرداخت در لاراول می باشد. شما می توانید آن را توسعه داده و به فروشگاه خود متصل کنید.
حال فایل 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 را باید ویرایش کنید.
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 اطلاعاتی به شرح زیر است:
در نظر داشته باشید که این اطلاعات با متد GET به سایت لاراولی ما ارسال می شود. بنابراین مسیری که به نام order تعریف کرده ایم از این متد پیروی می کند.
حال اگر مقدار status برابر ۱۰۰ بود بدین منظور است که عملیات موفقیت آمیز بوده و شما می توانید دستورهای مورد نیاز خودتان را اعم از ارسال فایل به کاربر یا ثبت سفارش و ... انجام دهید. در غیر اینصورت پرداخت نا موفق می باشد.
برای دریافت اطلاعات سایر اعدادی که وضعیتهای (status) متفاوتی را به ما گزارش می دهند، لطفا به سایت زرین پال رفته و مستندات آن را مطالعه کنید.
بسیار عالی. دوستان عزیز در این آموزش سعی کردیم به خلاصه ترین و ساده ترین شکل ممکن نحوه اتصال به درگاه پرداخت در لاراول و زرین پال را ارائه دهیم. امیدوارم این آموزش مورد توجه شما واقع شده باشد. در صورتیکه آن را پسندیده اید لطفا این پست را لایک کنید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.