آموزش نوشتن پرداخت آنلاین با لاراول(php laravel) به زبان ساده
خوب شاید برای خیلی از برنامه نویس هایی که تازه به لاراول کوچ کردن یا دوستانی که برای اولین بار می خوان با زبان php و فریم ورک محبوب laravel برای پروژه هاشون پرداخت انلاین بنویسن این مطلب مفید باشه و بتونه راهنماییشون بکنه .
بریم سر اصل مطلب مواد لازم :
برای انجام دادن پرداخت آنلاین و تایید کردن سفارشات مشتریان داخل سایت خودمون ما نیازمند یک کتابخانه از زبان php هستیم به نام Soap که برای استفاده کردنش توی پروژه چند تا راه داریم :
اول : اینکه خودمون این کتابخونه رو از اینجا دانلود کنیم و توی کدمون از استفاده کنیم .
برای این کارم کلاس رو داخل یکی از فولدر های پروژمون که برای نگه داری توابع و کلاس های کمکی هست کپی می کنیم این فولدر توی پروژه های من به اسم Helper هست که حالا با استفاده از namespace اختصاصی خود فایل می تونید توی پروژه ازش استفاده کنید .
روش دوم : نوشتن یک پکیج برای این کار
خوب شاید هم از اون دسته آدم هایی باشید که ترجیح میدن برای همه کتابخونه ها و کلا ابزاراشون یک پکیج بنویسن و حالا مهربوناش می زارن واسه دانلود تا بقیه استفاده کنن اگه جز این دسته دوستان هتسید و زمان و علمش رو دارید این کار رو انجام بدین .
روش سوم : استفاده از پکیج های آماده
یک سری از همون دوست های مهربون پکیج های مورد نیاز ما رو برای این کار نوشتن که من به دوستانی که زمان براشون خیلی اهمیت داره ( مثل خودم ) پیشنهاد می کنم از این پکیج ها استفاده بکنن که در ادامه به نام و ادرس پکیج مناسب اشاره می کنم .
دوستان گرامی پکیج مورد نظر رو از ادرس زیر دریافت کنید
https://github.com/artisaninweb/laravel-soap
و طبق آموزش اون رو نصب کنید .
خوب حالا همه شرایط محیاست برای نوشت درگاه پرداخت آنلاین
نکته : من از استادان و سروران گرامی عذر خواهی می کنم اگه مطالب رو زیاد باز می کنم چون احتمال می دم که برای یک سری از دوستان این مطالب جدید باشه و کمکشون کنه .
تقریبا مکانیزم درگاه نوشت برای همه سیستم های بانکی مشابه هم هست من برای مثال درگاه زرین پال رو توضیح میدم .
البته زرین پال واقعا با اومدنش انتقلابی توی سیستم خرید و فروش و پرداخت های اینترنتی به پا کرد از همین جا به دوست عزیزم مصطفی امیری موسس زرین پال خسته نباشید می گم .
شما با ثبت نام توی زرین پال یا هر درگاه بانکی دیگه یک سری اطلاعات برای شناسایی درگاهتون دریافت می کنید
اولین قدم توی عملیات پرداخت آنلاین احراز هویت با درگاه مورد نظر و دریافت مجوز های لازم برای شروع یک پرداخت انلاین می باشد
ابتدا یک نمونه از وب سرویس درگاه بانکی مورد نظرمون ایجاد می کنیم
برای زیرین پال کد به شکل زیر می باشد
$MerchantID = '54620e4d-0000-40c2-94ea-59f15bef37d4'; // کد اختصاصی درگاه</code></p> <p dir="ltr" style="text-align: left;">$Amount = $order_price; //مقدار سفارش</p> <p dir="ltr" style="text-align: left;">$Description = 'توضیحات خرید ';</p> <p dir="ltr" style="text-align: left;">$Email = $order->email; // آدرس ایمیل خریدار</p> <p dir="ltr" style="text-align: left;">$Mobile = $order->mobile; // شماره همراه خریدار</p> <p dir="ltr" style="text-align: left;">$CallbackURL = 'http://www.ebdali.com/payment/verify/'; // آدرس صفحه بازگشت از خرید اینترنتی</p> <p dir="ltr" style="text-align: left;">// و حالا ایجاد یک نمونه برای پرداخت \SoapWrapper::add(function ($service) { $service ->name('currency') // عنوان نمونه ->wsdl('https://de.zarinpal.com/pg/services/WebGate/wsdl') // آدرس وب سرویس });
بعد از ایجاد نمونه و ارسال اطلاعات شناسای درگاه و سفارش یک پاسخ از وب سرویس برای ما ارسال می شود که آیا مجوز لازم برای شروع پرداخت آنلاین را داریم یا خیر کد زیر مرحله چک کردن دسترسی را نمایش می دهد :
<p dir="ltr"><code> // چک کردن مجوز \SoapWrapper::service('currency', function (Service $service) use ($data) { $service->call('PaymentRequest', [$data]) ; $status = $service->call('PaymentRequest', [$data])->Status ; $Authority = $service->call('PaymentRequest', [$data])->Authority ; </code></p> 1 بعد از اینکه ما اطلاعات رو به وب سرویس فرستادیم درگاه در صورت محیا بودن همه چیز یک پاسخ به درخواست تایید (<code>PaymentRequest</code>) با مقدار 100 و یک کد 16 رقمی که در اصطلاح بهش au میگن رو برای ما ارسال می کنه و ما باید این کد رو در بانک اطلاعاتیمون ذخیره بکنیم تا برای تایید و پیگیری سفارشمون تو مراحل بعد ازش استفاده بکنیم . بعد از ذخیره کردن اطلاعات پرداخت باید کاربر رو به شکل زیر به سایت پرداخت اینترنتی انتقال بدیم. 1> <p dir="ltr"><code> if($status == 100) {</code></p> <p dir="ltr">$this->au = $Authority ; Header('Location: https://www.zarinpal.com/pg/StartPay/'.$Authority); } else { echo'ERR: '.$status; }</p> 1 توجه کنید که کاربر بعد از اتمام مراحل پرداخت با استفاده از همون کد Au به آدرسی که ما برای برگشت پرداخت تعریف کردیم منتقل میشه حالا نوبت به این می رسه که ما چک کنیم که آیا کاربر عملیات پرداخت رو با موفقیت انجام داده یا خیر به شکل زیر این کار رو انجام میدیم : این عملیات در صفحه بازگشتی انجام می شود . من برای مثال کد یکی از پروژه های خودمو قرار میدم : 1 <p dir="ltr"><code> $Authority = $this->input->get('Authority'); // دریافت کد شناسایی ارسال شده $Status = $this->input->get('Status'); // دریافت وضعیت ارسال شده </code></p> <p dir="ltr">if(!empty($Authority)){ // چک کردن اینکه سفارشی با این کد شناسایی در سیستم ما موجود می باشد یا خیر</p> <p dir="ltr">if (is_null($this->payment->findBy('au',$Authority))) { $this->app->abort(404); }</p> <p dir="ltr">$this->thisPayments =$payment = $this->payment->findBy('au',$Authority); // دریافت اطلاعات سفارش در سیستم سایت خودمان</p> <p dir="ltr">$Amount = $payment->amount; // دریافت اطلاعات قیمت این سفارش</p> <p dir="ltr">if($Status == 'OK'){ // // Add a new service to the wrapper \SoapWrapper::add(function ($service) { $service ->name('currency') ->wsdl('https://de.zarinpal.com/pg/services/WebGate/wsdl') ->trace(true) // Optional: (parameter: true/false) /* ->header() // Optional: (parameters: $namespace,$name,$data,$mustunderstand,$actor) ->cookie() // Optional: (parameters: $name,$value) ->location() // Optional: (parameter: $location) */ ->cache(WSDL_CACHE_NONE) // Optional: Set the WSDL cache ->options(['password' => 'password']); // Optional: Set some extra options });</p> <p dir="ltr">$data = [ 'MerchantID' => $this->MerchantID, 'Authority' => $Authority, 'Amount' => $Amount ];</p> <p dir="ltr">// Using the added service \SoapWrapper::service('currency', function (Service $service) use ($data) {</p> <p dir="ltr">$service->call('PaymentVerification', [$data]) ;</p> <p dir="ltr">$chk_status = $service->call('PaymentRequest', [$data])->Status ;</p> <p dir="ltr">$RefID = $service->call('PaymentRequest', [$data])->RefID ;</p> 1 خوب بعد از تایید گرفتن از پرداخت موفق نوبت به این میره که سفارش کاربر رو تایید بکنیم و مابقی داستان . </pre> <pre>1</pre> <pre><p dir="ltr">if($chk_status == 100){ echo 'پرداخت با موفقیت انجام شد کد رهگیری '. $RefID; $this->changeOrederStatus($this->thisPayments->order_id);</p> <p dir="ltr">return $this->redirect->route('tickets.Print',$this->thisPayments->order_id) ->with('success', 'چاپ بلیت');</p> <p dir="ltr">} else { echo 'عملیات نا موفق '. $chk_status; }</p> <p dir="ltr">});</p> <p dir="ltr">}else { echo 'عملیات پرداخت انجام نشد !'; } }</p>
امیدوارم این مطلب حد اقل به درد ۱ نفر بخوره همون برای من کافیه .
سلام
مطلب مفیدی بود ، ممنونم
اگر امکانش هست برای در گاه پارس پال نیز توضیح دهید .
با تشکر
سلام دوست عزیز !
برای درگاه پارس پال هم تقریبا همین روال رو باید انجام بدیم با کمی تغییر که توضیح می دم خدمتتون
آدرس وب سرویس را به آدرس زیر تغییر دهید
http://merchant.parspal.com/WebService.asmx?wsdl
توجه داشته باشید که برای تایید وب سرویس مقدار Succeed را برمیگرداند .
موفق باشید
مطالبی که درمورد پرداخت آنلاین با لاراول نوشتین خیلی کمکم کرد.ممنون
سلام، من تا حالا به درگاه بانکی وصل نشدم، حتی با php flat.
با لاراول 4.1 کد میزنم و با استفاده از
github.com/moltin/laravel-cart
صرفا سبد خرید رو پیاده سازی کردم و محتویاتش رو در جدولی بنام factor در DB ذخیره کردم و در آخر بوسیله ی join جدول ها ، نام محصول و تعداد و … سفارش رو برای کاربر در پروفایلش نمایش میدم. ممنون میشم اگه برای اتصال از طریق شاپرک راهنماییم کنید.
سلام و احترام !
شما یک فیلد با عنوان وضعیت پرداخت به جدول فاکتور (از نوع عددی) اضافه کنید با مقدار پیش فرض 0 !
یک جدول با عنوان Payment ایجاد کنید به شکل زیر :
factor_id : شماره فاکتوری که خودوتون ایجاد کردین
Au : کد احراز هویت با درگاه که در مرحله اول اتصال به وب سرویس به شما دهده می شود
transaction_id : کد تراکنشی که بانک بعد از پرداخت به شما می دهد
status : وضعیت پرداخت این فاکتور ( پرداخت شده / در مراحل پرداخت / پرداخت نشده )
+ ما بقی فیلد های مورد نیاز
بعد از پایان مراحل مقدار فیلد وضعیت پرداخت در جدول فاکتور را به حالت پرداخت شده تغییر دهید .
خیلی خیلی ممنون از اینکه وقت گذاشتید و جواب دادید.
موفق باشید