اتصال به درگاه بانک ها در لاراول
متاسفانه درگاه های بانکهای ایرانی بر اساس یک پرتوکل و api یکسان ساخته نشده اند که این ضعف باعث شده برای ارتباط با هر درگاهی نیازمند به مطالعه دقیق api و مستندات آن باشید که معمولا قطعه کد های بوجود آمده علاوه بر داشتن quality پایین و عدم پایداری ، ضعف های امنیتی نیز خواهد داشت . با اینکه تمامی درگاه های بانک های ایرانی زیر پوشش شاپرک فعالیت میکنند اما هیچ کدام از نظر کد و منطق با دیگری یکسان نیست !
حتی یک مشکل امنیتی هم در تمامی درگاهای بانک های ایرانی وجود داره که پس از اتمام خرید ، کاربر و اطلاعات خرید (نتایج !!!!) همزمان به وبسایت پذیرنده هدایت و ارسال می شوند !!!. که یک کار خیلی مسخره و میتونم بگم ناشی از بیـسوادی بانکدارهاست !!! به هر روی متاسفانه در سالیان متمادی این مشکل امنیتی وجود داشته و تاکنون اقدامی برای حل آن صورت نگرفته !
بگذریم ;
پکیجی که قصد داریم امروز به شما معرفی کنیم پکیج ارتباط با درگاه بانک های ایرانی با نام Gateway می باشد که توسط تیم لارابوک برای لاراول پیاده سازی شده است و این پکیج از پکیج دیگری با نام poolport مشتق شده است اما قسمت های مختلفی از آن بهبود یافته است و برای فریمورک لاراول پیاده سازی شده است . لازم به ذکر است این پکیج همچنان در مرحله توسعه می باشد و در صورتی اینکه خطا یا مشکل امنیتی درآن مشاهده کردید میتوانید از قسمت issue ما را مطلع سازید تا در سریعترین زمان آن را مرتفع نماییم .
در حال حاضر امکان ارتباط با بانک های زیر وجود دارد:
بانک های عضو شاپرک :
ملت
ملی (سداد)
پارسیان
پاسارگاد
سامان
بانک های واسط :
پیلاین
جهان پی
زرین پال
که متاسفانه اخیرا مطلع شدیم به دلیل اعمال محدودیت از سوی بانک مرکزی ، برخی بانک های واسط ذکر شده فیلتر شده اند .
مراحل نصب :
ابتدا دستور زیر را در ترمینال وارد نمایید
1 |
composer require larabook/gateway |
سپس به مسیر config/app.php بروید و تغییرات زیر را ایجاد نمایید :
1 2 3 4 5 6 7 8 9 10 |
'providers' => [ ... Larabookir\Gateway\GatewayServiceProvider::class, // <-- add this line at the end of provider array ], 'aliases' => [ ... 'Gateway' => \Larabookir\Gateway\Gateway::class, // <-- add this line at the end of aliases array ] |
توجه داشته باشید پس از اعمال دستورات بالا ، دسترسی به سرویس gateway از طریق فاساد و service container برای شما فراهم خواهد شد.
دستور آرتیسان زیر را در ترمینال اجرا نمایید تا فایل های مورد نیاز در پروژه ایجاد گردند :
1 |
php artisan vendor:publish --provider="Larabookir\Gateway\GatewayServiceProvider" |
نکته : اگر دستور بالا خطا داد ، کوتیشن ها (“) رو از قسمت پارامتر حذف کنید و مجددا تست کنید .
و سپس برای ایجاد جداول :
1 |
php artisan migrate |
همچنین شما میتوانید نام جدول تراکنش ها را در فایل تنظیمات در مسیر config/gateway.php تغییر نمایید .
سپس فایل config/gateway.php را باز کنید و سپس اطلاعات درگاهتان را در آن وارد نمایید .
شما میتوانید از چند روش به سرویس gateway دسترسی پیداکنید (Facade , Service container) :
1 2 3 4 |
\Gateway::make(new Mellat()); // روش یک \Gateway::mellat(); // روش دو app('gateway')->make(new Mellat()); // روش سه app('gateway')->mellat(); // روش چهار |
بجای کلمه “Mellat” میتوانید از اسامی بانک های دیگر نیز استفاده نمایید :
- MELLAT
- SADAD
- PARSIAN
- PASARGAD
- ZARINPAL
نمونه ساده هدایت کاربر به بانک : ابتدا یک route از نوع get به منظور هدایت کاربر به بانک ایجاد میکنیم .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Route::get('request',function(){ try { $gateway = \Gateway::mellat(); $gateway->setCallback(url('callback/from/bank')); $gateway->price(1000)->ready(); $refId = $gateway->refId(); $transID = $gateway->transactionId(); // Your code here return $gateway->redirect(); } catch (Exception $e) { echo $e->getMessage(); } }); |
نکاتی که در این قسمت باید به آنها توجه داشت :
- با استفاده از متد price میتوانید مقدار هزینه را به ریال وارد کنید. توجه کنید که در تمام درگاهها این مقدار باید به ریال وارد شود.
- پس از تنظیم هزینه باید متد
ready
را فراخوانی کنید. این متد چک میکند که آیا همه چیز برای متصل شدن به درگاه آماده است یا خیر. - پس از فراخوانی متد
ready
میتوانید به درگاهredirect
کنید. اما در کد بالا مشاهده میکنید که ما ابتدا مقدارrefId
را دریافت کرده و سپس به درگاه تغییر مسیر میدهیم. مقدار ref id یک مقداری است که هر درگاه برای هر عملیات پرداخت در نظر میگرد. - در صورت وقوع هر نوع خطا پکیج
Exception
برمیگرداند، به همین دلیل شما حتما باید کدهای مربوط به پکیج را در بلاک{}try{}catch
قرار دهید.
ودر مرحله بعد یک route از نوع ANY برای دریافت نتایج از بانک ایجاد نمایید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Route::any('callback/from/bank',function(){ try { $gateway = \Gateway::verify(); $trackingCode = $gateway->trackingCode(); $refId = $gateway->refId(); $cardNumber = $gateway->cardNumber(); // عملیات خرید با موفقیت انجام شده است // در اینجا کالا درخواستی را به کاربر ارائه میکنم } catch (Exception $e) { echo $e->getMessage(); } }); |
نکاتی که در این قسمت باید به آنها توجه داشت :
- برای تایید اینکه آیا کاربر مبلغ مورد نظر را پرداخت کرده است یا خیر، باید متد
verify
را فراخوانی کنید. در صورتی که کاربر مبلغ مورد نظر را پرداخت نکرده باشد، و یا هر نوع مشکلی در انجام تایید پرداخت بوجود آمده باشد، پکیجException
برمیگرداند و مانع اجرا شدن کدهای بعدی خواهد شد. - متد
trackingCode
برای گرفتن شماره رهگیری است. - متد
refId
برای گرفتن مقدار ref id است. - متد
cartNumber
برای گرفتن شماره کارت کاربر است. توجه کنید که این متد در بعضی از درگاهها به دلیل پشتیبانی نکردن درگاه، مقدار خالی برمیگرداند.
Exceptions
در زمان بازگشت کاربر به سایت، ممکن است Exceptionهای مختلفی رخ بدهد:
- کاربر ممکن است برای دومین یا چندمین بار سعی بر ارسال داده از طرف بانک به سایت داشته باشد (
RetryException
) - ممکن است اطلاعات بازگشتی درست نباشد و در اینجا ممکن است چنین درگاههی در سایت موجود نباشد (
PortNotFoundException
) - ممکن است اطلاعات بازگشتی به سایت درست نباشد و در اینجا ممکن است آدرس بازگشت به سایت اشتباه باشد (
InvalidRequestException
) - ممکن است اطلاعات بازگشتی به سایت درست نباشد و در اینجا ممکن است چنین رکورد پرداختی موجود نباشد. (
NotFoundTransactionException
) - ممکن است کاربر از انجام پرداخت منصرف شده باشد. (
Exception
) - در اینجا Exception ها بدون درج مسیر کامل کلاس و namespace ایجاد شده اند . پس حتما با دستور use فضای نام (namespace) را لود کنید .
همچنین شما میتوانید تمام این Exceptionها را به صورت زیر Handle کنید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
try { $gateway = \Gateway::verify(); $trackingCode = $gateway->trackingCode(); $refId = $gateway->refId(); $cardNumber = $gateway->cardNumber(); // Your code here } catch (RetryException $e) { echo $e->getMessage(); } catch (PortNotFoundException $e) { echo $e->getMessage(); } catch (InvalidRequestException $e) { echo $e->getMessage(); } catch (NotFoundTransactionException $e) { echo $e->getMessage(); } catch (Exception $e) { echo $e->getMessage(); } |
و در پایان ..
شما به چند روش میتوانید در ارتقا این پکیج به ما کمک نمایید .
موفق و پیروز باشید
مرسی از کاری که کردید،اما یه سوال کجا ترمینال ای دی و یوزرنیم درگاهمونو وارد کنیم
بعد از اینکه vendor:publish رو طبق دستوری که گفتم رو زدید یه فایل با نام gateway.php تو فولدر config درست میشه و باید در اونجا واردش کنید .
merci vaghean babate in karha dar zamineye laravel k avalan mostanadat farsi khobi nadasht va sanian in k in ghabil karha o packagha dare dar zamineye karhaye dakhelie keshvaremon ok mikonid
vagheeeeeean khaste nabashid
خواهش میکنم . ممنون از اینکه با comment های مثبتتون ما رو دلگرم میکنید . امیدوارد که کار های که انجام میدیم براتون مفید واقع شده باشه .
packge cruddy khode laravelam age momkene amozeshesho bzarid
in packag vase “admin panele”
لطفا لینک پکیج رو ارسال کنید تا بررسی کنیم . با تشکر
حامد جان من مدتی هست لاراول کار نمی کنم . ولی پست خیلی خوبی نوشتی . مفید و کاربردی . این دسته مطالب پر کاربرد مناسب برای کاربر هست و مخاطب زیادی جذب میکنه . دستت درد نکنه مهندس .
خواهش میکنم سامان عزیز.
ببخشید میشه لطف کنید یک نمونه روت از نوع post برای دریافت نتایج بنویسید ،یکم ابهام دارم،
Refid رو چه جوری با این کار دوباره واسه بانک بفرستیم
مرسی
شما قرار نیست مجددا refid رو دوباره به بانک بفرستید ! تابع Gateway::verify خودش این کار رو واستون انجام میده 🙂 . من براتون route ها به همراه توضیحات خیلی کاملتری اضافه کردم. لطفا مجددا مطالعه فرمایید .
این پکیج آسونتر از اون چیزیه که فکرشو میکنید . لطفا پیشفرض های ذهنیتون در مورد API بانک ها رو دور بریزید و به این سیستم عادت کنید .
واقعا تشکر میکنم از اینکه باحوصله وقت گذاشتید و توضیح دادید
سلام
من این پکیج رو لاراول ۵٫۲ نصب کردم هنگام اضافه کردن provider اررو میده و وقتی پابلیش میکنم این خطا رو میده :
Class ‘Larabookir\Gateway\GatewayServiceProvider’ not found
ما خودمون با لاراول ۵٫۲ تست زدیم . ۱- اطمینان حاصل کنید پکیجتون تو مسیر vendor/larabook/gateway به درستی نصب شده باشه . ۲- تغییراتی که تو app.php گفتم رو حتما باید اعمال کرده باشید . ۳- اون دستور publish رو بدون کوتیشن هم تست کنید .
مثلا :
php artisan vendor:publish –provider=Larabookir\Gateway\GatewayServiceProvider
اگر مشکلتون حل شد لطفا اطلاع بدید تا توضیحات لازمه رو تو سایت بزاریم .با تشکر
اصلاً این مسیر vendor/larabook/gateway وجود نداره. به جاش این مسیر vendor/poolport ایجاد شده ؟ الان مشکلش چیه؟
الان هم وقتی این رو Larabookir\Gateway\GatewayServiceProvider::class, در config/app.php میزنم error میده؟؟
این دستور رو زدید آیا ؟
composer require larabook/gateway
احساس میکنم از اول باید مراحل رو دنبال کنید . چون پکیج رو اشتباه نصب کرده بودید .
مجددا نصب کنید توجه داشته باشید این دستور رو باید بزنید composer require larabook/gateway
الان به درستی نصب و فایل app.php به درستی تغییر میکنه اما وقتی دستور php artisan vendor:publish –provider=”Larabookir\Gateway\GatewayServiceProvider”
رو میزنیم فایل config ایجاد نمیشه و پیغام Nothing to publish for tag [].
رو میده
۱ – به این مسیر برو : laravel/vendor/larabook/gateway/src/GatewayServiceProvider.php
۲- سپس پراپرتی protected $defer رو پیدا کن اگر true هست برابر false بزارش .
۳- حالا دستور php artisan optimize رو تو ترمینال اجرا کن .
۴- حالا دستور پابلیش رو اجرا کن اگر کار نکرد کوتیشن (“) ها رو از تو پارامترش بردار .
۵- الان چک کنید باید فایل ها کانفیگ و میگریشن و view باید کپی شده باشند .
۶- اگر همچنان مشکل داشتی همون فایل GatewayServiceProvider رو باز کن توش مشخص هست که کدام فولدر باید به چه مسیری کپی شه . بصورت دستی کپیشون کن .
مشکل از لاراول هست زمانی که defer رو برابر true میزاری دیگه دستورات publish روش اجرا نمیشه ! امیدواریم از ورژن های بعد اوکی بشه .
ممنون از اینکه انقدر خوب به ما در جهت رفع خطاها کمک کردی . اگر در نهایت همچی اوکی شد بهمون اطلاع بده . با تشکر
خواهش میکنم.
بله همه چی به درستی انجام شد. ممنون از شما.
فقط یه مورد اینکه الان باید $defer رو به حالت قبل بر گردونم یا نه؟
اگر برش گردونید تا حدودی تو سرعتتون تاثیر مثبت میزاره .
بازم سلام
برا درگاه زرین پال خطا میدهد،
اونوقت او دو تا پارامتر چیه تو این درگاه ؟؟
public function __construct($config, $port)
سلام . یه زحمت میکشید تو قسمت issue کاملا مشکل رو تشریح کنی تا سریعتر برطرفش کنیم .با تشکر .
سلام خسته نباشید
شما فقط گفتید جدول ایجاد کنید اما نگفتید اسم جدول و فیلداش چی باشن میشه توضیح بدید
مرسی
جداول خودشون ایجاد میشن . میگریشن های مورد نظر به وسیله دستور publish به پروژتون انتقال داده میشن و سپس بوسیله دستور php artisan migrate جداول شما ایجاد میشن . نکته : قبل از اینکه میگریت کنید میتونید نام جدولتون رو در فایل config/gateway.php مشخص کنید .
برای اطلاعات بیشتر در مورد نحوه عملکرد میگریشن ها به این صفحه مراجعه فرمایید .
سلام
با تشکر از آقای پاکدامن بابت این پکیج خوب و حرفه ای که واقعا کار بزرگی انجام داده اند.
یه سوال داشتم خدمت دوستان و همچنین آقای پاکدامن که آیا امکانش هست که با این پکیج یه سازوکاری چیده بشه که از میان درگاههای بانک ملی ، ملت و پارسیان که هست بصورت هوشمند و اتوماتیک بهترین درگاه (از لحاظ در دسترس بودن و …) انتخاب بشه و لازم نباشه که بصورت پیشفرض درگاه رو از قبل برای پرداخت تعیین کنیم. وب سایت پی لاین یه همچین کاری کرده بود و بصورت هوشمند کاربر رو به بهترین درگاه هدایت می کرد.
با تشکر
با عرض سلام خدمت شما دوست گرامی. پیشنهاد خوبی کردید ولی از نظر فنی این موضوع کمی پیچیده تر از اون چیزی هست که بخوایم تو این پکیج بگنجونیم. ولی راه حلش نوشتن یک کرون جاب هست که هر یک دیقه یک بار بانک ها رو چک میکنه و اونایی که رسپانس تایم کمتر و بهتری داره رو در جدول اولویت بندی میکنه. این عملیات حتما باید بصورت cron jobs نوشته بشه و نمیشه همزمان که کاربر درخواست اتصال به بانک رو میزنه این عملیات سنگین رو انجام داد. این سیستم رو شما خودتون میتونید با کمی کدنویسی انجامش بدید. پیروز باشید
برای دریافت رسپانس تایم این سه درگاه از کد زیر استفاده کرده ام، حالا این سوال رو از دوستان و همچنین از آقای پاکدامن رو داشتم اینکه این کد درست هست؟ و آدرسهایی که باید قرار داده بشه همین آدرسهای شاپرک باید باشه؟
//$url = “https://sadad.shaparak.ir/services/MerchantUtility.asmx?wsdl”;
//$url = “https://pec.shaparak.ir/pecpaymentgateway/eshopservice.asmx?wsdl”;
$url = “https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl”;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(curl_exec($ch))
{
$info = curl_getinfo($ch);
$ResponsTime = $info[‘total_time’].’ ثانیه’;
}
curl_close($ch);
if(isset($ResponsTime)) return $ResponsTime;
با تشکر
سلام . بله این جوری بنویسیدش :
———-
function getAvailableBank($random=true){
$urls[] = [‘sadad’,’https://sadad.shaparak.ir/services/MerchantUtility.asmx?wsdl’];
$urls[] = [‘parsian’,’https://pec.shaparak.ir/pecpaymentgateway/eshopservice.asmx?wsdl’];
$urls[] = [‘mellat’,’https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl’];
if($random)
shuffle($urls);
foreach($urls as $url){
$ch = curl_init($url[1]);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
if(curl_exec($ch))
{
$info = curl_getinfo($ch);
$ResponsTime = $info[‘total_time’].’ ثانیه’;
}
curl_close($ch);
if(isset($ResponsTime)) return $url;
}
}
print_r( getAvailableBank());
سلام
با تشکر از پکیج خوبی که درست کردید . من تمامی مراحل گفته شده رو درست انجام دادم و جدول ها هم ساخته شد اما مشکلی که الان وجود داره این هست که در زمان اتصال به درگاه پرداخت با این خطا مواجه میشم .
Unmarshalling Error: For input string
با سلام . از چه درگاهی بانکی استفاده میکنید ؟
لطفا یه بررسی کنید ببینید چه نوع اکسپشنی رخ داده اینجوری بهتر میتونیم خطا رو دنبال کنیم . تو همین آموزش گفته شده چجور Exception تفکیک کنیم .
سلام مهندس.میشه توضیح بدین که مثلا کاربر بخواد ۵۰۰۰ هزار تومان واریز کنه کدش دقیقا چی میشه؟ یکم گنگ شدم. خیلی ممنونم
سلام . همین مراحلی که گفتم رو باید دنبال کنید فقط این خط رو
Gateway::make(new Larabookir\Gateway\Mellat\Mellat());
بجاش
Gateway::make(new Larabookir\Gateway\Zarinpal\Zarinpal());
قرار بدید .
مبلغ رو هم که طبق معمول تو همون تابع price ست کنید.
موفق باشید
میدونم که این کد باید باشه. Gateway::make(new Larabookir\Gateway\Zarinpal\Zarinpal());
منظورم اینه باید بجای ۱۰۰۰ یه متغییر قرار داد؟ $gateway->price(1000)->ready();
که توش قیمت هرکالایی هست؟
در قسمت youre code here معمولا چه کدی مینویسن؟
ببخشید که سوالات مبتدی هستن. باتشکر
در این قسمت ID تراکنش ایجاد شده در جدول payments رو میگیریم و در جدول سفارشاتمون ذخیره میکنیم . با این کار داریم میگیم این سفارشی که ایجاد شده تراکنش بانکیش اینه …
در حقیقت شما باید یه ریلیشن بین جدول سفارشات و جدول تراکنش هاتون داشته باشید . با اینکار خیلی راحت میتونید چک کنید این سفارش تراکنشش پرداخت شده یا خیر.
معلومه که میشه. هر کاری تو برنامه نویسی شدنیه. 🙂
مثلا با درگاه زرین پال
سلام مهندس جان
یه سوال.
callback-url رو در فایل gateway.php چی باید وارد کنیم؟
با سلام .
در اصل باید آدرسی باشه که بانک بعد از اتمام عملیات خرید ، کاربر رو به این صفحه ارجاع میده و ما تو این صفحه اطلاعات خرید رو از بانک میگیرم و در بانک اطلاعاتی ذخیره میکنیم . مثلا اگر کاربر درخواست خرید محصولی رو داشته ما در این محله باید محصول رو به کاربر ارائه کنیم .
توی همین آموزش جایی که باید شما محصول رو به کاربر ارائه بدید رو مشخص میکنم براتون .
———————-
callback-url رو در فایل gateway.php چی باید وارد کنیم؟
تو این مثالی که من گفتم این آدرس callback/from/bank باید ست بشه .
وجود افرادی مثل شما باعث افتخار ماست.
ممنون از کمک های بی دریغتون
خواهش میکنم . وجود انسان های نازنینی مثل شما هم باعث دلگرمی ما هست . ممنون که با نظر های مثبتتون به ما انرژی میدید . سایتون کم نشه 🙂
اقای پاکدامن من تست کردم همه چی درست بود. price رو با متغیر set کردم و میره در دیتابیس میگرده و اگر کالایی با اون ایدی مشخص شده موجود بود درخواست میده برای بانک و میره تو صفحه پرداخت زرین پال. حالا تا اینجا همچی درسته. ولی وقتی انصراف از پرداخت رو میزنم call-back که میکنه به سایت خودم خطا میده (MethodNotAllowedHttpException in RouteCollection.php line 219)
ولی وقتی روت post رو به get تغییر میدم exception رو برمیگردونه و کار میکنه. مشکل از چیه بنظرتون؟ خود زرین پال فکر کنم با get کالبک کنه. ممنون میشم راهنمایی کنید
یه سوال دیگه. اگر با متد get , به سایت خودمون call-back کنیم اینجا امنیت پرداخت به خطر نمیفته؟
نه مشکلی نداره . همون متد پست هم نا امن هست . برای اینکه امنیت ایجاد بشه خود سیستم یه بار صحت داده ها رو با بانک بررسی میکنه . اگر با متد get کار کنه مشکلی نیست .
احتمالا زرین پال با GET کال بک میکنه . من اکانت زرین پال ندارم . اگر میتونید API/KEY حساب زرین پالتون رو بدید تا از اینجا تست کنم و مشکل رو برطرف کنیم .
اگر exception بر میگردونه .. پس چطور کار میکنه ؟! چه exception ی بر میگردونه ؟
چون انصراف از پرداخت رو میزنم exception :
تراکنش ناموفق میباشد #-۲۲
رو برمیگردونه
سلام
من به هر روشی که میخوام آبجکت بسازم
مثلا اینطوری
$gateway = Gateway::mellat();
این ارورو میده
ReflectionException in Container.php line 734:
Class gateway does not exist
اینجوری هم کار نمیکنه
$gateway = Gateway::make(new Larabookir\Gateway\Mellat\Mellat());
کلا همه روشهارو امتحان کردم بازم نشد
چون شما Facad رو توی آرایه aliases در فایل app.php وارد نکردید .
کارتون عالیه آقای پاکدامن
سلام ممنون بابت ساخت این پست
من با پی لاین تست زدم و به بانک وصل میشه اما وقتی برگشت رو میزنی وقتی روت post باشه این خطا رو میده:
این آدرس بار مرورگر:
http://localhost:81/laravel/public/callback/from/bank?transaction_id=1465734204&_token=XzL2a2GwVOHwtcJhFQS66HWC4Ho7DHAMc831Ql6i
اینم خطای مربوطه:
Whoops, looks like something went wrong.
MethodNotAllowedHttpException in RouteCollection.php line 218:
بعد وقتی get میکنم پیغام میده چنین تراکنشی وجود ندارد 🙁 😐
سلام . پیلاین رو مگه فیلتر نکردن ؟
اقای پاکدامن عزیز
بسیار بسیار ممنون و مچکر بابت همچین پکیجی که طراحی کردید. بسیار عالی است و ممنون از شما
بنده هم با فریم ورک لاراول کار میکنم و در هر زمینه ای با کمال میل شما را در توسعه آن همیار خواهم بود
با سلام ، بسیار خوشحال میشیم اگر شما هم بتونید توی توسعه این پکیج به ما کمک کنید و قطعا هر عمل خیر خواهانه و ، نتیجه مثبتی داره که در دراز مدت به خود آنسان باز میگرده . این پکیج قسمت های داره که هنوز به خوبی تست نشدن مثلا با درگاه زرین پال یه خورده مشکلاتی داره و همچنین بانک ملی (سداد) و همچنین برای بانک سامان هم باید ایجاد بشه . خوش حال میشیم بتونید شما هم با ما در این مشارکت سهیم بشید . در صورت امکان به بنده ایمیل بزنید با تشکر .
iraitc@gmail.com
از کجا مطمئن شیم این پکیج امن هست !!
با سلام . این پکیج از یک بکیج دیگری مشتق شده است که افراد زیادی توی اون همکاری کردن و ما کمی اون رو مطابق با لاراول تغییر دادیم . کلا این پکیج با توجه به داکیومنت بانک ها و مسایل امنیتی اونها نوشته شده و کاملا سورسش خوانا هست شما میتنید چند تا فایلی که توش هست رو بررسی کنید .
سلام
این پکیج احتمالا کپی شده https://github.com/PoolPort/PoolPort این نیست؟
سلام . بله ما هم اشاره کردیم که از پکیج poolport استفاده کرده ایم . ولی همانطور که گفته شده برای لاراول نوشته شده و معماری اون هم کمی تغییر کرده .
بی نهایت سپاس
با سلام
وقتی بخواییم دستی به درگاه وصل شیم باید nusoap رو به پروژه اضافه کنیم
تو این روشی که شما زحتش رو کشیدید که همچین چیزی لازم نیس ؟
ضمنن nusoap که توسط بانک ملت در سال ۲۰۰۷ (۱۰سال قبل ) نوشته شده تمامی فریمورک ها به کدهاش ایراد میدن و بانک ملت حرفه ای ترین جوابش اینه که ۲۰ هزار نفر دارن ازش استفاده میکنن و مشکلی نداره و خدا برا بندگان صالحش فرستاده
😐
سلام. بله متاسفانه فقط بانک ملت هست که پکیج nusoap رو دستکاری کرده و تو اکثر پروژه ها مجبوریم یه nusoap هم مخصصوص بانک ملت قرار بدیم . ولی ما به صورت built-in داخل این پکیج گذاشتیمش و شما لازم نیست اون رو اد کنید.
با سلام ، بعد از بازگشت نا موفق کاربر از درگاه Exceptionها به درستی نمایش داده نمیشن و با صفحه پیش فرض ارور مواجه میشم با این متن ” MellatException in Mellat.php line 154: کاربر از انجام تراکنش منصرف شده است ” چرا catch ها به درستی کار نکردن ؟؟ممنون میشم اگر راهنمایی کنید
با سلام . مشکل شما اینه که از exception مختص به خودش استفاده نمی کنید . برای این منظور شما باید این دستور رو برای دریافت کردن exception های بانک ملت استفاده کنید :
try{
…
} catch (MellatException $e) {
echo $e->getMessage();
}
سلام مدیران سایت من یک سوال داشتم میدونم جاش در این قسمت نیست ولی فوری به کمک دارم من چطوری میتونم در لاراول از بوت استرپ استفاده کنم اگر خواهش مقاله ای چیزی دارید معرفی کنید در غیر اینصورت خودتان کمکم کنید. موفق باشید
با سلام . شما فقط کافیه فایل (css,js) بوت استرپ رو تو فولدر public بگذارید بعد تو فایل blade اونها رو لود کنید به همین سادگی.
با سلام ممنون از پاسخ تون بازم متوجه نشدم در داخل لاراول یک پوشه است بنام بوت استرپ در داخل این پوشه دوتا فایل هست بنام های اپ و آوتولود و پوشه کش چیزی بنام سی اس اس دات جی اس نیست.حالا سوالم این است آیا کل بوت استرپ را از سایتش دانلود کنم بزارم تو پروژه لاراولم و مثل پروژه های عادی ازش استفاده کنم یا تنها فایل (css.js) را از سایت دانلود کنم تو پوشه پابلیک بزارم بعد ازش استفاده کنم و نیازی به دانلود بوت استرپ نیس خودش داخل لاراول موجود است. بازم ممنون
دوست عزیز اون فولدر بوت استرپ لاراول هیچ ارتباطی با twitter bootstrap نداره .
شما لاراول رو که نصب کردی دستور make:auth رو بزن تا یه سیستم عضویت با تم بوت استرپ برات ساخته بشه بعد اگه کمی بررسیش کنی میفهمی قضیه چیه .
در کل برای هر پروژه بهتره فایل بوت استرپ آخرین ورژنش رو از سایت بوت استرپ بگیری و تو فولدر public بزاری و استفاده کنی
ممنون از پاسخ کامل تون یاد گرفتم
با سلام
قبل از هر چیز بابت آماده کردن این پکیج از تون تقدیر و تشکر میکنم.
من از پکیج شما استفاده کردم و در درگاه بانک ملت هیچ مشکلی نداشتم. ولی الان که دارم اونو به پارسیان وصل میکنم با خطا مواجه شدم. من راحت به درگاه وصل میشم و عملیات انجام میدم ولی موقع برگشت از درگاه با صفحه خطای MethodNotAllowedHttpException in RouteCollection.php line 218: مواجه میشم. توی url وقتی نگاه میکنم میبینم که transaction_id و au مربوط به پارسیان از سمت بانک اومده ولی صفحه بازگشت مشکل داره. روت بازگشت را از حالت post به get تغییر دادم و حالا میتونم au را بگیرم ولی اینبار با خطای ***درگاهی برای تراکنش مورد نظر در سایت یافت نشد*** مواجه میشم و کلا عمل verify را نمیتونم انجام بدم.
توی روت هم که اینجوری به پارسان وصل شدم: $gateway = Gateway::make(new Larabookir\Gateway\Parsian\Parsian());
احیانا نباید جای دیگه هم اینکارو بکنم و به جای ملت پارسان بنویسم که شناسایی کنه. مساله اصلیتر اینه که نوع متد صفحه بازگشت باید از نوع get باشه یا post. برا بانک ملت روی همون post بود و مشکلی ایجاد نشد ولی پارسیان گیر میده. روی get هم میذارم میگه درگاهی یافت نشد.
ممنون میشم راهنماییم کنید که چیکار کنم؟؟؟
با سلام. این مشکل حل شده . شما نوع روت برگشتی از بانک رو any بگذارید مشگل حل خواهد شد.
از مدیر سایت و سایر دوستان ممنون میشم که راهنماییم کنن اشکال درگاه پارسیان پس از برگشت از صفحه درگاه چیه که متد post را نمیشناسه و توی get هم خطای هم میگه درگاهی یافت نشد
پاسخ شما به ایمیلتون ارسال گردید .
با تشکر از زحماتتون
من موقع تعریف gateway ارور Class ‘SoapClient’ not found میگیرم !
مشکل چیه ؟ لاراول ۵.۲ هم استفاده کنیم
همچنین http://packalyst.com/packages/package/artisaninweb/laravel-soap هم تست کردم ولی با یک ارور دیگه مواجه شدم
سلام . به چه درگاهی میخواید وصل شید؟
با سلام
وقتی catch نمایان میشه منظورم اینه که کد ما ایراد میده رو صفحه debug فریمورک ایراد میده
MellatException in Mellat.php line 128:
پذیرنده نامعتبر است #۲۱
خب وقتی سایت اپلود میشه این قسمت رو false میکنیم
نمیشه یه کاریش کرد بره رو صفحه callback ایراد رو نشون بده ؟
این طوری باشه که خریدار نمیفهمه ایرادش چیه
سلام . شما باید با دستور catch اکسپشن مورد نظر رو همانتور که توضیح دادم بگیرید . سپس بجای خطای اکسپشن ، فایل view مورد نظرتونه که متناسب با خطا درگاه طراحی کردید لود کنید .
سلام من سایت خودم را با لاراول نوشتم و با درگاه زرین پال (با نمونه کد استفاده از وب سرویس نوشته شده به زبان PHP )به بانک متصل شدم بعد از خرید وجه به حسابم واریز می شود ولی نمی دونم چطوری کاربر را بعد از پرداخت به صفحه تایید پرداخت هدایت کنم تا شماره و تراکنش پرداخت که درگاه پرداخت میدهد از url گرفته و به کاربر نشون بدم همچنین تو پایگام ذخیره کنم ممنون میشم راهنمایم کنید.
با سلام . لطفا قسمت Gateway::verify را در همین صفحه با دقت بیشتری مطالعه فرمایید . ((ذخیره سازی تایید شدن تراکنش به صورت خودکار انجام میگیرد))
سلام خسته نباشید
من میخاستم ارور ها رو در یک blade نشون بدم
کدها callback رو به این تعغیر دادم ولی مشکل داره؟
کد های من مشکل داره؟
try {
$gateway = Gateway::verify();
$trackingCode = $gateway->trackingCode();
$refId = $gateway->refId();
$cardNumber = $gateway->cardNumber();
Helpers::generate_app_code(Transaction);
$data=”موفق”;
}
catch (RetryException $e)
{
$data=$e->getMessage();
}
catch (PortNotFoundException $e)
{
$data= $e->getMessage();
}
catch (InvalidRequestException $e)
{
$data= $e->getMessage();
}
catch (NotFoundTransactionException $e)
{
$data= $e->getMessage();
}
catch (Exception $e)
{
$data= $e->getMessage();
}
return view(‘callback.callback’,[‘data’=>$data]);
(تشکر بابت سایت خوبتون )
بله مشکلات زیادی داره.
خط ۶ رو جایگزین کنید به :
$transaction = Transaction::find($gateway->transactionId());
Helpers::generate_app_code($transaction);
پشت نام اکسپشن هاتون هم “/” بگذارید . مثلا: /NotFoundTransactionException
سلام ممنون از توضیحات عالی تون
من موقع تعریف gateway ارور Class ‘SoapClient’ not found میگیرم !
لطفا راهنمایی م کنین.
لاراول هم ۵٫۲ است
با سلام .Soap extension بر روی سرور شما نصب نیست و به همین دلیل هست که کار نمیکنه . یه phpinfo بگیرید و چک کنید که آیا Soap نصب است یا خیر.
سلام و عرض خسته نباشید
دمتون گرم پکیج بسیار خوبی نوشتید ممنون بابت زحمتی که کشیدید
FatalErrorException in Mellat.php line 114: Class ‘SoapClient’ not found
با سلام .Soap extension بر روی سرور شما نصب نیست و به همین دلیل هست که کار نمیکنه .
سلام
ممنون از مطالب مفید و خوبتون
من نصب کردم درگاه رو روی لوکال هاست مشکلی ندارم
ولی وقتی روی هاست آپلود میکنم
یه خطایی میده ک نشناخته فایل ها و کلاسو
لطفا در قسمت issue گیت هاب مطرح کنید مشکلتون رو با تشکر
با سلام
خسته نباشید
ببخشید من از پکیج تون خواستم استفاده کنم از بخش زرین پال که با خطای “کد مرچنت یا ای پی اشتباه می باشد ” برخورد می کنم در حالی که کد رو چک کردم درست بود و ای پی هم اصلا محدودیتی روش نزاشتم و بدون محدودیت هستش
می خواستم ببینم مشکل من چیه؟
لطفا در قسمت issue مطرح کنید مشکلتون رو با تشکر
ما که مطرح کردیم ولی جوابی نگرفتیم
با سلام
این پکیج از لحاظ عملی تست شده ؟ منظور روی سایتی قرار گرفته باشه و استفاده کرده باشن و ایراد نداشته باشه
——–
وقتی از بانک تموم شدیم بانک یه post برامون ارسال میکنه اون اطلاعات شامل چه مواردی میشه ؟
یکی از راه های هک فروشگاه اینه کاربر بیاد موقع فرستادن قیمت به بانک ۱۰ هزار رو یکنه ۱ تومن و در این حالت تو دیتابیس ما ۱۰ هزار درج خواهد شد ولی ۱ هزار واریز شده
بانک باید مقدار واریزی رو برا ما بفرسته تا در صورت برابر بودن با قیمت اولیه خرید موفقیت امیز اعلام بشه
سلام، ببخشید آقای پاکدامن، بنده چند تا سوال داشتم، ممنون می شم پاسخ بدید :
۱٫ بنده می خوام تست کنم درگاه پرداخت رو، وقتی در کد اول وقتی از Get استفاده می کنم، ارور می ده NotAllowedException، البته دارم یک مقدار رو هم ارسال می کنم، به خاطر همون از Post وقتی استفاده می کنم، درست می شه، مشکلی نداره ؟
۲٫ بنده از زرین پال استفاده می کنم، به من گفتن باید از آدرس زیر برای SandBox استفاده کنی، این رو به جای اون دو تا آدرس callback/from/bank استفاده کنم ؟ تشکر از شما …
https://www.zarinpal.com/pg/services/WebGate/wsdl
این آدرس رو عرض می کنم …
یک سوال هم داشتم، پس از اینکه پرداخت نهایی شد، حتما خود زرینپال یک صفحه عقب می فرسته یا می تونم یک صفحه خاص رو انتخاب کنم ؟
ببخشید به خدا زیاد سوال می پرسم …
سلام آقا پاکدامن، بنده به درستی نصب کردم پکیج شما رو و وقتی برای تست وارد بخش SandBox می شم، دو تا دکمه موفق و ناموفق داره برای تست درگاه …
روی هر کدوم که کلیک می کنم یک فایل XML نشون می ده … همین …
در حالی که قیمت و توضیحات کاملا درست هستند …
مشکل از کجاست ؟
سلام
من توی لکال هاست جواب میگیرم ولی توی سرور خطای HTTP ERROR 500 بهم میده ! همون کد ها و همون فایل ها و تنظیمات !
لاراول ۵٫۳ با پی اچ پی ۵٫۶ و سرور هم سنتوس ۷ هست !
خطا از چی میتونه باشه ؟
echo “hi”;
$gateway = Gateway::zarinpal();
$gateway->setCallback(url(‘qasem/payment’));
$gateway->price(1000)->ready();
$refId = $gateway->refId();
$transID = $gateway->transactionId();
echo $gateway->transactionId();
این کد در لکال (لاراول ۵٫۲) transactionId رو چاپ میکنه ولی در سرور (لاراول ۵٫۳) خالیه صفحه !
ممنون . راهنمایی لطفاً ! از چی میتونه باشه ؟ 🙁
یه چیز دیگه
echo “hi”;
$gateway = Gateway::zarinpal();
$gateway->setCallback(url(‘qasem/payment’));
echo “hi”;
توی این چهار خط کد ، hi دوم چاپ نمیشه !
try catch هم نمیتونم استفاده کنم چون خطای HTTP ERROR 500 میاد !
واقعاً نمیدونم چه اتفاقی داره میفته !
ببخشید بازم کامنت گذاشتم ، مشکل try catch رو حل کردم ولی همچنان مشکل اول پا برجاست 🙁
یه سرور دیگه داشتم با لاراول ۵٫۲ و php 5.6 . اون مشکل نداره ! پس هر چی هست ایراد از ناخوانایی با لاراول ۵٫۳ هست ! لطفاً رسیدگی کنید و خبرشو بدید . ممنون . دیگه واقعاً زیاد کامنت گذاشتم 😐 😀
سلام، من این پک و روی لاراول ۵.۳ نصب کردم، تنظیمات انجام دادم، اما
General error: 1364 Field ‘ref_id’ doesn’t have a default value (SQL: insert into
gateway_transactions
(id
,port
,price
,status
,ip
,created_at
,updated_at
) values (1476898484, MELLAT, 1000, INIT, 151.177.65.157, 2016-10-19 21:04:44, 2016-10-19 21:04:44))این ارور رو دارم
سلام درگاهتون عالیه
فقط من میخام چنتا فیلده دیگه تو جدولم تزریق کنم مثل user_id کجا باید اینکارو بکنم؟
خیلی هم عالی، مرسی و خسته نباشید ♥
سلام جناب حامد پاکدامن
خواستم از شما تشکر کنم که وقت خودتون برای کمک به سایر دوستان برنامه نویس می گذارید و چند روز کار برنامه نویسی را با یک پست عالی به چند ساعت تبدیل می کنید.
ای کاش تمام دوستان برنامه نویس به این سطح برسند که اشتراک گذاری آموزش برنامه نویسی و پکیج های عمومی باعث عقب افتادگی نمی شود بلکه باعث رشد و اعتلای شخص برنامه نویس شده همین طور که در بخش مشکلات githup و کامنت های این پست مشاهده می کنید چند باگ وجود داشت که شاید تمامی این ها در صورت عدم اشتراک گذاری پیدا نمی شد.
باز هم شخص شما تشکر می کنم و انشااله همیشه موفق باشید.
درود بر شما. از شما بسیار ممنونم که زحمت کشیدید و چنین بسته پر کاربردی را در دسترس ما قرار دادید. دوچار مشکلی در استفاده از این بسته شده ام که اینجا عرض میکنم :
۱ – در فایل کانفیگ اطلاعات مربوط به زرین پال به قرار زیر است:
‘zarinpal’ => [
‘merchant-id’ => ‘xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx’,
‘type’ => ‘zarin-gate’, // Types: [zarin-gate || normal]
‘callback-url’ => ‘/home’,
‘server’ => ‘germany’, // Servers: [germany || iran || test]
’email’ => ‘xxxxx@gmail.com’,
‘mobile’ => ‘123456789’,
‘description’ => ‘description’,
],
آیا نباید جایی برای ورود آی دی و پسورد آن حساب هم وجود داشته باشد؟
۲ – من در حال ساخت و تست وب سایت خود هستم و این تست تا به حال در local host صورت گرفته است. حالا پیام خطایی به شرح زیردریافت میکنم:
SQLSTATE[HY000]: General error: 1364 Field ‘ref_id’ doesn’t have a default value (SQL: insert into
gateway_transactions
(id
,port
,price
,status
,ip
,created_at
,updated_at
) values (1478162642, ZARINPAL, 3000, INIT, 127.0.0.1, 2016-11-03 12:14:02, 2016-11-03 12:14:02))آیا دلیل این خطا همین است که عملیات از طریق یک وب سایت آنلاین صرت نمیگیرد؟ آیا راهی برای انجام تست از طریق لوکال هاست برای من وجود دارد؟
صمیمانه از شما سپاسگذارم.
سلام . فیلد ref_id را از تو دیتابیس به nullable تغییر دهید تا مشکلتون حل بشه
خیلی ممنونم. مشکل حل شد.
سلام وقت بخیر
از شما بابت این بسته با ارزش تشکر میکنم
میخواستم از شما بپرسم چطور میشه مکانیزمی همانند نماد الکترونیکی طراحی کرد؟
من برای سایت های عضو معتبر نیاز به صدور نماد دارم ولی عملکردش رو نمیدونم چگونه باید طراحی کرد
من route به نام -verified طراحی کردم نمیدونم چطوری میشه از وبسایت عضو این route رو خوند با استفاده از
ممنون میشم اگه سوالمو پاسخ بدید
سلام مجدد ،
آیا امکان استفاده از این افزونه تحت شرایط لوکال هاست هم وجود دارد؟ اگر بله مقادیر فایلهای کانفیگ یا روتر برای config شدن باید چه باشد؟ آدرس بار بنده فقط مقدار رو به رو را برگشت میدهد :
http://localhost/PaymentSuccessfulController?transaction_id=1478690760&_token=xzr6KVQ5NJWjLNtvxAKS44Jad3ciOQwN5KeEHiIL&Authority=000000000000000000000000000027760208&Status=OK
برای اینکه درست کار کند باید به پورت ۸۰۰۰ رجعت کند که نمیکند.
در فایل config/gateway.php آورده ام:
‘callback-url’ => ‘http://localhost:8000/PaymentSuccessfulController’,
همین مقادیر را در web.php هم آورده ام !
جالب این جاست که پس از redirect باید localhost:8000 را دستی وارد کنم تا کار کند !!!!!!
با سلام
خواستم ببینم ایا این پکیچ روی لوکال هم کار میکنه؟
چون من روی لوکال تست کردم ارور میده
$gateway = \Gateway::Zarinpal();
$gateway->setCallback(url(“callback/from/bank/$order->product_key”));
$gateway->price($total)->ready();
$refId = $gateway->refId();
$transID = $gateway->transactionId();
return $gateway->redirect();
اینم کدم.
با سلام
من میخوام با ایجکس درخواست بررسی رو بفرستم اگه موفقیت آمیز بود ریدایرکت کنه به زرین پال
اما متاسفانه $gateway->redirect() رو که میزنم بهم لینک ریدایرکت رو بر نمی گردونه
ممنون میشم در این مورد کمکم کنید
عالیههههههه هرچه قدر تشکر کنم بابت این پکیج کمه
سلام ، مهندس قدر خودت رو بدون مثل شما کم پیدا میشه !
دستت درد نکنه عالی بود
واقعا عالیه
سلام اقا حامد
هنگام ریکوییست به زرین پال FatalThrowableError in Zarinpal.php line 182:
Class ‘SoapClient’ not found این ارور رو میده؟؟؟
با سلام خدمت آقای پاکدامن
آقای پاکدامن آیا اینکه با متد get به بانک ریدایرکت کنیم خطرناک نیست؟
با این روش هکز میتونه حمله csrf داشته باشه. نظر شما چیه؟
سلام خسته نباشی مهندس
Cannot use isset() on the result of an expression (you can use “null !== expression” instead) in C:\xampp2\htdocs\index.php on line 2 به این ارور خوردم تو سایتم زمان برگشت از درگاه میشه راهنماییم کنی
ببخشید مهندس الان داشتم چک میرکدم دیتا بیسمو متوجه شدم ک فیلد های tracking_code و status رو مقدارشونو null ثبت میکنه درس هس یا ن ؟ اگه ن مشکل چیه و راه حلش اگه بهم بگین مهندس با تشکر
سلام من فیلد orderid بانک ملت رو میخوام چون ارور ۴۲۱ گرفتم ( آیپی نامعتبر ) حالا بانک میگه orderid به ما بگو تو این کد فکر نمیکنم orderid ذخیره کنید درسته ؟
مشکلم حل شد . orderid شما به اسم transaction_id ذخیره میکنید
آیا با توجه به اینکه استفاده از تایپ enum در جداول مشکلات زیادی در نگهداری و توسعه به دنبال دارد بهتر نبود از همان tinyint(2 استفاده می کردید.
ممنونم بابت مطالب مفیدی که قرار میدید!
باسلام و خسته نباشید خدمت شما دوستان عزیز که زحمت توسعه این پکیج رو کشیدید و از شما سپاس گذار هستم
ولی من برا نصب این پکیج روی لاراول ۵.۳ مشکل دارم من طبق مراحل جلو رفتم ولی بعد از نصب وقتی کامند
php artisan vendor:publish –provider=Larabookir\Gateway\GatewayServiceProvider
پیغام Nothing to publish for tag []. ظاهر میشه پکیج رو چندین بار پاک کردم از اول زدم ولی باز هم همون هست
توی کامنت ها یک راهی برای دوستمون گفته بودید که همین مشکلو داشت اونم رفتم و متغییری که گفته بودید false باید باشه false بود
و اون مراحل رو هم رفتم ولی باز جوابی نگرفتم ممنون میشم راهنمایی کنید چون نیاز دارم بهش ممنون
سلام و خسته نباشید یه مشکلی که بنده پیدا کردم تو برگشت هست یعنی وقتی به صفحه کال بک برمیگرده خطای ۴۰۴ میده و به صفحه ملت لاین ۱۵۴ ایراد میگیره
throw new MellatException($payRequestResCode);
اگه میشه به بنده ایمیل بزنید ممنون میشم
با سلام خدمت همه دوستان بخصوص آقای پاک دامن که زحمت توسعه این پکیج رو کشیدن
من روی لاراول ۵٫۶ وقتی دستور php artisan vendor:publish –provider=Larabookir\Gateway\GatewayServiceProvider رو اجرا می کنم خطای
Call to undefined method Larabookir\Gateway\Gateway::isDeferred()
رو میده
ممنون میشم راهنمایی کنید
با سلام
چرا بعد از ریدایریک شدن به صفحه بانک وقتی روی دکمه انصراف (جهت انصراف از تراکنش) کلیک می کنم به جای اینکه به صفحه سایت خودم برگشت داده شوم دوباره با یه refId جدید به صفحه بانک برگشت داده میشم؟
ممنون راهنمایی کنید