صندوقدار لاراول (پادل)
- معرفی
- ارتقاء صندوقدار
- نصب و راه اندازی
- پیکربندی
- مفاهیم اصلی
- قیمت
- مشتریان
- اشتراک ها
- آزمایشات اشتراک
- رسیدگی به قلاب های وب پارویی
- شارژ تک
- رسیدها
- رسیدگی به پرداخت های ناموفق
- آزمایش کردن
معرفی
Laravel Cashier Paddle یک رابط رسا و روان برای خدمات صورتحساب اشتراک Paddle فراهم می کند. تقریباً تمام کدهای صورتحساب اشتراک دیگ بخار را که از آن میترسید مدیریت میکند. علاوه بر مدیریت اشتراک اولیه، صندوقدار میتواند این موارد را نیز انجام دهد: کوپنها، اشتراک تعویض، «مقدار» اشتراک، دورههای مهلت لغو، و موارد دیگر.
هنگام کار با Cashier، توصیه میکنیم راهنمای کاربر Paddle و اسناد API را نیز مرور کنید .
ارتقاء صندوقدار
هنگام ارتقاء به نسخه جدید Cashier، مهم است که راهنمای ارتقا را به دقت مرور کنید .
نصب و راه اندازی
ابتدا بسته Cashier را برای Paddle با استفاده از مدیریت بسته Composer نصب کنید:
composer require laravel/cashier-paddle
برای اطمینان از اینکه Cashier به درستی همه رویدادهای Paddle را مدیریت می کند، به یاد داشته باشید که کنترل وب هوک Cashier را تنظیم کنید .
جعبه شنی دست و پا زدن
در طول توسعه محلی و مرحلهای، باید یک حساب Paddle Sandbox ثبت کنید . این حساب به شما یک محیط سندباکس می دهد تا برنامه های خود را بدون پرداخت واقعی آزمایش و توسعه دهید. میتوانید از شمارههای کارت تست Paddle برای شبیهسازی سناریوهای پرداخت مختلف استفاده کنید.
هنگام استفاده از محیط Paddle Sandbox، باید
PADDLE_SANDBOX
متغیر محیط را
true
در فایل برنامه خود تنظیم کنید
.env
:
PADDLE_SANDBOX=true
پس از اتمام توسعه برنامه خود، می توانید برای یک حساب فروشنده Paddle درخواست دهید . قبل از اینکه برنامه شما وارد مرحله تولید شود، Paddle باید دامنه برنامه شما را تأیید کند.
مهاجرت های پایگاه داده
ارائه دهنده خدمات Cashier دایرکتوری مهاجرت پایگاه داده خود را ثبت می کند،
بنابراین به یاد داشته باشید که پس از نصب بسته، پایگاه داده خود را انتقال دهید. مهاجرت صندوقدار یک
customers
جدول جدید ایجاد می کند. علاوه بر این، یک
subscriptions
جدول جدید برای ذخیره تمام اشتراک های مشتری شما ایجاد می شود. در نهایت، یک
جدول جدید
receipts
برای ذخیره تمام اطلاعات رسید برنامه شما ایجاد می شود:
php artisan migrate
اگر نیاز به بازنویسی مهاجرتهایی دارید که با Cashier ارائه شدهاند،
میتوانید آنها را با استفاده از
vendor:publish
دستور Artisan منتشر کنید:
php artisan vendor:publish --tag="cashier-migrations"
اگر می خواهید از اجرای کامل مهاجرت صندوقدار جلوگیری کنید، می توانید از
برنامه
ignoreMigrations
ارائه شده توسط صندوقدار استفاده کنید. به طور معمول، این روش باید در
register
متد شما
فراخوانی شود
AppServiceProvider
:
use Laravel\Paddle\Cashier; /** * Register any application services. * * @return void */public function register(){ Cashier::ignoreMigrations();}
پیکربندی
مدل قابل پرداخت
قبل از استفاده از Cashier، باید این
Billable
ویژگی را به تعریف مدل کاربری خود اضافه کنید. این ویژگی روشهای مختلفی را
ارائه میکند تا به شما امکان میدهد کارهای رایج صورتحساب را انجام دهید، مانند ایجاد اشتراک، اعمال کوپن و
بهروزرسانی اطلاعات روش پرداخت:
use Laravel\Paddle\Billable; class User extends Authenticatable{ use Billable;}
اگر نهادهای قابل پرداختی دارید که کاربر نیستند، میتوانید این ویژگی را نیز به آن کلاسها اضافه کنید:
use Illuminate\Database\Eloquent\Model;use Laravel\Paddle\Billable; class Team extends Model{ use Billable;}
کلیدهای API
در مرحله بعد، باید کلیدهای Paddle خود را در
.env
فایل برنامه خود پیکربندی کنید. می توانید کلیدهای Paddle API خود را از
کنترل پنل Paddle بازیابی کنید:
PADDLE_VENDOR_ID=your-paddle-vendor-idPADDLE_VENDOR_AUTH_CODE=your-paddle-vendor-auth-codePADDLE_PUBLIC_KEY="your-paddle-public-key"PADDLE_SANDBOX=true
وقتی از محیط Sandbox Paddle
استفاده می کنید، متغیر
محیط
PADDLE_SANDBOX
باید روی آن تنظیم شود
.
اگر برنامه خود را برای تولید پیاده سازی می کنید و از محیط فروشنده زنده
Paddle استفاده می کنید، باید روی
این
متغیر تنظیم شود .
true
PADDLE_SANDBOX
false
Paddle JS
Paddle برای راهاندازی ویجت پرداخت Paddle به کتابخانه جاوا اسکریپت خود
متکی است. میتوانید کتابخانه جاوا اسکریپت را با قرار دادن
@paddleJS
دستورالعمل Blade درست قبل از برچسب بسته شدن طرحبندی برنامه خود بارگیری
کنید
</head>
:
<head> ... @paddleJS</head>
پیکربندی ارز
واحد پول نقد پیش فرض دلار آمریکا (USD) است. میتوانید با تعریف یک
CASHIER_CURRENCY
متغیر محیطی در فایل برنامه، واحد پول پیشفرض را تغییر دهید
.env
:
CASHIER_CURRENCY=EUR
علاوه بر پیکربندی واحد پول Cashier، میتوانید محلی را نیز تعیین کنید که
هنگام قالببندی مقادیر پول برای نمایش در فاکتورها استفاده شود. در داخل، Cashier از
کلاس
PHP
NumberFormatter
برای تنظیم محلی ارز استفاده می کند:
CASHIER_CURRENCY_LOCALE=nl_BE
به منظور استفاده از زبانهای محلی به غیر از
en
، مطمئن شوید کهext-intl
پسوند PHP روی سرور شما نصب و پیکربندی شده است.
نادیده گرفتن مدل های پیش فرض
شما آزاد هستید که مدل های مورد استفاده داخلی توسط صندوقدار را با تعریف مدل خود و گسترش مدل صندوقدار مربوطه گسترش دهید:
use Laravel\Paddle\Subscription as CashierSubscription; class Subscription extends CashierSubscription{ // ...}
پس از تعریف مدل خود، ممکن است به Cashier دستور دهید که از مدل سفارشی شما
از طریق
Laravel\Paddle\Cashier
کلاس استفاده کند. به طور معمول، شما باید مدل های سفارشی خود را در
boot
روش کلاس برنامه خود به Cashier اطلاع دهید
App\Providers\AppServiceProvider
:
use App\Models\Cashier\Receipt;use App\Models\Cashier\Subscription; /** * Bootstrap any application services. * * @return void */public function boot(){ Cashier::useReceiptModel(Receipt::class); Cashier::useSubscriptionModel(Subscription::class);}
مفاهیم اصلی
لینک های پرداخت
Paddle فاقد یک CRUD API گسترده برای انجام تغییرات وضعیت اشتراک است. بنابراین، بیشتر تعاملات با Paddle از طریق ویجت پرداخت آن انجام می شود . قبل از اینکه بتوانیم ویجت پرداخت را نمایش دهیم، باید با استفاده از Cashier یک "پیوند پرداخت" ایجاد کنیم. یک "پیوند پرداخت" ویجت پرداخت را از عملیات صورتحساب که میخواهیم انجام دهیم مطلع میکند:
use App\Models\User;use Illuminate\Http\Request; Route::get('/user/subscribe', function (Request $request) { $payLink = $request->user()->newSubscription('default', $premium = 34567) ->returnTo(route('home')) ->create(); return view('billing', ['payLink' => $payLink]);});
صندوقدار شامل یک
paddle-button
جزء تیغه
است . ما ممکن است URL پیوند پرداخت را به عنوان یک "سرپا" به این مؤلفه
ارسال کنیم. هنگامی که این دکمه کلیک می شود، ویجت پرداخت Paddle نمایش داده می شود:
<x-paddle-button :url="$payLink" class="px-8 py-4"> Subscribe</x-paddle-button>
بهطور پیشفرض، این دکمهای را با استایل استاندارد Paddle نمایش میدهد.
می توانید با افزودن
data-theme="none"
ویژگی به کامپوننت، تمام استایل های Paddle را حذف کنید:
<x-paddle-button :url="$payLink" class="px-8 py-4" data-theme="none"> Subscribe</x-paddle-button>
ویجت پرداخت Paddle ناهمزمان است. هنگامی که کاربر اشتراکی را در ویجت ایجاد یا بهروزرسانی کرد، Paddle وبقلابهای برنامه شما را ارسال میکند تا بتوانید وضعیت اشتراک را در پایگاه داده خودمان بهدرستی بهروزرسانی کنید. بنابراین، مهم است که به درستی وب هوک ها را برای تطبیق تغییرات وضعیت از Paddle تنظیم کنید .
برای اطلاعات بیشتر در مورد پیوندهای پرداخت، میتوانید مستندات Paddle API را در مورد ایجاد پیوند پرداخت مرور کنید .
پس از تغییر وضعیت اشتراک، تاخیر برای دریافت وب هوک مربوطه معمولاً حداقل است، اما باید با در نظر گرفتن اینکه اشتراک کاربر شما ممکن است بلافاصله پس از تکمیل پرداخت در دسترس نباشد، این را در برنامه خود در نظر بگیرید.
رندر کردن دستی پیوندهای پرداخت
همچنین میتوانید بدون استفاده از اجزای Blade داخلی لاراول، پیوند پرداخت را به صورت دستی ارائه دهید. برای شروع، URL پیوند پرداخت را همانطور که در مثالهای قبلی نشان داده شد ایجاد کنید:
$payLink = $request->user()->newSubscription('default', $premium = 34567) ->returnTo(route('home')) ->create();
سپس، به سادگی URL پیوند پرداخت را به یک
a
عنصر در HTML خود پیوست کنید:
<a href="#!" class="ml-4 paddle_button" data-override="{{ $payLink }}"> Paddle Checkout</a>
پرداخت هایی که نیاز به تایید اضافی دارند
گاهی اوقات برای تأیید و پردازش پرداخت نیاز به تأیید اضافی است. هنگامی که این اتفاق می افتد، Paddle یک صفحه تأیید پرداخت را نشان می دهد. صفحههای تأیید پرداخت ارائهشده توسط Paddle یا Cashier ممکن است متناسب با جریان پرداخت یک بانک یا صادرکننده کارت خاص باشد و میتواند شامل تأیید کارت اضافی، هزینه جزئی موقت، احراز هویت دستگاه جداگانه یا سایر اشکال تأیید باشد.
پرداخت درون خطی
اگر نمیخواهید از ویجت پرداخت به سبک «همپوشانی» Paddle استفاده کنید، Paddle همچنین گزینهای برای نمایش ویجت درون خطی ارائه میکند. در حالی که این رویکرد به شما اجازه نمی دهد که هیچ یک از فیلدهای HTML پرداخت را تنظیم کنید، به شما امکان می دهد ویجت را در برنامه خود جاسازی کنید.
برای سهولت در شروع پرداخت درون خطی، Cashier شامل یک
paddle-checkout
جزء Blade است. برای شروع، باید
یک پیوند پرداخت ایجاد کنید
و پیوند پرداخت را به ویژگی مؤلفه ارسال کنید
override
:
<x-paddle-checkout :override="$payLink" class="w-full" />
برای تنظیم ارتفاع مؤلفه پرداخت درون خطی، می توانید
height
ویژگی را به مؤلفه Blade منتقل کنید:
<x-paddle-checkout :override="$payLink" class="w-full" height="500" />
پرداخت درون خطی بدون پیوندهای پرداخت
همچنین، میتوانید به جای استفاده از پیوند پرداخت، ویجت را با گزینههای سفارشی سفارشی کنید:
@php$options = [ 'product' => $productId, 'title' => 'Product Title',];@endphp <x-paddle-checkout :options="$options" class="w-full" />
لطفاً برای جزئیات بیشتر در مورد گزینه های موجود پرداخت درون خطی، به راهنمای Paddle در مورد Inline Checkout و همچنین مرجع پارامتر آنها مراجعه کنید.
اگر میخواهید
passthrough
هنگام تعیین گزینههای سفارشی نیز از این گزینه استفاده کنید، باید یک آرایه کلید / مقدار به عنوان مقدار آن ارائه کنید. Cashier به طور خودکار تبدیل آرایه به رشته JSON را انجام می دهد. علاوه بر این،customer_id
گزینه عبور برای استفاده داخلی صندوقدار رزرو شده است.
ارائه دستی پرداخت درون خطی
همچنین می توانید بدون استفاده از اجزای Blade داخلی لاراول، یک پرداخت درون خطی را به صورت دستی ارائه دهید. برای شروع، URL پیوند پرداخت را همانطور که در مثال های قبلی نشان داده شد ایجاد کنید .
در مرحله بعد، می توانید از Paddle.js برای مقداردهی اولیه پرداخت استفاده کنید. برای ساده نگه داشتن این مثال، این را با استفاده از Alpine.js نشان خواهیم داد . با این حال، شما آزاد هستید که این مثال را به پشته frontend خودتان ترجمه کنید:
<div class="paddle-checkout" x-data="{}" x-init=" Paddle.Checkout.open({ override: {{ $payLink }}, method: 'inline', frameTarget: 'paddle-checkout', frameInitialHeight: 366, frameStyle: 'width: 100%; background-color: transparent; border: none;' });"></div>
شناسایی کاربر
بر خلاف Stripe، کاربران Paddle در تمام Paddle منحصر به فرد هستند، نه
منحصر به فرد در هر حساب Paddle. به همین دلیل، API های Paddle در حال حاضر روشی برای به روز رسانی جزئیات کاربر
مانند آدرس ایمیل آنها ارائه نمی دهند. هنگام ایجاد پیوندهای پرداخت، Paddle کاربران را با استفاده از
customer_email
پارامتر شناسایی می کند. هنگام ایجاد اشتراک، Paddle سعی می کند ایمیل ارائه
شده توسط کاربر را با یک کاربر موجود Paddle مطابقت دهد.
با توجه به این رفتار، نکات مهمی وجود دارد که باید هنگام استفاده از صندوقدار و پارو در نظر داشته باشید. ابتدا، باید توجه داشته باشید که حتی اگر اشتراکها در Cashier به یک کاربر برنامه مرتبط هستند، میتوانند به کاربران مختلفی در سیستمهای داخلی Paddle مرتبط باشند . ثانیاً، هر اشتراک اطلاعات روش پرداخت متصل خود را دارد و همچنین میتواند آدرسهای ایمیل متفاوتی در سیستمهای داخلی Paddle داشته باشد (بسته به اینکه در هنگام ایجاد اشتراک کدام ایمیل به کاربر اختصاص داده شده است).
بنابراین، هنگام نمایش اشتراکها، همیشه باید به کاربر اطلاع دهید که کدام
آدرس ایمیل یا اطلاعات روش پرداخت به ازای هر اشتراک به اشتراک متصل است. بازیابی این اطلاعات را می توان با روش
های زیر ارائه شده توسط
Laravel\Paddle\Subscription
مدل انجام داد:
$subscription = $user->subscription('default'); $subscription->paddleEmail();$subscription->paymentMethod();$subscription->cardBrand();$subscription->cardLastFour();$subscription->cardExpirationDate();
در حال حاضر هیچ راهی برای تغییر آدرس ایمیل کاربر از طریق Paddle API وجود
ندارد. هنگامی که کاربر می خواهد آدرس ایمیل خود را در Paddle به روز کند، تنها راه برای انجام این کار تماس با
پشتیبانی مشتری Paddle است. هنگام برقراری ارتباط با Paddle، آنها باید
paddleEmail
مقدار اشتراک را ارائه دهند تا به Paddle در به روز رسانی کاربر صحیح کمک
کند.
قیمت
Paddle به شما امکان میدهد قیمتها را برای هر ارز سفارشی کنید و اساساً به
شما امکان میدهد قیمتهای مختلف را برای کشورهای مختلف پیکربندی کنید. Cashier Paddle به شما امکان می دهد با
استفاده از این روش، تمام قیمت های یک محصول معین را بازیابی کنید
productPrices
. این روش شناسههای محصول محصولاتی را که میخواهید قیمتها را بازیابی
کنید، میپذیرد:
use Laravel\Paddle\Cashier; $prices = Cashier::productPrices([123, 456]);
ارز بر اساس آدرس IP درخواست تعیین می شود. با این حال، میتوانید به صورت اختیاری کشور خاصی را برای بازیابی قیمتها ارائه دهید:
use Laravel\Paddle\Cashier; $prices = Cashier::productPrices([123, 456], ['customer_country' => 'BE']);
پس از بازیابی قیمت ها، می توانید آنها را هر طور که می خواهید نمایش دهید:
<ul> @foreach ($prices as $price) <li>{{ $price->product_title }} - {{ $price->price()->gross() }}</li> @endforeach</ul>
همچنین میتوانید قیمت خالص (بدون مالیات) را نمایش دهید و مبلغ مالیات را جداگانه نمایش دهید:
<ul> @foreach ($prices as $price) <li>{{ $price->product_title }} - {{ $price->price()->net() }} (+ {{ $price->price()->tax() }} tax)</li> @endforeach</ul>
اگر قیمتهای طرحهای اشتراک را بازیابی کردهاید، میتوانید قیمت اولیه و تکرارشونده آنها را جداگانه نمایش دهید:
<ul> @foreach ($prices as $price) <li>{{ $price->product_title }} - Initial: {{ $price->initialPrice()->gross() }} - Recurring: {{ $price->recurringPrice()->gross() }}</li> @endforeach</ul>
برای اطلاعات بیشتر، اسناد API Paddle را در مورد قیمت ها بررسی کنید .
مشتریان
اگر کاربری قبلاً مشتری است و میخواهید قیمتهایی را که برای آن مشتری اعمال میشود نمایش دهید، میتوانید این کار را با بازیابی قیمتها مستقیماً از نمونه مشتری انجام دهید:
use App\Models\User; $prices = User::find(1)->productPrices([123, 456]);
paddleCountry
در داخل، Cashier از روش
کاربر
برای بازیابی قیمت ها به واحد پول خود استفاده می کند. بنابراین، برای مثال،
کاربری که در ایالات متحده زندگی می کند قیمت ها را به دلار آمریکا می بیند در حالی که کاربر در بلژیک قیمت ها
را به یورو می بیند. اگر ارز منطبقی پیدا نشد، واحد پول پیشفرض محصول استفاده میشود. میتوانید تمام قیمتهای
یک محصول یا طرح اشتراک را در کنترل پنل Paddle سفارشی کنید.
کوپن
همچنین میتوانید پس از کاهش کوپن، قیمتها را نمایش دهید. هنگام فراخوانی
productPrices
متد، کوپن ها ممکن است به صورت رشته ای با کاما ارسال شوند:
use Laravel\Paddle\Cashier; $prices = Cashier::productPrices([123, 456], [ 'coupons' => 'SUMMERSALE,20PERCENTOFF']);
سپس قیمت های محاسبه شده را با استفاده از
price
روش زیر نمایش دهید:
<ul> @foreach ($prices as $price) <li>{{ $price->product_title }} - {{ $price->price()->gross() }}</li> @endforeach</ul>
می توانید قیمت های اصلی فهرست شده (بدون تخفیف کوپن) را با استفاده از
listPrice
روش زیر نمایش دهید:
<ul> @foreach ($prices as $price) <li>{{ $price->product_title }} - {{ $price->listPrice()->gross() }}</li> @endforeach</ul>
هنگام استفاده از API قیمتها، Paddle فقط اجازه میدهد تا کوپنها را برای محصولات یکبار خرید و نه برای طرحهای اشتراک اعمال کنید.
مشتریان
پیش فرض های مشتری
Cashier به شما امکان می دهد هنگام ایجاد پیوندهای پرداخت، چند پیش فرض مفید برای مشتریان خود تعریف کنید. تنظیم این پیشفرضها به شما این امکان را میدهد که آدرس ایمیل، کشور و کد پستی مشتری را از قبل پر کنید تا بتوانند فوراً به بخش پرداخت ویجت تسویهحساب بروند. میتوانید این پیشفرضها را با لغو روشهای زیر در مدل قابل پرداخت خود تنظیم کنید:
/** * Get the customer's email address to associate with Paddle. * * @return string|null */public function paddleEmail(){ return $this->email;} /** * Get the customer's country to associate with Paddle. * * This needs to be a 2 letter code. See the link below for supported countries. * * @return string|null * @link https://developer.paddle.com/reference/platform-parameters/supported-countries */public function paddleCountry(){ //} /** * Get the customer's postal code to associate with Paddle. * * See the link below for countries which require this. * * @return string|null * @link https://developer.paddle.com/reference/platform-parameters/supported-countries#countries-requiring-postcode */public function paddlePostcode(){ //}
این پیشفرضها برای هر اقدامی در Cashier که پیوند پرداخت ایجاد میکند استفاده میشود .
اشتراک ها
ایجاد اشتراک
برای ایجاد اشتراک، ابتدا نمونه ای از مدل قابل پرداخت خود را از پایگاه
داده خود بازیابی کنید، که معمولاً نمونه ای از
App\Models\User
. هنگامی که نمونه مدل را بازیابی کردید، می توانید از این
newSubscription
روش برای ایجاد پیوند پرداخت اشتراک مدل استفاده کنید:
use Illuminate\Http\Request; Route::get('/user/subscribe', function (Request $request) { $payLink = $request->user()->newSubscription('default', $premium = 12345) ->returnTo(route('home')) ->create(); return view('billing', ['payLink' => $payLink]);});
اولین آرگومان ارسال شده به
newSubscription
متد باید نام داخلی اشتراک باشد. اگر برنامه شما فقط یک اشتراک ارائه می
دهد، می توانید با این
default
یا تماس بگیرید
primary
. این نام اشتراک فقط برای استفاده داخلی برنامه است و قرار نیست به کاربران
نشان داده شود. علاوه بر این، نباید دارای فاصله باشد و هرگز نباید پس از ایجاد اشتراک تغییر کند. دومین آرگومان
ارائه شده به
newSubscription
روش، طرح خاصی است که کاربر در حال اشتراک در آن است. این مقدار باید با
شناسه طرح در Paddle مطابقت داشته باشد. این
returnTo
روش یک URL را میپذیرد که کاربر شما پس از تکمیل موفقیتآمیز پرداخت، به آن
هدایت میشود.
این
create
روش یک پیوند پرداخت ایجاد می کند که می توانید از آن برای ایجاد دکمه
پرداخت استفاده کنید. دکمه پرداخت را می توان با استفاده از
paddle-button
مولفه Blade
که با Cashier Paddle ارائه می شود ایجاد کرد:
<x-paddle-button :url="$payLink" class="px-8 py-4"> Subscribe</x-paddle-button>
پس از اینکه کاربر پرداخت خود را به پایان رساند، یک
subscription_created
وب هوک از Paddle ارسال می شود. صندوقدار این وب هوک را دریافت می کند و
اشتراک را برای مشتری شما تنظیم می کند. برای اطمینان از اینکه همه وبکهکها به درستی دریافت شده و توسط برنامه
شما مدیریت میشوند، مطمئن شوید که
مدیریت وبهوک را بهدرستی تنظیم کردهاید
.
توضیحات بیشتر
اگر میخواهید جزئیات اضافی مشتری یا اشتراک را مشخص کنید، میتوانید این
کار را با ارسال آنها به عنوان آرایهای از جفتهای کلید/مقدار به روش انجام دهید
create
. برای کسب اطلاعات بیشتر در مورد فیلدهای اضافی پشتیبانی شده توسط Paddle،
مستندات Paddle را در مورد
ایجاد پیوندهای پرداخت
بررسی کنید :
$payLink = $user->newSubscription('default', $monthly = 12345) ->returnTo(route('home')) ->create([ 'vat_number' => $vatNumber, ]);
کوپن
اگر می خواهید هنگام ایجاد اشتراک کوپن اعمال کنید، می توانید از
withCoupon
روش زیر استفاده کنید:
$payLink = $user->newSubscription('default', $monthly = 12345) ->returnTo(route('home')) ->withCoupon('code') ->create();
فراداده
همچنین میتوانید آرایهای از متادیتا را با استفاده از
withMetadata
روش زیر ارسال کنید:
$payLink = $user->newSubscription('default', $monthly = 12345) ->returnTo(route('home')) ->withMetadata(['key' => 'value']) ->create();
هنگام ارائه ابرداده، لطفاً از استفاده
subscription_name
به عنوان کلید فراداده خودداری کنید. این کلید برای استفاده داخلی توسط صندوقدار رزرو شده است.
بررسی وضعیت اشتراک
هنگامی که کاربر در برنامه شما مشترک شد، می توانید وضعیت اشتراک او را با
استفاده از روش های مختلف مناسب بررسی کنید. ابتدا،
اگر کاربر اشتراک فعال داشته باشد،
subscribed
روش برمی گردد ، حتی اگر اشتراک در حال حاضر در دوره آزمایشی خود باشد:
true
if ($user->subscribed('default')) { //}
این
subscribed
روش همچنین یک کاندیدای عالی برای
میانافزار مسیر
است که به شما امکان میدهد دسترسی به مسیرها و کنترلکنندهها را بر اساس
وضعیت اشتراک کاربر فیلتر کنید:
<?php namespace App\Http\Middleware; use Closure; class EnsureUserIsSubscribed{ /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($request->user() && ! $request->user()->subscribed('default')) { // This user is not a paying customer... return redirect('billing'); } return $next($request); }}
اگر می خواهید تعیین کنید که آیا کاربر هنوز در دوره آزمایشی خود است، می
توانید از این
onTrial
روش استفاده کنید. این روش می تواند برای تعیین اینکه آیا باید هشداری را به
کاربر نشان دهید که هنوز در دوره آزمایشی خود است مفید باشد:
if ($user->subscription('default')->onTrial()) { //}
این
subscribedToPlan
روش ممکن است برای تعیین اینکه آیا کاربر در یک طرح معین بر اساس شناسه طرح
Paddle معین مشترک شده است یا خیر استفاده شود. در این مثال، تعیین می کنیم که آیا اشتراک کاربر
default
به طور فعال در طرح ماهانه مشترک است یا خیر:
if ($user->subscribedToPlan($monthly = 12345, 'default')) { //}
با ارسال یک آرایه به
subscribedToPlan
روش، می توانید تعیین کنید که آیا اشتراک کاربر
default
به طور فعال در برنامه ماهانه یا سالانه مشترک است:
if ($user->subscribedToPlan([$monthly = 12345, $yearly = 54321], 'default')) { //}
این
recurring
روش ممکن است برای تعیین اینکه آیا کاربر در حال حاضر مشترک است و دیگر در
دوره آزمایشی خود نیست استفاده می شود:
if ($user->subscription('default')->recurring()) { //}
وضعیت اشتراک لغو شده
برای تعیین اینکه آیا کاربر زمانی مشترک فعال بوده است اما اشتراک خود را
لغو کرده است، می توانید از
cancelled
روش زیر استفاده کنید:
if ($user->subscription('default')->cancelled()) { //}
همچنین میتوانید تعیین کنید که آیا یک کاربر اشتراک خود را لغو کرده است یا
خیر، اما هنوز در «دوره مهلت» خود است تا زمانی که اشتراک به طور کامل منقضی شود. به عنوان مثال، اگر کاربر
اشتراکی را در تاریخ 5 مارس لغو کند که در ابتدا قرار بود در 10 مارس منقضی شود، کاربر تا 10 مارس در "مهلت
مهلت" خود است. توجه داشته باشید که
subscribed
روش همچنان
true
در این مدت باز می گردد:
if ($user->subscription('default')->onGracePeriod()) { //}
برای تعیین اینکه آیا کاربر اشتراک خود را لغو کرده است و دیگر در "دوره
مهلت" خود نیست، می توانید از
ended
روش زیر استفاده کنید:
if ($user->subscription('default')->ended()) { //}
وضعیت سررسید گذشته
اگر پرداخت برای اشتراک ناموفق باشد، به عنوان علامت گذاری می شود
past_due
. هنگامی که اشتراک شما در این وضعیت باشد، تا زمانی که مشتری اطلاعات
پرداخت خود را به روز نکند، فعال نخواهد بود. می توانید با استفاده از
pastDue
روش موجود در نمونه اشتراک تعیین کنید که آیا یک اشتراک سررسید شده است:
if ($user->subscription('default')->pastDue()) { //}
هنگامی که سررسید اشتراک به پایان می رسد، باید به کاربر دستور دهید که اطلاعات پرداخت خود را به روز کند . میتوانید نحوه رسیدگی به اشتراکهای سررسید شده را در تنظیمات اشتراک Paddle پیکربندی کنید .
اگر میخواهید اشتراکها همچنان فعال در نظر گرفته شوند
past_due
، میتوانید از
keepPastDueSubscriptionsActive
روش ارائه شده توسط Cashier استفاده کنید. به طور معمول، این روش باید در
register
متد شما
فراخوانی شود
AppServiceProvider
:
use Laravel\Paddle\Cashier; /** * Register any application services. * * @return void */public function register(){ Cashier::keepPastDueSubscriptionsActive();}
هنگامی که اشتراکی در
past_due
وضعیتی است، تا زمانی که اطلاعات پرداخت به روز نشده باشد، نمی توان آن را تغییر داد. بنابراین، متدهایswap
وupdateQuantity
زمانی که اشتراک در یک وضعیت باشد، استثنا ایجاد میکندpast_due
.
محدوده های اشتراک
اکثر حالت های اشتراک نیز به عنوان محدوده پرس و جو در دسترس هستند، به طوری که می توانید به راحتی پایگاه داده خود را برای اشتراک هایی که در یک وضعیت خاص هستند پرس و جو کنید:
// Get all active subscriptions...$subscriptions = Subscription::query()->active()->get(); // Get all of the cancelled subscriptions for a user...$subscriptions = $user->subscriptions()->cancelled()->get();
لیست کاملی از دامنه های موجود در زیر موجود است:
Subscription::query()->active();Subscription::query()->onTrial();Subscription::query()->notOnTrial();Subscription::query()->pastDue();Subscription::query()->recurring();Subscription::query()->ended();Subscription::query()->paused();Subscription::query()->notPaused();Subscription::query()->onPausedGracePeriod();Subscription::query()->notOnPausedGracePeriod();Subscription::query()->cancelled();Subscription::query()->notCancelled();Subscription::query()->onGracePeriod();Subscription::query()->notOnGracePeriod();
هزینه های تک اشتراک
هزینه های تک اشتراک به شما این امکان را می دهد که مشترکین را با یک بار هزینه در کنار اشتراک خود شارژ کنید:
$response = $user->subscription('default')->charge(12.99, 'Support Add-on');
برخلاف هزینه های تکی ، این روش بلافاصله از روش پرداخت ذخیره شده مشتری برای اشتراک هزینه دریافت می کند. مبلغ شارژ همیشه باید به واحد پول اشتراک تعریف شود.
به روز رسانی اطلاعات پرداخت
Paddle همیشه یک روش پرداخت را برای هر اشتراک ذخیره می کند. اگر میخواهید
روش پرداخت پیشفرض برای اشتراک را بهروزرسانی کنید، ابتدا باید با استفاده از روش موجود
updateUrl
در مدل اشتراک، یک «URL بهروزرسانی» اشتراک ایجاد کنید:
use App\Models\User; $user = User::find(1); $updateUrl = $user->subscription('default')->updateUrl();
سپس، میتوانید از URL تولید شده در ترکیب با
paddle-button
مؤلفه Blade ارائه شده توسط Cashier استفاده کنید تا به کاربر اجازه دهید
ویجت Paddle را راهاندازی کند و اطلاعات پرداخت خود را بهروزرسانی کند:
<x-paddle-button :url="$updateUrl" class="px-8 py-4"> Update Card</x-paddle-button>
هنگامی که کاربر بهروزرسانی اطلاعات خود را به پایان رساند، یک
subscription_updated
وب هوک توسط Paddle ارسال میشود و جزئیات اشتراک در پایگاه داده برنامه شما
بهروزرسانی میشود.
تغییر برنامه ها
پس از اینکه کاربر در برنامه شما مشترک شد، ممکن است گهگاه بخواهد به یک طرح
اشتراک جدید تغییر کند. برای به روز رسانی طرح اشتراک برای یک کاربر، باید شناسه طرح Paddle را به
swap
روش اشتراک ارسال کنید:
use App\Models\User; $user = User::find(1); $user->subscription('default')->swap($premium = 34567);
اگر میخواهید به جای اینکه برای چرخه صورتحساب بعدی کاربر منتظر بمانید،
برنامهها را مبادله کنید و فوراً فاکتور بگیرید، میتوانید از
swapAndInvoice
روش زیر استفاده کنید:
$user = User::find(1); $user->subscription('default')->swapAndInvoice($premium = 34567);
وقتی آزمایشی فعال است، نمیتوان برنامهها را تعویض کرد. برای اطلاعات بیشتر در مورد این محدودیت، لطفاً به مستندات Paddle مراجعه کنید .
تناسب
بهطور پیشفرض، Paddle هنگام جابجایی بین طرحها، هزینهها را نسبت میدهد.
این
noProrate
روش ممکن است برای بهروزرسانی اشتراکها بدون نسبت هزینهها استفاده شود:
$user->subscription('default')->noProrate()->swap($premium = 34567);
مقدار اشتراک
گاهی اوقات اشتراک ها تحت تأثیر "کمیت" قرار می گیرند. به عنوان مثال، یک
برنامه مدیریت پروژه ممکن است 10 دلار در ماه برای هر پروژه هزینه کند. برای افزایش یا کاهش آسان تعداد اشتراک
خود، از روش ها
incrementQuantity
و
decrementQuantity
روش های زیر استفاده کنید:
$user = User::find(1); $user->subscription('default')->incrementQuantity(); // Add five to the subscription's current quantity...$user->subscription('default')->incrementQuantity(5); $user->subscription('default')->decrementQuantity(); // Subtract five from the subscription's current quantity...$user->subscription('default')->decrementQuantity(5);
از طرف دیگر، میتوانید مقدار خاصی را با استفاده از
updateQuantity
روش زیر تنظیم کنید:
$user->subscription('default')->updateQuantity(10);
این
noProrate
روش ممکن است برای به روز رسانی مقدار اشتراک بدون نسبت هزینه ها استفاده
شود:
$user->subscription('default')->noProrate()->updateQuantity(10);
اصلاح کننده های اشتراک
اصلاحکنندههای اشتراک به شما امکان میدهند صورتحساب اندازهگیری شده را اجرا کنید یا اشتراکها را با افزونهها افزایش دهید.
برای مثال، ممکن است بخواهید با اشتراک استاندارد خود یک افزونه «پشتیبانی ممتاز» ارائه دهید. شما می توانید این اصلاح کننده را به صورت زیر ایجاد کنید:
$modifier = $user->subscription('default')->newModifier(12.99)->create();
مثال بالا یک افزونه 12.99 دلاری به اشتراک اضافه می کند. به طور پیش فرض،
این هزینه در هر بازه زمانی که برای اشتراک پیکربندی کرده اید تکرار می شود. در صورت تمایل، میتوانید با
استفاده از
description
روش اصلاحکننده، یک توضیح قابل خواندن به اصلاحکننده اضافه کنید:
$modifier = $user->subscription('default')->newModifier(12.99) ->description('Premium Support') ->create();
برای نشان دادن نحوه اجرای صورتحساب اندازهگیری شده با استفاده از اصلاحکنندهها، هزینههای برنامه خود را به ازای هر پیام کوتاه ارسال شده توسط کاربر تصور کنید. ابتدا باید یک طرح $0 در داشبورد Paddle خود ایجاد کنید. هنگامی که کاربر در این طرح مشترک شد، میتوانید اصلاحکنندههایی را که هر هزینه جداگانه را نشان میدهند به اشتراک اضافه کنید:
$modifier = $user->subscription('default')->newModifier(0.99) ->description('New text message') ->oneTime() ->create();
همانطور که می بینید، ما
oneTime
روش را هنگام ایجاد این اصلاح کننده فراخوانی کردیم. این روش تضمین می کند
که اصلاح کننده فقط یک بار شارژ می شود و در هر بازه صورتحساب تکرار نمی شود.
بازیابی اصلاح کننده ها
میتوانید فهرستی از همه اصلاحکنندههای یک اشتراک را از طریق
modifiers
روش زیر بازیابی کنید:
$modifiers = $user->subscription('default')->modifiers(); foreach ($modifiers as $modifier) { $modifier->amount(); // $0.99 $modifier->description; // New text message.}
حذف اصلاح کننده ها
delete
اصلاحکنندهها ممکن است با فراخوانی متد در یک نمونه
حذف شوند
Laravel\Paddle\Modifier
:
$modifier->delete();
اشتراک های متعدد
Paddle به مشتریان شما اجازه می دهد تا چندین اشتراک را به طور همزمان داشته باشند. به عنوان مثال، شما ممکن است باشگاهی را اداره کنید که اشتراک شنا و وزنه برداری را ارائه می دهد و هر اشتراک ممکن است قیمت متفاوتی داشته باشد. البته، مشتریان باید بتوانند در یکی یا هر دو طرح مشترک شوند.
هنگامی که برنامه شما اشتراک ایجاد می کند، می توانید نام اشتراک را برای
newSubscription
روش ارائه دهید. نام ممکن است هر رشته ای باشد که نشان دهنده نوع اشتراکی
است که کاربر شروع می کند:
use Illuminate\Http\Request; Route::post('/swimming/subscribe', function (Request $request) { $request->user() ->newSubscription('swimming', $swimmingMonthly = 12345) ->create($request->paymentMethodId); // ...});
در این مثال، ما اشتراک ماهیانه شنا را برای مشتری آغاز کردیم. با این حال،
آنها ممکن است بخواهند در زمان دیگری به اشتراک سالانه مبادله کنند. هنگام تنظیم اشتراک مشتری، می توانیم به
سادگی قیمت
swimming
اشتراک را تعویض کنیم:
$user->subscription('swimming')->swap($swimmingYearly = 34567);
البته، شما همچنین می توانید اشتراک را به طور کامل لغو کنید:
$user->subscription('swimming')->cancel();
توقف اشتراک ها
برای توقف موقت اشتراک،
pause
روش موجود در اشتراک کاربر را فراخوانی کنید:
$user->subscription('default')->pause();
هنگامی که یک اشتراک متوقف می شود، صندوقدار به طور خودکار
paused_from
ستون را در پایگاه داده شما تنظیم می کند. از این ستون برای دانستن زمان
paused
شروع بازگشت متد استفاده می شود
true
. به عنوان مثال، اگر مشتری اشتراک خود را در اول مارس متوقف کند، اما قرار
نبود اشتراک تا 5 مارس تکرار شود، این روش
تا 5 مارس
paused
ادامه خواهد داشت .
false
این کار به این دلیل انجام می شود که کاربر معمولاً مجاز است تا پایان چرخه
صورتحساب خود از یک برنامه استفاده کند.
onPausedGracePeriod
با استفاده از این روش
میتوانید تعیین کنید که آیا کاربر اشتراک خود را موقتاً متوقف کرده است اما
هنوز در "دوره مهلت" خود است :
if ($user->subscription('default')->onPausedGracePeriod()) { //}
برای از سرگیری یک اشتراک متوقف شده، می توانید
unpause
روش موجود در اشتراک کاربر را فراخوانی کنید:
$user->subscription('default')->unpause();
اشتراک در زمانی که موقتاً متوقف شده است قابل تغییر نیست. اگر میخواهید به طرح دیگری مبادله کنید یا مقادیر بهروزرسانی کنید، ابتدا باید اشتراک را از سر بگیرید.
لغو اشتراک ها
برای لغو اشتراک، با
cancel
روش موجود در اشتراک کاربر تماس بگیرید:
$user->subscription('default')->cancel();
هنگامی که یک اشتراک لغو می شود، صندوقدار به طور خودکار
ends_at
ستون را در پایگاه داده شما تنظیم می کند. از این ستون برای دانستن زمان
subscribed
شروع بازگشت متد استفاده می شود
false
. به عنوان مثال، اگر مشتری در تاریخ 1 مارس اشتراک خود را لغو کند، اما
قرار نبود اشتراک تا 5 مارس پایان یابد، این روش
تا 5 مارس
subscribed
ادامه خواهد داشت .
true
این کار به این دلیل انجام می شود که کاربر معمولاً مجاز است تا پایان چرخه
صورتحساب خود از یک برنامه استفاده کند.
onGracePeriod
با استفاده از این روش
میتوانید تعیین کنید که آیا کاربر اشتراک خود را لغو کرده است اما هنوز در
«دوره مهلت» خود است :
if ($user->subscription('default')->onGracePeriod()) { //}
اگر میخواهید اشتراک را فوراً لغو کنید، میتوانید از
cancelNow
روش موجود در اشتراک کاربر تماس بگیرید:
$user->subscription('default')->cancelNow();
اشتراک های Paddle پس از لغو قابل از سرگیری نمی باشد. اگر مشتری شما بخواهد اشتراک خود را از سر بگیرد، باید مشترک اشتراک جدیدی شود.
آزمایشات اشتراک
با روش پرداخت از قبل
هنگام آزمایش و جمعآوری جزئیات روش پرداخت، Paddle از هرگونه تغییر اشتراک مانند تعویض طرحها یا بهروزرسانی مقادیر جلوگیری میکند. اگر میخواهید به مشتری اجازه دهید برنامههای خود را در طول دوره آزمایشی مبادله کند، اشتراک باید لغو و دوباره ایجاد شود.
اگر میخواهید در حین جمعآوری اطلاعات روش پرداخت از قبل، دورههای آزمایشی
را به مشتریان خود ارائه دهید،
trialDays
هنگام ایجاد پیوندهای پرداخت اشتراک خود باید از این روش استفاده کنید:
use Illuminate\Http\Request; Route::get('/user/subscribe', function (Request $request) { $payLink = $request->user()->newSubscription('default', $monthly = 12345) ->returnTo(route('home')) ->trialDays(10) ->create(); return view('billing', ['payLink' => $payLink]);});
این روش تاریخ پایان دوره آزمایشی را در سابقه اشتراک در پایگاه داده برنامه شما تنظیم می کند، و همچنین به Paddle دستور می دهد که تا بعد از این تاریخ شروع به صدور صورت حساب مشتری نکند.
اگر اشتراک مشتری قبل از تاریخ پایان دوره آزمایشی لغو نشود، به محض انقضای دوره آزمایشی هزینه از آنها کسر می شود، بنابراین باید حتماً کاربران خود را از تاریخ پایان دوره آزمایشی مطلع کنید.
onTrial
شما می توانید با استفاده از روش نمونه کاربر یا
onTrial
روش نمونه اشتراک
تعیین کنید که آیا کاربر در دوره آزمایشی خود است .
دو مثال زیر معادل هستند:
if ($user->onTrial('default')) { //} if ($user->subscription('default')->onTrial()) { //}
برای تعیین اینکه آیا دوره آزمایشی موجود منقضی شده است، می توانید از
hasExpiredTrial
روش های زیر استفاده کنید:
if ($user->hasExpiredTrial('default')) { //} if ($user->subscription('default')->hasExpiredTrial()) { //}
تعریف روزهای آزمایشی در دست و پا زدن / صندوقدار
میتوانید تعیین کنید که برنامهتان چند روز آزمایشی در داشبورد Paddle
دریافت میکند یا همیشه آنها را بهصراحت با استفاده از Cashier پاس کنید. اگر تصمیم میگیرید روزهای آزمایشی
طرح خود را در Paddle تعریف کنید، باید توجه داشته باشید که اشتراکهای جدید، از جمله اشتراکهای جدید برای
مشتری که در گذشته اشتراک داشتهاند، همیشه یک دوره آزمایشی دریافت میکنند، مگر اینکه صریحاً با روش تماس
بگیرید
trialDays(0)
.
بدون روش پرداخت از قبل
اگر میخواهید دورههای آزمایشی را بدون جمعآوری اطلاعات روش پرداخت کاربر
از قبل ارائه دهید، میتوانید ستون
trial_ends_at
روی سابقه مشتری پیوست شده به کاربر خود را به تاریخ پایان آزمایشی مورد نظر
خود تنظیم کنید. این معمولاً در هنگام ثبت نام کاربر انجام می شود:
use App\Models\User; $user = User::create([ // ...]); $user->createAsCustomer([ 'trial_ends_at' => now()->addDays(10)]);
صندوقدار به این نوع آزمایش به عنوان یک "آزمایش عمومی" اشاره می کند، زیرا
به هیچ اشتراک موجود متصل نیست.
اگر تاریخ فعلی از مقدار زیر گذشته نباشد،
متد
onTrial
موجود در
User
نمونه برمیگردد
.
true
trial_ends_at
if ($user->onTrial()) { // User is within their trial period...}
هنگامی که آماده ایجاد یک اشتراک واقعی برای کاربر هستید، می توانید
newSubscription
طبق معمول از روش زیر استفاده کنید:
use Illuminate\Http\Request; Route::get('/user/subscribe', function (Request $request) { $payLink = $user->newSubscription('default', $monthly = 12345) ->returnTo(route('home')) ->create(); return view('billing', ['payLink' => $payLink]);});
برای بازیابی تاریخ پایان آزمایشی کاربر، می توانید از این
trialEndsAt
روش استفاده کنید. این روش در صورتی که کاربر در حال آزمایش باشد یا
null
نباشد، یک نمونه تاریخ کربن را برمی گرداند. همچنین اگر میخواهید تاریخ
پایان آزمایشی برای اشتراک خاصی غیر از اشتراک پیشفرض را دریافت کنید، میتوانید یک پارامتر نام اشتراک اختیاری
را ارسال کنید:
if ($user->onTrial()) { $trialEndsAt = $user->trialEndsAt('main');}
onGenericTrial
اگر می خواهید به طور خاص بدانید که کاربر در دوره آزمایشی "عمومی" خود است
و هنوز اشتراک واقعی ایجاد نکرده است،
می توانید از این روش استفاده کنید :
if ($user->onGenericTrial()) { // User is within their "generic" trial period...}
هیچ راهی برای تمدید یا تغییر دوره آزمایشی در اشتراک Paddle پس از ایجاد آن وجود ندارد.
رسیدگی به قلاب های وب پارویی
Paddle می تواند برنامه شما را از رویدادهای مختلف از طریق وب هوک ها مطلع کند. به طور پیش فرض، مسیری که به کنترلر وب هوک Cashier اشاره می کند توسط ارائه دهنده خدمات Cashier ثبت می شود. این کنترلر تمام درخواست های وب هوک دریافتی را رسیدگی می کند.
به طور پیشفرض، این کنترلکننده بهطور خودکار لغو اشتراکهایی را که هزینههای ناموفق زیادی دارند ( که توسط تنظیمات Paddle dunning شما تعریف شده است )، بهروزرسانیهای اشتراک و تغییرات روش پرداخت را کنترل میکند. با این حال، همانطور که به زودی متوجه خواهیم شد، میتوانید این کنترلر را برای مدیریت هر رویداد Paddle webhook که دوست دارید گسترش دهید.
برای اطمینان از اینکه برنامه شما میتواند به وبکهوکهای Paddle رسیدگی
کند، حتماً
URL وب هوک را در پانل کنترل Paddle پیکربندی کنید
. به طور پیش فرض، کنترلر وب هوک Cashier به
/paddle/webhook
مسیر URL پاسخ می دهد. لیست کامل تمام وبی هوک هایی که باید در کنترل پنل
Paddle فعال کنید عبارتند از:
- اشتراک ایجاد شد
- اشتراک به روز شد
- اشتراک لغو شد
- پرداخت با موفقیت انجام شد
- پرداخت اشتراک با موفقیت انجام شد
مطمئن شوید که از درخواستهای دریافتی با میانافزار تأیید امضای وبهوک شامل Cashier محافظت میکنید .
Webhooks & CSRF Protection
از آنجایی که وب هوک های Paddle باید
حفاظت CSRF
لاراول را دور بزنند ، حتماً URI را به عنوان یک استثنا در
App\Http\Middleware\VerifyCsrfToken
میان افزار خود فهرست کنید یا مسیر خارج از
web
گروه میان افزار را فهرست کنید:
protected $except = [ 'paddle/*',];
وب هوک ها و توسعه محلی
برای اینکه Paddle بتواند وب هوک های برنامه شما را در طول توسعه محلی ارسال کند، باید برنامه خود را از طریق یک سرویس اشتراک گذاری سایت مانند Ngrok یا Expose در معرض دید قرار دهید . اگر برنامه خود را به صورت محلی با استفاده از Laravel Sail توسعه می دهید، می توانید از دستور اشتراک گذاری سایت Sail استفاده کنید .
تعریف مدیریت رویداد Webhook
صندوق دار به طور خودکار لغو اشتراک را در صورت هزینه های ناموفق و سایر وب هوک های رایج Paddle کنترل می کند. با این حال، اگر رویدادهای webhook دیگری دارید که میخواهید مدیریت کنید، میتوانید این کار را با گوش دادن به رویدادهای زیر که توسط Cashier ارسال میشود انجام دهید:
-
Laravel\Paddle\Events\WebhookReceived
-
Laravel\Paddle\Events\WebhookHandled
هر دو رویداد حاوی بار کامل وب هوک Paddle هستند. برای مثال، اگر میخواهید
invoice.payment_succeeded
وب هوک را مدیریت کنید، میتوانید
شنوندهای را
ثبت کنید که رویداد را مدیریت کند:
<?php namespace App\Listeners; use Laravel\Paddle\Events\WebhookReceived; class PaddleEventListener{ /** * Handle received Paddle webhooks. * * @param \Laravel\Paddle\Events\WebhookReceived $event * @return void */ public function handle(WebhookReceived $event) { if ($event->payload['alert_name'] === 'payment_succeeded') { // Handle the incoming event... } }}
هنگامی که شنونده شما تعریف شد، می توانید آن را در برنامه خود ثبت کنید
EventServiceProvider
:
<?php namespace App\Providers; use App\Listeners\PaddleEventListener;use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;use Laravel\Paddle\Events\WebhookReceived; class EventServiceProvider extends ServiceProvider{ protected $listen = [ WebhookReceived::class => [ PaddleEventListener::class, ], ];}
صندوقدار همچنین رویدادهای اختصاص داده شده به نوع وب هوک دریافتی را منتشر می کند. علاوه بر بار کامل از Paddle، آنها همچنین حاوی مدلهای مربوطه هستند که برای پردازش وبقلاب استفاده شدهاند، مانند مدل قابل صورتحساب، اشتراک یا رسید:
-
Laravel\Paddle\Events\PaymentSucceeded
-
Laravel\Paddle\Events\SubscriptionPaymentSucceeded
-
Laravel\Paddle\Events\SubscriptionCreated
-
Laravel\Paddle\Events\SubscriptionUpdated
-
Laravel\Paddle\Events\SubscriptionCancelled
CASHIER_WEBHOOK
همچنین میتوانید با تعریف متغیر محیطی در فایل برنامه خود،
مسیر پیشفرض و داخلی هوک را لغو کنید
.env
. این مقدار باید URL کامل مسیر وب هوک شما باشد و باید با URL تنظیم شده در
پانل کنترل Paddle شما مطابقت داشته باشد:
CASHIER_WEBHOOK=https://example.com/my-paddle-webhook-url
تأیید امضاهای Webhook
برای ایمن سازی وب هوک های خود، می توانید از امضاهای وب هوک Paddle استفاده کنید . برای راحتی کار، Cashier به طور خودکار شامل یک میان افزار می شود که اعتبار درخواست دریافتی Paddle webhook را تأیید می کند.
برای فعال کردن تأیید وب هوک، مطمئن شوید که
PADDLE_PUBLIC_KEY
متغیر محیط در فایل برنامه شما تعریف شده است
.env
. ممکن است کلید عمومی از داشبورد حساب Paddle شما بازیابی شود.
شارژ تک
شارژ ساده
اگر میخواهید یک بار هزینه از مشتری دریافت کنید، میتوانید از روش
charge
نمونهای از مدل قابل پرداخت برای ایجاد پیوند پرداخت برای هزینه استفاده
کنید. این
charge
روش مقدار شارژ (float) را به عنوان اولین آرگومان خود و توضیح شارژ را به
عنوان آرگومان دوم خود می پذیرد:
use Illuminate\Http\Request; Route::get('/store', function (Request $request) { return view('store', [ 'payLink' => $user->charge(12.99, 'Action Figure') ]);});
پس از ایجاد پیوند پرداخت، میتوانید از
paddle-button
مؤلفه Blade ارائه شده توسط Cashier استفاده کنید تا به کاربر اجازه دهید
ویجت Paddle را راهاندازی کند و هزینه را تکمیل کند:
<x-paddle-button :url="$payLink" class="px-8 py-4"> Buy</x-paddle-button>
این
charge
روش یک آرایه را به عنوان آرگومان سوم خود می پذیرد و به شما امکان می دهد
هر گزینه ای را که می خواهید به ایجاد پیوند پرداخت Paddle زیربنایی منتقل کنید. لطفاً
برای کسب اطلاعات بیشتر درباره گزینههای موجود هنگام ایجاد هزینه، به
مستندات Paddle مراجعه کنید:
$payLink = $user->charge(12.99, 'Action Figure', [ 'custom_option' => $value,]);
هزینه ها به ارز مشخص شده در
cashier.currency
گزینه پیکربندی انجام می شود. به طور پیش فرض، این روی USD تنظیم شده است.
می توانید با تعریف
CASHIER_CURRENCY
متغیر محیطی در فایل برنامه خود، ارز پیش فرض را لغو کنید
.env
:
CASHIER_CURRENCY=EUR
همچنین میتوانید با استفاده از سیستم تطبیق قیمت پویا Paddle، قیمتهای هر ارز را لغو کنید . برای انجام این کار، به جای مقدار ثابت، آرایه ای از قیمت ها را ارسال کنید:
$payLink = $user->charge([ 'USD:19.99', 'EUR:15.99',], 'Action Figure');
شارژ محصولات
اگر میخواهید برای محصول خاصی که در Paddle پیکربندی شده است هزینه یکباره
بپردازید، میتوانید از روش موجود
chargeProduct
در نمونه مدل قابل پرداخت برای ایجاد پیوند پرداخت استفاده کنید:
use Illuminate\Http\Request; Route::get('/store', function (Request $request) { return view('store', [ 'payLink' => $request->user()->chargeProduct($productId = 123) ]);});
سپس، میتوانید پیوند پرداخت را به
paddle-button
مؤلفه ارائه دهید تا به کاربر اجازه دهید ویجت Paddle را مقداردهی اولیه
کند:
<x-paddle-button :url="$payLink" class="px-8 py-4"> Buy</x-paddle-button>
این
chargeProduct
روش آرایهای را بهعنوان آرگومان دوم خود میپذیرد و به شما امکان میدهد
هر گزینهای را که میخواهید به ایجاد پیوند پرداخت Paddle زیربنایی منتقل کنید. لطفاً
در مورد گزینههایی که هنگام ایجاد هزینه در دسترس شما هستند، به
اسناد Paddle مراجعه کنید:
$payLink = $user->chargeProduct($productId, [ 'custom_option' => $value,]);
سفارشات بازپرداخت
اگر نیاز به بازپرداخت سفارش Paddle دارید، می توانید از این
refund
روش استفاده کنید. این متد شناسه سفارش Paddle را به عنوان اولین آرگومان
خود می پذیرد. می توانید رسیدهای یک مدل قابل پرداخت را با استفاده از
receipts
روش زیر بازیابی کنید:
use App\Models\User; $user = User::find(1); $receipt = $user->receipts()->first(); $refundRequestId = $user->refund($receipt->order_id);
میتوانید به صورت اختیاری مبلغ خاصی را برای بازپرداخت و همچنین دلیل بازپرداخت مشخص کنید:
$receipt = $user->receipts()->first(); $refundRequestId = $user->refund( $receipt->order_id, 5.00, 'Unused product time');
هنگام تماس با پشتیبانی Paddle می توانید از آن
$refundRequestId
به عنوان مرجع بازپرداخت استفاده کنید.
رسیدها
میتوانید به راحتی مجموعهای از رسیدهای یک مدل قابل پرداخت را از طریق
receipts
دارایی زیر بازیابی کنید:
use App\Models\User; $user = User::find(1); $receipts = $user->receipts;
هنگام فهرست کردن رسیدها برای مشتری، میتوانید از روشهای نمونه رسید برای نمایش اطلاعات رسید مربوطه استفاده کنید. برای مثال، ممکن است بخواهید همه رسیدها را در یک جدول فهرست کنید تا کاربر بتواند به راحتی هر یک از رسیدها را دانلود کند:
<table> @foreach ($receipts as $receipt) <tr> <td>{{ $receipt->paid_at->toFormattedDateString() }}</td> <td>{{ $receipt->amount() }}</td> <td><a href="{{ $receipt->receipt_url }}" target="_blank">Download</a></td> </tr> @endforeach</table>
پرداخت های گذشته و آینده
میتوانید از روشها
lastPayment
و
nextPayment
روشها برای بازیابی و نمایش پرداختهای گذشته یا آتی مشتری برای اشتراکهای
تکراری استفاده کنید:
use App\Models\User; $user = User::find(1); $subscription = $user->subscription('default'); $lastPayment = $subscription->lastPayment();$nextPayment = $subscription->nextPayment();
هر دوی این روش ها نمونه ای از
Laravel\Paddle\Payment
; با این حال،
پس از پایان چرخه صورتحساب (مانند زمانی که اشتراک لغو شده است)
nextPayment
باز خواهد گشت :
null
Next payment: {{ $nextPayment->amount() }} due on {{ $nextPayment->date()->format('d/m/Y') }}
رسیدگی به پرداخت های ناموفق
پرداخت های اشتراک به دلایل مختلف مانند کارت های منقضی شده یا کارتی که وجوه کافی ندارد، با شکست مواجه می شوند. وقتی این اتفاق میافتد، توصیه میکنیم که به Paddle اجازه دهید مشکلات پرداخت را برای شما مدیریت کند. به طور خاص، میتوانید ایمیلهای صورتحساب خودکار Paddle را در داشبورد Paddle خود تنظیم کنید.
همچنین، میتوانید با
گوش دادن
به
subscription_payment_failed
رویداد Paddle از طریق
WebhookReceived
رویداد ارسال شده توسط Cashier، سفارشیسازی دقیقتری انجام دهید. همچنین
باید مطمئن شوید که گزینه «پرداخت اشتراک انجام نشد» در تنظیمات Webhook داشبورد Paddle شما فعال است:
<?php namespace App\Listeners; use Laravel\Paddle\Events\WebhookReceived; class PaddleEventListener{ /** * Handle received Paddle webhooks. * * @param \Laravel\Paddle\Events\WebhookReceived $event * @return void */ public function handle(WebhookReceived $event) { if ($event->payload['alert_name'] === 'subscription_payment_failed') { // Handle the failed subscription payment... } }}
هنگامی که شنونده شما تعریف شد، باید آن را در برنامه خود ثبت کنید
EventServiceProvider
:
<?php namespace App\Providers; use App\Listeners\PaddleEventListener;use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;use Laravel\Paddle\Events\WebhookReceived; class EventServiceProvider extends ServiceProvider{ protected $listen = [ WebhookReceived::class => [ PaddleEventListener::class, ], ];}
آزمایش کردن
در حین آزمایش، باید به صورت دستی جریان صورتحساب خود را آزمایش کنید تا مطمئن شوید که یکپارچه سازی شما همانطور که انتظار می رود کار می کند.
برای آزمایشهای خودکار، از جمله آزمایشهایی که در محیط CI انجام میشوند، میتوانید از HTTP Client لاراول برای جعل تماسهای HTTP که با Paddle انجام میشود استفاده کنید. اگرچه این پاسخهای واقعی Paddle را آزمایش نمیکند، اما راهی برای آزمایش برنامه شما بدون فراخوانی API Paddle ارائه میکند.