یلدا ادامه داره... ❤️ ۴۰ درصد تخفیف همه دورهها
استفاده از تخفیفهاسلام میخوام یه پکیج بهترون معرفی کنم که برای پرداخت آنلاین توسط درگاه های مختلف در لاراول ایجاد شده. شما با استفاده از این پکیج میتونید به درگاه های مختلف دسترسی داشته باشید بدون اینکه بخواید بعدا با تغییر درگاه باز کدتون رو تغییر بدید! تنها کاری که برای تغییر درگاه میکنید اینه که داخل تنظیمات اسم اون درگاه رو به صورت دیفالت قرار میدین.
لینک گیت هاب پکیج به صورت زیر هست
https://github.com/shetabit/payment
همچنین لینک پکیجیست به صورت زیره
https://packagist.org/packages/shetabit/payment
این پکیج نمره A و گرید ۱۰ گرفته . خوشحال میشم ازش استفاده کنید و همچنین معرفی کنیدش و درایورهاشو برای بانک های مختلف توسعه بدید تا یه پکیج یکپارچه برای بانک های ایران به وجود بیاد همچنین قانون SOLID با استفاده از این پکیج حفظ میشه یعنی اینکه بعدا اگه بانک رو خواستید عوض کنید دیگه کدهای قبلی رو که نوشته شده دست نمیزنید و فقط درایور بانک جدید رو قرار میدین. (مثل سیستم فایل لاراول یا سیستم کش لاراول که به صورت درایوری کار میکنه)
اگه از این پکیج استفاده کردین و خوشتون اومد بهش استار بدین. :)
این پکیج با درگاه های پرداخت مختلفی کار میکنه. در صورتی که درگاه مورد نظرتون رو در لیست درایورهای موجود پیدا نکردید میتونید برای درگاهی که استفاده میکنید درایور مورد نظرتون رو بسازید.
در صورتی که درایور مورد نظرتون موجود نیست, میتونید برای درگاه پرداخت موردنظرتون درایور بسازید.
نصب با استفاده از کامپوزر
$ composer require shetabit/payment
درصورتی که از Laravel ۵.۵
یا ورژن های بالاتر استفاده میکنید نیازی به انجام تنظیمات providers
و alias
نخواهید داشت.
درون فایل config/app.php
دستورات زیر را وارد کنید
# In your providers array.
'providers' => [
...
ShetabitPaymentProviderPaymentServiceProvider::class,
],
# In your aliases array.
'aliases' => [
...
'Payment' => ShetabitPaymentFacadePayment::class,
],
سپس دستور php artisan vendor:publish
را اجرا کنید تا فایل config/payment.php
درون دایرکتوری تنظیمات لاراول قرار بگیرد.
درون فایل تنظیمات در قسمت default driver
میتوانید درایوری که قصد استفاده از ان را دارید قرار دهید تا تمامی پرداخت ها از آن طریق انجام شود.
// Eg. if you want to use zarinpal.
'default' => 'zarinpal',
سپس تنظیمات مرتبط با درایوری که قصد استفاده از ان را دارید انجام دهید
'drivers' => [
'zarinpal' => [
// Fill all the credentials here.
'apiPurchaseUrl' => 'https://www.zarinpal.com/pg/rest/WebGate/PaymentRequest.json',
'apiPaymentUrl' => 'https://www.zarinpal.com/pg/StartPay/',
'apiVerificationUrl' => 'https://www.zarinpal.com/pg/rest/WebGate/PaymentVerification.json',
'merchantId' => '',
'callbackUrl' => 'http://yoursite.com/path/to',
'description' => 'payment in '.config('app.name'),
],
...
]
در تمامی پرداخت ها اطلاعات پرداخت درون صورتحساب شما نگهداری میشود. برای استفاده از پکیج ابتدا نحوه ی استفاده از کلاس Invoice
به منظور کار با صورتحساب ها را توضیح میدهیم.
قبل از انجام هرکاری نیاز به ایجاد یک صورتحساب دارید. برای ایجاد صورتحساب میتوانید از کلاس Invoice
استفاده کنید.
درون کد خودتون به شکل زیر عمل کنید:
# On the top of the file.
use ShetabitPaymentInvoice;
...
# create new invoice
$invoice = new Invoice;
# set invoice amount
$invoice->amount(۱۰۰۰);
# add invoice details : we have ۴ syntax
// ۱
$invoice->detail(['detailName' => 'your detail goes here']);
// ۲
$invoice->detail('detailName','your detail goes here');
// ۳
$invoice->detail(['name۱' => 'detail۱','name۲' => 'detail۲']);
// ۴
$invoice->detail('detailName۱','your detail۱ goes here')
->detail('detailName۲','your detail۲ goes here');
متدهای موجود برای کار با صورتحساب ها:
uuid
: یک ایدی یونیک برای صورتحساب تنظیم میکندgetUuid
: ایدی یونیک صورتحساب را برمیگرداندdetail
: توضیحات یا مواردی که مرتبط به صورتحساب است را به صورتحساب اظافه میکندgetDetails
: تمامی موارد مرتبطی که به صورتحساب افزوده شده است را برمیگرداندamount
: مقدار هزینه ای که باید پرداخت شود را مشخص میکندgetAmount
: هزینه ی صورتحساب را برمیگرداندtransactionId
: شماره تراکنش صورتحساب را مشخص میکندgetTransactionId
: شماره تراکنش صورتحساب را برمیگرداندvia
: درایوری که قصد پرداخت صورتحساب با آن را داریم مشخص میکندgetDriver
: درایور انتخاب شده را برمیگرداندبه منظور پرداخت تمامی صورتحساب ها به یک شماره تراکنش بانکی یا transactionId
نیاز خواهیم داشت.
با ثبت درخواست به منظور پرداخت میتوان شماره تراکنش بانکی را دریافت کرد:
# On the top of the file.
use ShetabitPaymentInvoice;
use ShetabitPaymentFacadePayment;
...
# create new invoice
$invoice = (new Invoice)->amount(۱۰۰۰);
# purchase the given invoice
Payment::purchase($invoice,function($driver, $transactionId) {
// we can store $transactionId in database
});
# purchase method accepts a callback function
Payment::purchase($invoice, function($driver, $transactionId) {
// we can store $transactionId in database
});
با استفاده از شماره تراکنش یا transactionId
میتوانیم کاربر را به صفحه ی پرداخت بانک هدایت کنیم:
# On the top of the file.
use ShetabitPaymentInvoice;
use ShetabitPaymentFacadePayment;
...
# create new invoice
$invoice = (new Invoice)->amount(۱۰۰۰);
# purchase and pay the given invoice
// you should use return statement to redirect user to the bank's page.
return Payment::purchase($invoice, function($driver, $transactionId) {
// store transactionId in database, we need it to verify payment in future.
})->pay();
# do all things together a single line
return Payment::purchase(
(new Invoice)->amount(۱۰۰۰),
function($driver, $transactionId) {
// store transactionId in database.
// we need the transactionId to verify payment in future
}
)->pay();
بعد از پرداخت شدن صورتحساب توسط کاربر, بانک کاربر را به یکی از صفحات سایت ما برمیگردونه و ما با اعتبار سنجی میتونیم متوجه بشیم کاربر پرداخت رو انجام داده یا نه!
# On the top of the file.
use ShetabitPaymentFacadePayment;
use ShetabitPaymentExceptionsInvalidPaymentException;
...
# you need to verify the payment to insure the invoice has been paid successfully
// we use transaction's id to verify payments
// its a good practice to add invoice's amount.
try {
Payment::amount(۱۰۰۰)->transactionId($transaction_id)->verify();
...
} catch (InvalidPaymentException $exception) {
/**
when payment is not verified , it throw an exception.
we can catch the excetion to handle invalid payments.
getMessage method, returns a suitable message that can be used in user interface.
**/
echo $exception->getMessage();
}
در صورتی که پرداخت توسط کاربر به درستی انجام نشده باشه یک استثنا از نوع InvalidPaymentException
ایجاد میشود که حاوی پیام متناسب با پرداخت انجام شده است.
برای ایجاد درایور جدید ابتدا نام (اسم) درایوری که قراره بسازید رو به لیست درایور ها اظافه کنید و لیست تنظیات مورد نیاز را نیز مشخص کنید.
'drivers' => [
'zarinpal' => [...],
'my_driver' => [
... # Your Config Params here.
]
]
کلاس درایوری که قصد ساختنش رو دارید باید کلاس ShetabitPaymentAbstractsDriver
رو به ارث ببره.
به عنوان مثال:
namespace AppPackagesPaymentDriver;
use ShetabitPaymentInvoice;
use ShetabitPaymentAbstractsDriver;
use ShetabitPaymentExceptionsInvalidPaymentException;
class MyDriver extends Driver
{
protected $invoice; // invoice
protected $settings; // driver settings
public function __construct(Invoice $invoice, $settings)
{
$this->invoice($invoice); // set the invoice
$this->settings = (object) $settings; // set settings
}
// purchase the invoice, save its transactionId and finaly return it
public function purchase() {
// request for a payment transaction id
...
$this->invoice->transactionId($transId);
return $transId;
}
// redirect into bank using transactionId, to complete the payment
public function pay() {
// its better to set bankApiUrl in config/payment.php and retrieve it here:
$bankUrl = $this->settings->bankApiUrl; // bankApiUrl is the config name.
//prepare payment url
$payUrl = $bankUrl.$this->invoice->getTransactionId();
// redirect to the bank
return redirect()->to($payUrl);
}
// verify the payment (we must verify to insure that user has paid the invoice)
public function verify() {
$verifyPayment = $this->settings->verifyApiUrl;
$verifyUrl = $verifyPayment.$this->invoice->getTransactionId();
...
/**
then we send a request to $verifyUrl and if payment is not
we throw an InvalidPaymentException with a suitable
**/
throw new InvalidPaymentException('a suitable message');
}
}
بعد از اینکه کلاس درایور خودتون رو ایجاد کردید به فایل Config/payment.php
برید و درایور خودتون رو در قسمت map
اظافه کنید.
'map' => [
...
'my_driver' => AppPackagesPaymentDriverMyDriver::class,
]
نکته: دقت کنید کلیدی که قسمت map
قرار میدهید باید همنام با نامی باشد که در قسمت drivers
قرار داده اید.
callbackUrl
: با استفاده از این متد به صورت داینامیک میتوانید ادرس صفحه ای که بعد از پرداخت انلاین کاربر به ان هدایت میشود را مشخص کنید # On the top of the file.
use ShetabitPaymentInvoice;
use ShetabitPaymentFacadePayment;
...
# create new invoice
$invoice = (new Invoice)->amount(۱۰۰۰);
# purchase the given invoice
Payment::callbackUrl($url)->purchase(
$invoice,
function($driver, $transactionId) {
// we can store $transactionId in database
}
);
amount
: به کمک این متد میتوانید به صورت مستقیم هزینه صورتحساب را مشخص کنید # On the top of the file.
use ShetabitPaymentInvoice;
use ShetabitPaymentFacadePayment;
...
# purchase (we set invoice to null)
Payment::callbackUrl($url)->amount(۱۰۰۰)->purchase(
null,
function($driver, $transactionId) {
// we can store $transactionId in database
}
);
via
: به منظور تغییر درایور در هنگام اجرای برنامه مورد استفاده قرار میگیرد # On the top of the file.
use ShetabitPaymentInvoice;
use ShetabitPaymentFacadePayment;
...
# create new invoice
$invoice = (new Invoice)->amount(۱۰۰۰);
# purchase the given invoice
Payment::via('driverName')->purchase(
$invoice,
function($driver, $transactionId) {
// we can store $transactionId in database
}
);
نمونه کد توی لینک زیر موجود هست
https://github.com/shetabit/payment/issues/46#issuecomment-599255439
بعد از اینکه کد ها رو از حالت فشرده خارج کردین دستور composer update بزنید تا اماده ی استفاده بشه.
در صورتی که نیاز به کمک دارید توی رپازیتوری پکیج issue ایجاد کنید.
من ذخیرش کردم باراول داخل دیتابیس اما منظور شما رو میتوجه نمیشم تو کالبک چیرو باید ذخیره کنم من الان لازم دارم نمیشه کامل تر توضیح بدین @khanzadimahdi
نمونه کد گذاشتم دوست عزیز. دانلود کنید ببینید.
https://github.com/shetabit/payment/issues/46#issuecomment-599255439
@khanzadimahdi
سلام.
ما سه تا درگاه فعال داریم و میخواهیم کاربری روی آیکون هر کدوم زد به درگاه همون بانک وصل بشود، چطوری میتوانیم تو کدهامون driver رو مقدار دهی کنیم.
سلام وقت بخیر.
https://ditty.ir/posts/laravel-online-payment-introduction/J0zKn
https://roocket.ir/series/laravel-projects/episode/113
دوتا لینک بالا + داکیومنت های پکیج در گیت هاب رو قبل از استفاده از پکیج مطالعه کنید.
از متد via باید استفاده کنید. قبل از پرسیدن همیشه اول جستجو کنید منابع در دسترس رو بخونید.
موفق باشید.
سلام ..
من این ارور رو دارم Call to undefined method App\Models\Invoice::amount()
$invoice = (new Invoice)->amount($price);
این هم کدم
شما یه مدل با نام invoice ساختین و دارین متد رو روی مدل خودتون صدا میزنید. دقت نکید Invoice پکیج توی یه namespace دیگه ای هست.
مهندس خیلی ممنون از پکیج خوبی که نوشتین ممنون میشم درگاه وندار رو هم اضافه کنید
لینک سایتش
لینک مستندات لاراولش
لطفا خودتون اظافه کنید و درخواست merge بدید. پروژه اوپن سورس هست و میتونید توی توسعه ی درایور های جدید مشارکت داشته باشید.
@khanzadimahdi
سلام ببخشید من موقع استفاده از purchase ارور
Target class [shetabit-payment] does not exist.
میگیرم . اگه ممکنه راهنمایی کنید
سلام. دلیلش اینه که service payment رو به لیست services خودتون اضافه نکردین. ورژن لاراول + php خودتون رو بنویسید تا بیشتر بتونم کمکتون کنم.
@khanzadimahdi
ممنون از راهنماییتون .
میشه بفرمایید چجوری اضافه کنم ؟
جفتش ورژن 8 هست .
وقتی پکیج رو نضب میکنیم کلا توی چه فایل هایی تغییر ایجاد میشه ؟ چون من روی هاست اشتراکی سایت رو زدم . فایل های composer , پوشه vendor و config رو بعد از نصب روی لوکال انتقال دادم روی هاست .
سلام وعرض ادب ... ببخشید توی این پکیج چطورمیشه حالت کارت به کارت یا پرداخت رایگان رو اضافه کرد ...
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟