درگاه های پرداخت متعددی در ایران وجود دارند. از بانک های دولتی و تحت نظر بانک مرکزی گرفته تا موسسه هایی که وظیفه ارائه درگاه واسط را به عهده گرفته و زیر نظر بانک مرکزی فعالیت می کنند که به پرداخت یار ها معروفند در اینجا سعی داریم نحوه اتصال درگاه پرداخت سیزپی در لاراول را آموزش دهیم.
ابتدا به سایت سیزپی بروید و یک حساب در آن ایجاد کنید. ایجاد یک حساب خیلی راحت است و نکته خاصی ندارد و کافی است که دستورالعمل های سایت سیزپی که در هنگام ثبت نام به شما ارائه می شود را دنبال کنید.سپس از طریق منوی درگاه پرداخت نسبت به ایجاد یک درگاه پرداخت برای سایت خود اقدام کنید. در این حالت شما آدرس وب سایت خود را می دهید و پس از تایید توسط مدیران سیزپی، درگاه پرداخت برای سایت شما فعال می شود. پس از فعال شدن این درگاه 4 فیلد مرچنت (پذیرنده) ، ترمینال ، نام کاربری (Key) ، رمز عبور (IV) در اختیارتان قرار می گیرد که برای احراز هویت در اتصال به وبسرویس درگاه پرداخت سیزپی استفاده می شوند.
ابتدا با دستور زیر لاراول را نصب می کنیم.
composer create-project --prefer-dist laravel/laravel SamplePayment
حال به مسیر 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::post('verify','siteController@verify_order');
Route::post('shop','siteController@add_order');
مسیرهای تعریف شده ما به شرح زیر است:
· مسیر buy
اگر کاربر به مسیر www.yoursite.com/buy رفت، فرم پرداخت برای آن ظاهر شود.
· مسیر verify_order
برای زمانی مورد استفاده قرار می گیرد که کاربر پرداخت را انجام داده و سپس به سایت باز می گردد.
· مسیر shop
این مسیر اطلاعات اعم از قیمت نهایی قابل پرداخت، ایمیل و شماره تماس کاربر را دریافت کرده و به سایت سیزپی می فرستد.
توضیحات مسیر order و shop در ادامه آمده است.
سپس دستور زیر را برای ایجاد یک کنترلر وارد کنید.
php artisan make:controller siteController
حال یک پوشه با نام lib در فولدر app ایجاد کنید و داخل پوشه lib یک فایل با نام sizpay.php بوجود بیاورید و کدهای زیر را در آن قرار دهید.
<?php
namespace App\lib;
use DB;
class sizpay
{
public $merchant;
public $terminal;
public $username;
public $password;
public function __construct()
{
$this->merchant = "500118980400014;
$this->terminal = "18000143";
$this->username = "GhAyNNpHClj27uDE5YUwRCmvRXV8oP4HYxSXwI2vC/Y=";
$this->password = "TgkrvSIeL40R62H02ch3pw==";
}
public function pay($Amount,$OrderId = '')
{
$client = new \SoapClient('https://rt.sizpay.ir/KimiaIPGRouteService.asmx?WSDL');
$result = $client->GetToken2($parameters = array(
'MerchantID' => $this->merchant,
'TerminalID' => $this->terminal,
'UserName' => $this->username,
'Password' => $this->password,
'Amount' => $Amount,
'OrderID' => time(),
'ReturnURL' => url('/verify),
'InvoiceNo' => time(),
'DocDate' => '',
'ExtraInf' => $OrderId,
'AppExtraInf' => '',
'SignData' => ''
))->GetToken2Result;
$result = json_decode($result);
if (isset($result->ResCod) && in_array($result->ResCod, array('0', '00')))
{
return $result->Token;
}
else
{
return false;
}
}
}
این کلاس توسط سیزپی برای اتصال سایت ها به درگاه بانکی، ارائه شده است.
نکته : اطلاعات 4 فیلد مرچنت ، ترمینال ، نام کاربری و رمز عبور را از پنل پذیرندگان سیزپی دریافت و در این فایل جایگزین کنید.
فیلد های OrderID و InvoiceNo و به بعد را میتوانید مطابق دلخواه تغییر دهید
فیلد ReturnURL همان آدرسی است که کاربر پس از انجام پرداخت به آن هدایت می شود
حال کنترلر siteController.php را باز کرده و کدهای زیر را در آن قرار دهید.
//siteController.php
public function add_order(Request $request)
{
$order = new sizpay();
$token = $order->pay($request->price, uniqid());
if ($token)
{
$html = '<p style="color:#ff0000; font:18px Tahoma; direction:rtl;">در حال اتصال به درگاه بانکی. لطفا صبر کنید ...</p>
<form name="frmPay" method="post" action="https://rt.sizpay.ir/Route/Payment">
<input type="hidden" name="MerchantID" value="'.$order->merchant.'" />
<input type="hidden" name="TerminalID" value="'.$order->terminal.'" />
<input type="hidden" name="Username" value="'.$order->username.'" />
<input type="hidden" name="Password" value="'.$order->password.'" />
<input type="hidden" name="Token" value="'.$token.'" />
<input type="hidden" name="SignData" value="" />
<noscript><center><input type="submit" value="پرداخت" /></center></noscript>
</form>document.frmPay.submit();';
}
else
{
$html = 'خطا در اتصال به وبسرویس سیزپی';
}
echo $html;
exit;
}
در واقع در این متد تعریف کرده ایم که وقتی کاربر روی گزینه ثبت سفارش کلیک کرد یک شی جدید از کلاس sizpay ایجاد کرده و سپس مقدار token را با ارائه اطلاعات (قیمت، شماره سفارش) به وب سرویس سیزپی بدست بیاوریم.
بنابراین برای ارسال اطلاعات، مقدار توکن را به آدرس وب سرویس سیزپی ریدایرکت می کنیم. برای تست کردن این متد لطفا مراحل زیر را طی کنید:
مرورگر را باز کرده و به آدرس localhost:8000/buy بروید.
بعد از باز شدن صفحه، یک مقدار به عنوان قیمت در Text Box وارد کنید و دکمه خرید را بزنید.
بعد از زدن دکمه به سایت سیزپی منتقل می شوید و می توانید پرداخت را انجام دهید.
اما کار ما در اینجا تمام نمی شود. بعد از این که کاربر پرداخت را انجام داد، به سایت ما منتقل می شود. حال ما باید چک کنیم که آیا پرداخت کاربر موفقیت آمیز بوده یا نه. همچنین اطلاعات خرید را هم دریافت کنیم.
برای اینکار یک متد به نام Order در کنترلر siteController.phpتعریف کرده و صحت پرداخت کاربر را در آن بررسی می کنیم.
//siteController.php
public function verify_order(Request $request)
{
$order = new sizpay();
if (isset($request->post('ResCod')) && in_array($request->post('ResCod'), array('0', '00')))
{
$client = new \SoapClient('https://rt.sizpay.ir/KimiaIPGRouteService.asmx?WSDL');
$result = $client->Confirm2($parameters = array(
'MerchantID' => $order->merchant,
'TerminalID' => $order->terminal,
'UserName' => $order->username,
'Password' => $order->password,
'Token' => $request->post('Token'),
'SignData' => ''
))->Confirm2Result;
$result = json_decode($result);
if (isset($result->ResCod) && in_array($result->ResCod, array('0', '00')))
{
return 'پرداخت با موفقیت انجام شد.';
}
else
{
return 'خطا در انجام عملیات';
}
}
else
{
return 'پرداخت توسط کاربر لغو شد';
}
}
پس از پرداخت، وب سایت سیزپی یک پاسخ را در قالب POSTبرای ما ارسال می کند. در این حالت باید request را مورد بررسی قرار دهیم. داخل request اطلاعات تراکنش انجام شده قرار دارد
ResCod: بیانگر وضعیت تراکنش می باشد
Token: توکن پرداخت که برای استعلام وضعیت پرداخت بکار میرود
در نظر داشته باشید که این اطلاعات با متد POSTبه سایت لاراولی ما ارسال می شود. بنابراین مسیری که به نام verify_order تعریف کرده ایم از این متد پیروی می کند.
حال اگر مقدار ResCode برابر 0 یا 00 بود بدین منظور است که عملیات موفقیت آمیز بوده و شما می توانید دستورهای مورد نیاز خودتان را اعم از ارسال فایل به کاربر یا ثبت سفارش و … انجام دهید. در غیر اینصورت پرداخت نا موفق می باشد.