Kit Alat Perdagangan Juruwang
- configuration
- stripe
- composer
- database migration
- API Keys
- braintree
- Nota Braintree Kunci API
- Konfigurasi Mata Wang
- Langganan
- Buat Langganan Jumlah langganan
- Jumlah cukai langganan
- Peratusan kadar cukai yang disegerakkan
- SUBSCRIPTION TARIKH ANCHOR Langganan Langganan Langganan Langganan
- Subscribe oleh Kad Kredit Kad Kad Non-Kredit
- Customer
- Buat pelanggan
- Sahkan nombor kad kredit pada fail Padam kad kredit
- Tentukan Webhook pengendali acara
- Takrifkan pengendali acara Webhook
- Kendalikan Stripe Webhooks
- Perlindungan Webhook & CSRF
- pengesahan tandatangan bhook
- Mengendalikan Braintree Webhooks
- Webhooks & CSRF Protection
- Langganan Gagal
- Bayaran Sekali
- Bayaran Mudah
- Invois
- Jana Invois PDF
- Juruwang Laravel
- Langgan
- Buat Langganan
- Semak status langgananTarikh sauh langganan
- Batalkan langganan Pelanggan
- Mengendalikan Kait Web Jalur
- Pengesahan tandatangan Webhook
-
- Langganan gagal
- Caj sekali
- Caj semula mudah
- Caj semula invois
Pemprosesan bayaran balik - Invois
- Janakan PDF
Pengenalan
Laravel Cashier menyediakan antara muka yang intuitif dan lancar untuk mengakses perkhidmatan langganan berbayar Stripe's dan Braintree's. Ia boleh mengendalikan kod langganan berbayar yang hampir membuat anda sakit kepala. Selain menyediakan pengurusan langganan asas, Juruwang boleh membantu anda dengan kupon, langganan pertukaran, "kuantiti" langganan, tempoh tangguh pembatalan dan juga menjana invois PDF.
StripePertama, tambahkan Pakej Juruwang Stripe pada tanggungan projek anda:{Nota} Jika anda hanya memerlukan caj "sekali" dan tidak menawarkan langganan, anda tidak seharusnya menggunakan Cashier. Anda disyorkan agar menggunakan SDK Stripe dan Braintree. .
composer require laravel/cashier
anda perlu membuat persediaan pangkalan data. Juruwang perlu menambah beberapa lajur pada jadualpengguna anda dan buat jadual langganan baharu untuk menampung semua langganan pelanggan anda: Setelah fail migrasi dibuat, jalankan PerintahSchema::table('users', function ($table) { $table->string('stripe_id')->nullable()->collation('utf8mb4_bin'); $table->string('card_brand')->nullable(); $table->string('card_last_four', 4)->nullable(); $table->timestamp('trial_ends_at')->nullable(); }); Schema::create('subscriptions', function ($table) { $table->increments('id'); $table->unsignedInteger('user_id'); $table->string('name'); $table->string('stripe_id')->collation('utf8mb4_bin'); $table->string('stripe_plan'); $table->integer('quantity'); $table->timestamp('trial_ends_at')->nullable(); $table->timestamp('ends_at')->nullable(); $table->timestamps(); });
migrate
Artisan.Model boleh bil Seterusnya, tambahkan Trait
Bilable
pada definisi model anda. Sifat ini menyediakan berbilang kaedah untuk melaksanakan tugas pembayaran biasa, seperti membuat langganan, menggunakan kupon dan mengemas kini maklumat kad kredit:use Laravel\Cashier\Billable;class User extends Authenticatable{ use Billable; }
API KeysAkhir sekali, Konfigurasi Kunci Stripe dalam fail konfigurasiservices.php
Anda boleh mendapatkan maklumat Kunci API Stripe ini dalam panel kawalan peribadi tapak web rasmi Stripe:Braintree'stripe' => [ 'model' => App\User::class, 'key' => env('STRIPE_KEY'), 'secret' => env('STRIPE_SECRET'), ],
Nota Braintree
Dalam banyak kes, Stripe dan Braintree melaksanakan fungsi Cashier dengan cara yang sama menyediakan fungsi pembayaran langganan melalui kad kredit, dan Braintree juga menyokong pembayaran melalui PayPal. Tetapi Braintree juga kekurangan beberapa ciri yang disokong oleh Stripe Sebelum memutuskan untuk menggunakan Stripe atau Braintree, anda perlu mempertimbangkan perkara berikut:
- Braintree menyokong PayPal tetapi Stripe tidak.
- Braintree tidak menyokong kaedah
kenaikan danpenurunan, ini adalah had Braintree, bukan had Juruwang. increment
和decrement
方法,这是 Braintree 的限制,而不是 Cashier 限制。 - Braintree 不支持基于百分比的折扣。这是 Braintree 的限制,而不是 Cashier 限制。
Composer
首先,将 Braintree 的 Cashier 包添加到您项目的依赖项中:
composer require "laravel/cashier-braintree":"~2.0"
信用卡优惠计划
在使用 Cashier 之前,你需要首先在 Braintree 控制面板中定义一个
plan-credit
折扣。这个折扣会根据用户选择的支付选项匹配合适的折扣比例,比如选择年付或者月付。在 Braintree 控制面板中配置的折扣总额可以随意填写,Cashier 会在每次使用优惠券的时候根据您的配置来覆盖该默认值。由于 Braintree 不支持使用订阅频率来匹配折扣比例,所以这个优惠券是必需的。
数据库迁移
开始使用 Cashier 之前,需要 准备数据库。Cashier 需要在您的数据库
users
表中新增几个列,以及创建一个新的subscriptions
表来存储客户的订阅信息:Schema::table('users', function ($table) { $table->string('braintree_id')->nullable(); $table->string('paypal_email')->nullable(); $table->string('card_brand')->nullable(); $table->string('card_last_four')->nullable(); $table->timestamp('trial_ends_at')->nullable(); }); Schema::create('subscriptions', function ($table) { $table->increments('id'); $table->unsignedInteger('user_id'); $table->string('name'); $table->string('braintree_id'); $table->string('braintree_plan'); $table->integer('quantity'); $table->timestamp('trial_ends_at')->nullable(); $table->timestamp('ends_at')->nullable(); $table->timestamps(); });
一旦迁移文件建立好后,运行 Artisan 的
migrate
命令。Billable 模型
然后,添加
Billable
Trait 到你的模型定义中:use Laravel\Cashier\Billable; class User extends Authenticatable{ use Billable; }
API Keys
紧接着,您应该在
services.php
文件中配置以下选项:'braintree' => [ 'model' => App\User::class, 'environment' => env('BRAINTREE_ENV'), 'merchant_id' => env('BRAINTREE_MERCHANT_ID'), 'public_key' => env('BRAINTREE_PUBLIC_KEY'), 'private_key' => env('BRAINTREE_PRIVATE_KEY'), ],
最后,您必须向
AppServiceProvider
服务提供者的boot
方法中,添加以下的 Braintree SDK 调用:\Braintree_Configuration::environment(config('services.braintree.environment')); \Braintree_Configuration::merchantId(config('services.braintree.merchant_id')); \Braintree_Configuration::publicKey(config('services.braintree.public_key')); \Braintree_Configuration::privateKey(config('services.braintree.private_key'));
货币配置
Cashier 使用美元(USD)作为默认货币。您可以通过在服务提供者的
Braintree tidak menyokong diskaun berasaskan peratusan. Ini adalah had Braintree, bukan had Juruwang. . "43008f">Sebelum menggunakan Juruwang, anda perlu terlebih dahulu menentukan diskaunboot
方法中调用Cashier::useCurrency
方法来更改默认的货币。这个useCurrency
kredit pelan dalam panel kawalan Braintree. Diskaun ini akan sepadan dengan nisbah diskaun yang sesuai berdasarkan pilihan pembayaran yang dipilih oleh pengguna, seperti pembayaran tahunan atau pembayaran bulanan. Jumlah amaun diskaun yang dikonfigurasikan dalam panel kawalan Braintree boleh diisi seperti yang dikehendaki, dan Juruwang akan menulis ganti nilai lalai mengikut konfigurasi anda setiap kali kupon digunakan. Kupon ini diperlukan kerana Braintree tidak menyokong penggunaan kekerapan langganan untuk memadankan nisbah diskaun. Migrasi pangkalan dataSebelum anda mula menggunakan Cashier, anda perlu menyediakan pangkalan data. Juruwang perlu menambah beberapa lajur baharu pada jadual
pengguna pangkalan data anda, serta mencipta jadual langganan baharu untuk menyimpan maklumat langganan pelanggan anda: use Laravel\Cashier\Cashier; Cashier::useCurrency('eur', '€');
Setelah penghijrahan fail dibuat Setelah selesai, jalankan perintahmigrate
Artisan.🎜🎜Model boleh dibilkan 🎜🎜Kemudian, tambahkan sifatBilable
pada definisi model anda: 🎜$user = User::find(1); $user->newSubscription('main', 'premium')->create($stripeToken);
🎜🎜API Keys🎜🎜Seterusnya, anda harus mengkonfigurasi pilihan berikut dalam failservices.php
: 🎜$user->newSubscription('main', 'monthly')->create($stripeToken, [ 'email' => $email, ]);
🎜Akhir sekali, anda mesti mengkonfigurasiAppServiceProvider kod> kod> Dalam kaedah
boot
pembekal perkhidmatan, tambahkan panggilan SDK Braintree berikut: 🎜$user->newSubscription('main', 'monthly') ->withCoupon('code') ->create($stripeToken);
🎜🎜🎜🎜Konfigurasi Mata Wang
🎜Juruwang menggunakan Dolar Amerika Syarikat (USD) sebagai mata wang lalai. Anda boleh menukar mata wang lalai dengan memanggil kaedahCashier::useCurrency
dalam kaedahboot
pembekal perkhidmatan. KaedahuseCurrency
menerima dua parameter rentetan: mata wang dan simbol mata wang: 🎜if ($user->subscribed('main')) { // }
🎜🎜🎜🎜🎜🎜🎜Langgan🎜🎜🎜🎜🎜🎜🎜Buat langganan
Untuk membuat langganan, anda perlu mendapatkan contoh model Boleh Dibilkan dahulu, yang biasanya merupakan contoh
AppUser
. Setelah anda memperoleh contoh model, anda boleh membuat langganan kepada model menggunakan kaedahnewSubscription
:AppUser
的一个实例。一旦您获取了模型实例,您可以使用newSubscription
方法创建模型的订阅:public function handle($request, Closure $next){ if ($request->user() && ! $request->user()->subscribed('main')) { // This user is not a paying customer... return redirect('billing'); } return $next($request); }
newSubscription
方法的第一个参数应该是订阅的名称。如果您的应用程序只提供一个订阅,那么您可以将其设置为main
orprimary
。第二个参数是用户订阅的 Stripe / Braintree 计划。这个值应该与 Stripe 或 Braintree 中的标识符对应。create
方法接受一个 Stripe 信用卡 / 源令牌,它将开始订阅,并使用客户 ID 和其他相关的账单信息更新数据库。用户其他的详细信息
如果您想要指定用户其他的详细信息,您可以通过将它们作为第二个参数传递给
create
方法:if ($user->subscription('main')->onTrial()) { // }
要了解更多关于 Stripe 或 Braintree 支持的额外字段,请查看 Stripe 的 内容创建客户文档 或对应的 Braintree 文档。
优惠券
如果您想在创建订阅时使用优惠券,您可以使用
withCoupon
方法:if ($user->subscribedToPlan('monthly', 'main')) { // }
检查订阅状态
一旦用户在您的应用程序订阅了,您可以使用各种方便的方法轻松地检查他们的订阅状态。首先,如果用户有一个激活的订阅,那么
subscribed
的方法将返回true
,即使订阅当前处于试用阶段:if ($user->subscription('main')->recurring()) { // }
这个
subscribed
方法还可以在 路由中间件 使用,允许您根据用户的订阅状态对路由和控制器进行访问:if ($user->subscription('main')->cancelled()) { // }
如果您想要确定用户是否仍然处于试用阶段,您可以使用
onTrial
方法。这个方法对于向用户显示他们仍然处于试用期的警告是很有用的:if ($user->subscription('main')->onGracePeriod()) { // }
基于给定的 Stripe / Braintree 计划 ID,可以使用
subscribedToPlan
方法来确定用户是否订阅了该计划。在本例中,我们将确定用户的main
订阅是否激活了monthly
计划:if ($user->subscription('main')->ended()) { // }
recurring
$user = App\User::find(1); $user->subscription('main')->swap('provider-plan-id');
Parameter pertama kaedahnewSubscription
hendaklah nama langganan itu. Jika aplikasi anda hanya menyediakan satu langganan, anda boleh menetapkannya kepadautama
atauprimary
. Parameter kedua ialah pelan Stripe/Braintree yang dilanggan oleh pengguna. Nilai ini harus sepadan dengan pengecam dalam Stripe atau Braintree. Kaedahcreate
menerima kad kredit/token sumber Stripe, yang akan memulakan langganan dan mengemas kini pangkalan data dengan ID pelanggan dan maklumat pengebilan lain yang berkaitan. 🎜🎜Butiran tambahan pengguna
🎜Jika anda ingin menentukan butiran pengguna tambahan, anda boleh berbuat demikian dengan menghantarnya sebagai Parameter kedua dihantar ke kaedahcreate
: 🎜$user->subscription('main') ->skipTrial() ->swap('provider-plan-id');
🎜Untuk mengetahui lebih lanjut tentang Stripe atau medan tambahan yang disokong oleh Braintree, lihat Stripe Kandungan Buat Dokumen Pelanggan atau Dokumen Braintree yang sepadan. 🎜🎜Kupon
🎜Jika anda ingin menggunakan kupon semasa membuat langganan, anda boleh menggunakanwithCoupon
kaedah :🎜$user = User::find(1); $user->subscription('main')->incrementQuantity(); // 对当前的订阅量加5... $user->subscription('main')->incrementQuantity(5); $user->subscription('main')->decrementQuantity(); // 对当前的订阅量减5... $user->subscription('main')->decrementQuantity(5);
🎜🎜🎜🎜 Semak status langganan 🎜🎜 sebaik sahaja pengguna berada dalam anda app Dilanggan, anda boleh menyemak status langganan mereka dengan mudah menggunakan pelbagai kaedah mudah. Mula-mula, jika pengguna mempunyai langganan aktif, maka kaedahmelanggan
akan mengembalikantrue
walaupun langganan sedang dalam percubaan: 🎜$user->subscription('main')->updateQuantity(10);
🎜subscribed< ini. /code> > Kaedah juga boleh digunakan dalam penghalaan middleware, membolehkan anda mengakses laluan dan pengawal berdasarkan status langganan pengguna: 🎜
:$user->subscription('main')->noProrate()->updateQuantity(10);
🎜 Jika anda ingin menentukan sama ada pengguna masih dalam fasa percubaan, anda boleh menggunakanpada percubaan
kaedah. Kaedah ini berguna untuk menunjukkan amaran kepada pengguna bahawa mereka masih dalam tempoh percubaan: 🎜public function taxPercentage() { return 20; }
🎜Berdasarkan ID pelan Stripe/Braintree yang diberikan, kaedahsubscribedToPlan
boleh digunakan untuk menentukan sama ada pengguna telah melanggan pelan tersebut. Dalam contoh ini, kami akan menentukan sama ada langgananutama
pengguna mempunyai pelanbulanan
diaktifkan: 🎜$user->subscription('main')->syncTaxPercentage();
🎜Kaedahberulang
boleh digunakan untuk menentukan jika pengguna pada masa ini Sudah melanggan dan tidak lagi dalam fasa percubaan: 🎜use App\User;use Carbon\Carbon; $user = User::find(1); $anchor = Carbon::parse('first day of next month'); $user->newSubscription('main', 'premium') ->anchorBillingCycleOn($anchor->startOfDay()) ->create($stripeToken);
🎜🎜Status Langganan Dibatalkan
Untuk menentukan sama ada pengguna pernah melanggan, tetapi telah membatalkan langganan mereka, anda boleh menggunakan kaedah
dibatalkan cancelled
方法:$user->subscription('main')->cancel();
您还可以确定用户是否已经取消了订阅,但是仍然处于订阅的「宽限期」,直到订阅完全过期为止。例如,如果用户在 3 月 5 日取消了原定于 3 月 10 日到期的订阅,那么用户将在 3 月 10 日之前进行「宽限期」。请注意,在此期间
subscribed
方法仍然返回true
:if ($user->subscription('main')->onGracePeriod()) { // }
如果要确定用户取消订阅的时间是否已不在其 “宽限期” 内,可以使用
ended
方法:$user->subscription('main')->cancelNow();
修改订阅计划
用户在您的应用程序中订阅了之后,他们可能会偶尔想要更改一个新的订阅计划。要将一个用户切换到一个新的订阅,需将订阅计划的标识符传递给
swap
方法:$user->subscription('main')->resume();
如果用户在试用期,试用期的期限会被保留。另外,如果订阅的数量存在「份额」,那么该份额也将保持。
如果你想在更改用户订阅计划的时候取消用户当前订阅的试用期,可以使用
skipTrial
方法:$user = User::find(1);$user->newSubscription('main', 'monthly') ->trialDays(10) ->create($stripeToken);
订阅量
{注意} 订阅量仅由 Cashier 的 Stripe 支持。Braintree 没有一个对应于 Stripe 的「数量」的特性。
有些时候订阅是会受「数量」影响的。举个例子,你的应用程序的付费方式可能是每个账户 / 月。你可以使用
incrementQuantity
和decrementQuantity
方法轻松地增加或减少你的订阅量:use Carbon\Carbon;$user->newSubscription('main', 'monthly') ->trialUntil(Carbon::now()->addDays(10)) ->create($stripeToken);
或者,你可以使用
updateQuantity
方法设定一个特定的数量:if ($user->onTrial('main')) { // } if ($user->subscription('main')->onTrial()) { // }
noProrate
方法可用于更新订阅的数量,而不会对收费进行定价:$user = User::create([ // Populate other user properties... 'trial_ends_at' => now()->addDays(10), ]);
要获得更多关于订阅量的信息,请参考 Stripe 文档.
订阅税额
在计费模式上实现
taxPercentage
方法,并且返回一个 0 到 100 不超过 2 位小数的数字,用来指定用户在订阅中支付的税率百分比。if ($user->onTrial()) { // 用户在他们的试用期内... }
taxPercentage
方法使你能够在模型的基础上应用税率,这对于一个跨越多个国家和税率的用户群可能有帮助。{注意}
taxPercentage
if ($user->onGenericTrial()) { // 用户在他们「一般」试用期... }
Anda juga boleh menentukan sama ada pengguna telah membatalkan langganan mereka, tetapi masih berada dalam "tempoh tangguh" langganan sehingga langganan tamat sepenuhnya. Contohnya, jika pengguna membatalkan langganan pada 5 Mac yang akan tamat tempoh pada 10 Mac, pengguna akan mempunyai "tempoh tangguh" sehingga 10 Mac. Sila ambil perhatian bahawa kaedahsubscribed
masih mengembalikantrue
pada masa ini:$user = User::find(1); $user->newSubscription('main', 'monthly')->create($stripeToken);
Jika anda ingin menentukan sama ada masa pengguna membatalkan langganan tidak lagi dalam " mereka " tempoh tangguh", anda boleh menggunakan < code>ended Kaedah:$user->createAsStripeCustomer();
🎜🎜🎜Ubah Suai Pelan Langganan< /h3>🎜Selepas pengguna melanggan apl anda, mereka mungkin sekali-sekala mahu menukar kepada pelan langganan baharu. Untuk menukar pengguna kepada langganan baharu, hantar pengecam pelan langganan kepada kaedah
swap
: 🎜$cards = $user->cards();
🎜Jika pengguna berada dalam tempoh percubaan, tempoh tempoh percubaan dikekalkan. Di samping itu, jika terdapat "kongsi" untuk bilangan langganan, bahagian itu juga akan dikekalkan. 🎜🎜Jika anda ingin membatalkan tempoh percubaan langganan semasa pengguna apabila menukar pelan langganan pengguna, anda boleh menggunakan kaedahskipTrial
: 🎜$card = $user->defaultCard();
🎜< /a>🎜🎜Langganan
🎜{Nota} Langganan hanya disokong oleh Cashier's Stripe. Braintree tidak mempunyai ciri "kuantiti" yang sepadan dengan Stripe. 🎜🎜🎜Kadangkala langganan akan dipengaruhi oleh "kuantiti". Contohnya, apl anda mungkin dicaj setiap akaun $10 / bulan. Anda boleh menambah atau mengurangkan langganan anda dengan mudah menggunakan kaedah
incrementQuantity
dandecrementQuantity
: 🎜if ($user->hasCardOnFile()) { // }
🎜 Sebagai alternatif, anda boleh menetapkannya menggunakan kaedahupdateQuantity
A kuantiti tertentu: 🎜$user->updateCard($stripeToken);
🎜 KaedahnoProrate
boleh digunakan untuk mengemas kini kuantiti langganan tanpa menetapkan harga caj: 🎜$user->updateCardFromStripe();
🎜Untuk maklumat lanjut tentang kuantiti langganan, sila rujuk Dokumentasi Jalur.🎜🎜🎜🎜Amaun cukai langganan
🎜Laksanakan kaedahtaxPercentage
pada mod pengebilan dan kembalikan nombor daripada 0 hingga 100 dengan tidak lebih daripada 2 tempat perpuluhan untuk menyatakan Peratusan cukai yang pengguna bayar pada langganan mereka. 🎜foreach ($user->cards() as $card) { $card->delete(); }
🎜 KaedahtaxPercentage
membolehkan anda menggunakan kadar cukai berdasarkan model, yang mungkin berguna untuk pangkalan pengguna yang merangkumi berbilang negara dan kadar cukai. 🎜🎜{Nota} Kaedah
taxPercentage
hanya digunakan pada model langganan berbayar. Jika anda menggunakan caj untuk membuat caj "sekali", anda perlu menentukan kadar cukai secara manual pada masa yang sama. 🎜🎜🎜🎜Peratusan Cukai Segerakkan
Apabila menukar nilai kod keras yang dikembalikan melalui kaedah
taxPercentage
, tetapan kadar cukai untuk sebarang langganan sedia ada pengguna akan kekal tidak berubah. Jika anda ingin mengemas kini kadar cukai untuk langganan sedia ada dengan nilaitaxPercentage
yang dikembalikan, anda harus memanggil kaedahsyncTaxPercentage
pada contoh langganan pengguna:taxPercentage
方法返回的硬编码值时,用户的任何现有订阅的税率设置将保持不变。如果要用返回的taxPercentage
值更新现有订阅的税率,应在用户的订阅实例上调用syncTaxPercentage
方法:$user->deleteCards();
订阅锚定日期
{注意} Cashier 中只有 Stripe 支持修改订阅锚定日期。
默认情况下,计费周期锚定是创建订阅的日期,如果使用试用期,则是试用结束的日期。如果要修改账单锚定日期,可以使用
anchorBillingCycleOn
方法:Route::post( 'stripe/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
有关管理订阅计费周期的详细信息,请参阅 Stripe 计费周期文档
取消订阅
在用户订阅上调用
cancel
方法用来取消订阅:protected $except = [ 'stripe/*', ];
当一个订阅被取消时,Cashier 将会自动在你的数据库中设置
ends_at
列。这个列经常被用来获悉subscribed
字段何时应该开始返回false
。例如,如果客户在 3 月 1 日取消订阅,但是订阅计划直到 3 月 5 日才结束,subscribed
方法将会继续返回true
一直到 3 月 5 日。你可以使用
onGracePeriod
方法确定用户是否确定订阅,但是仍然存在一个「宽限期」:<?php namespace App\Http\Controllers; use Laravel\Cashier\Http\Controllers\WebhookController as CashierController; class WebhookController extends CashierController{ /** * Handle invoice payment succeeded. * * @param array $payload * @return \Symfony\Component\HttpFoundation\Response */ public function handleInvoicePaymentSucceeded($payload) { // 此处处理事件 } }
如果你想马上取消订阅,请在用户的订阅中调用
cancelNow
方法:Route::post( 'stripe/webhook', '\App\Http\Controllers\WebhookController@handleWebhook' );
恢复订阅
如果一个用已经取消订阅,你可以在你希望恢复它的时候使用
resume
Route::post( 'stripe/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
Tarikh sauh langganan
{Nota} Only Stripe in Cashier menyokong pengubahsuaian tarikh sauh langganan.
Secara lalai, kitaran pengebilan berlabuh pada tarikh langganan dibuat atau jika menggunakan tempoh percubaan, tarikh percubaan tamat. Jika anda ingin mengubah suai tarikh utama pengebilan, anda boleh menggunakan kaedahanchorBillingCycleOn
:Route::post( 'braintree/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
Untuk mendapatkan maklumat lanjut tentang mengurus kitaran pengebilan langganan, lihat Dokumen kitaran pengebilan jalurBatal langganan
Panggil kaedahbatal
pada langganan pengguna untuk membatalkan langganan:protected $except = [ 'braintree/*', ];
Apabila langganan dibatalkan, Juruwang akan secara automatik menetapkan🎜Anda boleh menggunakan kaedahends_at dalam kod pangkalan data anda> lajur. Lajur ini selalunya digunakan untuk mengetahui bila medan
subscribed
harus mula mengembalikanfalse
. Sebagai contoh, jika pelanggan membatalkan langganan mereka pada 1 Mac, tetapi pelan langganan tidak tamat sehingga 5 Mac, kaedahdilanggan
akan terus mengembalikantrue
sehingga 5 Mac .onGracePeriod
untuk menentukan sama ada pengguna pasti akan melanggan, tetapi masih ada "tempoh tangguh": 🎜<?php namespace App\Http\Controllers; use Braintree\WebhookNotification; use Laravel\Cashier\Http\Controllers\WebhookController as CashierController; class WebhookController extends CashierController{ /** * Handle a new dispute. * * @param \Braintree\WebhookNotification $webhook * @return \Symfony\Component\HttpFoundation\Responses */ public function handleDisputeOpened(WebhookNotification $webhook) { // 此处处理时事件... } }
🎜Jika anda ingin membatalkan langganan serta-merta, sila hubungi < kod>batalkanSekarang dalam langganan pengguna Kaedah: 🎜Route::post( 'braintree/webhook', '\Laravel\Cashier\Http\Controllers\WebhookController@handleWebhook' );
🎜🎜🎜🎜Sambung semula langganan< /h3>🎜Jika seseorang menggunakan Langganan telah dibatalkan, anda boleh menggunakan kaedah
resume
apabila anda ingin meneruskannya. Pengguna 🎜mesti🎜 masih dalam tempoh tangguh mereka sebelum mereka boleh menyambung semula langganan mereka: 🎜// Stripe 接收分为单位的费用... $stripeCharge = $user->charge(100); // Braintree 接收美元为单位的费用... $user->charge(1);
🎜Jika pengguna telah membatalkan langganan mereka dan kemudian menyambung semula sebelum tempoh tangguh mereka, mereka tidak akan dibilkan serta-merta. Sebaliknya, langganan mereka akan diaktifkan semula dan mereka perlu membayar semula mengikut proses pembayaran asal. 🎜🎜🎜🎜🎜🎜🎜🎜Langganan Percubaan🎜🎜🎜🎜🎜🎜🎜Langgan menggunakan kad kredit
Jika anda ingin menyediakan tempoh percubaan kepada pelanggan anda dan mengumpul maklumat kaedah pembayaran pada masa yang sama, maka anda harus menggunakan kaedah
trialDays
semasa membuat langganan:trialDays
方法:$user->charge(100, [ 'custom_option' => $value, ]);
该方法会在数据库订阅记录上设置订阅期结束时间,以便告知 Sripe / Braintree 在此之前不要计算用户的账单信息。
{注意} 如果顾客没有在试用期结束前取消订阅,订阅会被自动结算,所以你应该确保告知你的用户他们的试用结束期。
trialUntil
方法允许提供DateTime
实例指定试用结束期:try { $response = $user->charge(100); } catch (Exception $e) { // }
你可以使用用户实例的
onTrial
方法或者订阅实例的onTrial
方法判断用户是否处于试用期。下面两个示例等价:// Stripe 接收分为单位的费用... $user->invoiceFor('One Time Fee', 500); // Braintree 接收美元为单位的费用... $user->invoiceFor('One Time Fee', 5);
非信用卡订阅
如果你不想在提供试用期的时候收集用户支付方式信息,只需设置用户记录的
trial_ends_at
列为期望的试用期结束日期即可,这通常在用户注册期间完成:$user->invoiceFor('Stickers', 500, [ 'quantity' => 50, ], [ 'tax_percent' => 21, ]);
{注意} 确保已添加
trial_ends_at
日期修改器 到模型定义。Cashier 把这种类型的引用称为「一般体验」,因为它没有关联任何已存在的订阅。如果当前的日期没有超过
trail_ends_at
值,User
实例的onTrial
方法将会返回true
:$user->invoiceFor('One Time Fee', 500, [ 'description' => 'your invoice description here', ]);
如果你希望明确的知道用户处于「一般」试用期,并且还未创建实际的订阅,那么你可以使用
onGenericTrial
方法:$stripeCharge = $user->charge(100); $user->refund($stripeCharge->id);
如果你准备给用户创建实际的订阅,通常你可以使用
newSubsription
方法:$invoices = $user->invoices(); // 结果包含处理中的发票... $invoices = $user->invoicesIncludingPending();
客户
创建客户
有时,您可能希望在未订阅的情况下创建 Stripe 客户。您可以使用
createAsStripeCustomer
方法完成此操作:<table> @foreach ($invoices as $invoice) <tr> <td>{{ $invoice->date()->toFormattedDateString() }}</td> <td>{{ $invoice->total() }}</td> <td><a href="/user/invoice/{{ $invoice->id }}">Download</a></td> </tr> @endforeach </table>
一旦在 Stripe 中创建了客户,您可以稍后开始订阅。
{提示} 在 Braintree 中创建客户使用的是
createAsBraintreeCustomer
方法。银行卡
接收信用卡
可计费模型实例上的
cards
方法返回LaravelCashierCard
实例的集合:use Illuminate\Http\Request; Route::get('user/invoice/{invoice}', function (Request $request, $invoiceId) { return $request->user()->downloadInvoice($invoiceId, [ 'vendor' => 'Your Company', 'product' => 'Your Product', ]); });
要检索默认卡,可以使用
Kaedah ini akan merekodkan langganan dalam pangkalan data Tetapkan masa tamat tempoh langganan pada apl untuk memberitahu Sripe/Braintree supaya tidak mengira maklumat pengebilan pengguna sehingga itu.defaultCard
rrreee{Nota} Langganan dibilkan secara automatik jika pelanggan tidak membatalkan sebelum percubaan tamat, jadi anda harus memastikan untuk memaklumkan pengguna anda tentang penghujung percubaan mereka.
KaedahtrialUntil
membenarkan menentukan tempoh tamat percubaan dengan menyediakan contohDateTime
:rrreeeAnda boleh menggunakanonTrial
kaedah contoh pengguna atau KaedahonTrial
tika langganan menentukan sama ada pengguna berada dalam tempoh percubaan. Dua contoh berikut adalah setara: 🎜rrreee🎜🎜🎜🎜🎜Langganan bukan kad kredit 🎜🎜 Jika anda tidak mahu mengumpul maklumat kaedah pembayaran pengguna semasa menawarkan tempoh percubaan, cuma tetapkan lajurtrial_ends_at
rekod pengguna kepada tarikh tamat percubaan yang diingini, yang biasanya dilakukan semasa pendaftaran pengguna: 🎜 rrreee🎜{Nota} Pastikan anda telah menambahkan pengubah tarikh
🎜Juruwang memanggil sebut harga jenis ini sebagai "pengalaman generik" kerana ia tidak dikaitkan dengan sebarang langganan sedia ada. Jika tarikh semasa tidak melebihi nilaitrial_ends_at
pada definisi model. 🎜trail_ends_at
, kaedahonTrial
contohUser
akan mengembalikantrue
: 🎜rrreee🎜 Jika anda ingin mengetahui secara jelas bahawa pengguna berada dalam tempoh percubaan "umum" dan belum membuat langganan sebenar, maka anda boleh menggunakan kaedahonGenericTrial
: 🎜rrreee🎜Jika anda akan membuat langganan sebenar untuk pengguna, biasanya Anda boleh menggunakan kaedahnewSubsription
: 🎜rrreee🎜🎜🎜🎜Pelanggan
🎜🎜🎜🎜🎜Mencipta Pelanggan🎜🎜Sometimes, you maySometimes mahu mencipta pelanggan Stripe tanpa langganan. Anda boleh melakukan ini menggunakan kaedahcreateAsStripeCustomer
: 🎜rrreee🎜Setelah pelanggan dibuat dalam Stripe, anda boleh memulakan langganan kemudian. 🎜🎜{Tip} Untuk mencipta pelanggan dalam Braintree, gunakan kaedah
🎜🎜🎜createAsBraintreeCustomer
. 🎜🎜Kad bank
🎜🎜🎜🎜🎜Terima kad kredit🎜🎜Kaedahkad pada contoh model yang boleh dibilkan mengembalikan LaravelCashierCard< / Koleksi kod> contoh: 🎜rrreee🎜Untuk mendapatkan semula kad lalai, anda boleh menggunakan kaedah
defaultCard
🎜rrreee🎜🎜🎜🎜🎜🎜;Pastikan nombor kad ada dalam fail
Anda boleh menyemak sama ada pelanggan mempunyai kad kredit yang disimpan pada akaun mereka menggunakan kaedah
rrreeehasCardOnFile
:hasCardOnFile
方法检查客户是否在其帐户上储存了信用卡:更新信用卡
rrreeeupdateCard
方法可用于更新用户的信用卡信息,该方法接受一个 Stripe 令牌并设置一个新的信用卡作为默认支付源:将您的卡信息与客户的默认卡信息进行 Stripe 同步,可以使用
rrreeeupdateCardFromStripe
方法:删除信用卡
要删除卡,应首先使用
rrreeecards
方法检索客户的卡。然后,可以调用要删除的卡实例上的delete
方法:{注意} 如果要删除默认卡,请确保使用
updateCardFromStripe
方法将新的默认卡与数据库同步。
rrreeedeleteCards
方法将删除应用程序存储的用户的所有卡信息:{注意} 如果用户已有订阅,则应考虑阻止他们删除最后剩余的付款方式。
处理 Stripe Webhooks
Stripe 和 Braintree 都可以通过 webhook 通知应用各种各样的事件。要处理 Stripe webhook,需要定义一个 Cashier 的 webhook 控制器的路由。这个控制器可以处理所有进入 webhook 的请求并将他们分发到合适的控制器方法中:
rrreee{注意} 一旦注册了路由,确保在您的 Stripe 控制面板配置了 webhook URL。
默认情况下,这个控制器将会自动对支付失败次数过多(这个次数可以在 Stripe 设置中定义)的订阅进行取消;此外,我们很快会发现,你可以扩展这个控制器去处理任何你想要处理的 webhook 事件。
{注意} 请确保使用 Cashier 的 webhook 验签 中间件来保护传入请求。
Webhooks & CSRF 保护
因为 Stripe webhooks 需要绕过 Laraval 的 CSRF 保护,请确保在你的
VerifyCsrfToken
中间件含有 URI ,或者将其置于web
rrreeeKemas kini Kad Kredit KaedahupdateCard
boleh digunakan untuk mengemas kini maklumat kad kredit pengguna. Kaedah ini menerima token Stripe dan menetapkan kad kredit baharu sebagai pembayaran lalai Sumber: 🎜rrreee🎜Untuk Stripe menyegerakkan maklumat kad anda dengan maklumat kad lalai pelanggan, anda boleh menggunakan kaedahupdateCardFromStripe
: 🎜rrreee🎜< a name="deleting-credit-cards">🎜🎜< div name="cf7a10" data-unique="cf7a10">🎜🎜Padam Kad Kredit🎜🎜Untuk memadamkan kad, anda perlu mendapatkan semula kad pelanggan menggunakan < kaedah kod>kad. Anda kemudiannya boleh memanggil kaedahdelete
pada contoh kad yang ingin anda padamkan: 🎜rrreee🎜{Nota} Jika anda ingin memadamkan kad lalai, pastikan anda menggunakan
🎜updateCardFromStripe
kaedah untuk mengemas kini kad baharu Kad lalai disegerakkan dengan pangkalan data. Kaedah 🎜deleteCards
akan memadamkan semua maklumat kad pengguna yang disimpan oleh aplikasi: 🎜rrreee🎜{Nota} Jika pengguna sudah mempunyai langganan, anda harus mempertimbangkan untuk menghalangnya daripada memadamkan baki kaedah pembayaran terakhir. 🎜
🎜🎜🎜🎜Mengendalikan Stripe Webhooks
🎜Stripe and Braintree Aplikasi boleh dimaklumkan tentang pelbagai acara melalui webhooks. Untuk mengendalikan webhook Stripe, anda perlu menentukan laluan ke pengawal webhook Cashier. Pengawal ini mengendalikan semua permintaan yang masuk ke webhook dan menghantarnya ke kaedah pengawal yang sesuai: 🎜rrreee🎜{Nota} Setelah laluan didaftarkan, pastikan URL webhook dikonfigurasikan dalam panel kawalan Stripe anda. 🎜
🎜Secara lalai, pengawal ini secara automatik akan membatalkan langganan yang mempunyai terlalu banyak pembayaran yang gagal (nombor ini boleh ditakrifkan dalam tetapan Stripe, kami akan mendapati bahawa anda boleh melanjutkan pengendali kawalan ini untuk mengendalikan mana-mana webhook). acara yang anda inginkan. 🎜🎜{Nota} Sila pastikan anda menggunakan perisian tengah pengesahan tandatangan webhook Cashier untuk melindungi permintaan masuk. 🎜
🎜Webhooks & CSRF Protection
🎜Oleh kerana Stripe webhooks perlu memintas perlindungan CSRF Laraval, sila pastikan anda menambahkannyaVerifyCsrfToken
middleware anda mengandungi URI, atau letakkan di luar kumpulan middlewareweb
: 🎜rrreee🎜🎜🎜🎜🎜🎜Tentukan pengendali acara Webhook
Juruwang secara automatik menyahlanggan untuk pembayaran yang gagal, tetapi jika anda mempunyai acara webhook Stripe lain yang anda mahu kendalikan, anda boleh melanjutkan pengawal Webhook. Nama kaedah anda hendaklah sepadan dengan konvensyen yang dijangkakan oleh Cashier, lebih khusus lagi, kaedah yang anda ingin mengendalikan webhook Stripe hendaklah diawali dengan
rrreeehandle
dan nama "camelCase". Contohnya, jika anda ingin mengendalikan webhookinvoice.payment_succeeded
, anda harus menambah kaedahhandleInvoicePaymentSucceeded
dalam pengawal:handle
和 「驼峰」 名为前缀。举例来说,如果你希望处理invoice.payment_succeeded
的 webhook,你应该在控制器添加handleInvoicePaymentSucceeded
方法:接下来,在
rrreeeroutes/web.php
文件中定义 Cashier 控制器的路由:订阅失败
如果用户的信用卡过期怎么办?不用担心 - Cashier 包含了一个 Webhook 控制器可以轻松为你取消用户的订阅。正如上文所述,你需要做的只是将路由指向控制器:
rrreee就是这样!失败的支付将会被控制器捕获并处理,该控制器会在 Stripe 判断订阅失败后(通常尝试支付失败 3 次及以上)取消用户的订阅。
Webhook 验签
为了保护 Webhook,你需要使用 Stripe 的 webhook 签名。为了方便起见,Cashier 包含一个中间件,用于验证传入 Stripe webhook 的请求是否有效。
如果要启用 Webhook 验证,请确保在
services
配置文件中设置了stripe.webhook.secret
的值。 Webhook 的secret
可以从 Stripe 用户控制面板中找到。处理 Braintree Webhooks
Stripe 和 Braintree 都可以通过 webhooks 通知应用各种各样的事件。要处理 Braintree webhooks,需要定义一个 Cashier webhook 控制器的路由。这个控制器可以处理所有传入 webhook 的请求并将它们分发到合适的路由器方法中:
rrreee{注意} 一旦注册了路由,确保在 Braintree 控制器面板配置了 webhook URL。
默认情况下,这个控制器将会自动对支付失败次数过多(这个次数可以在 Braintree 设置中定义)的订阅进行取消;此外,我们很快会发现,你可以扩展这控制器去处理任何你想要处理的 webhook 事件。
Webhooks & CSRF 保护
因为 Braintree webhooks 需要绕过 Laravel 的 CSRF 保护,请确保在你的
Seterusnya, dalamVerifyCsrfToken
中间件列表中含有 URI ,或者将其置于web
rrreeeroutes/ web Tentukan laluan pengawal Juruwang dalam fail .php
:Langganan Gagal🎜🎜Bagaimana jika kad kredit pengguna tamat tempoh? Jangan risau – Juruwang menyertakan pengawal webhook yang boleh menyahlanggan pengguna untuk anda dengan mudah. Seperti yang dinyatakan di atas, semua yang anda perlu lakukan ialah halakan laluan ke pengawal: 🎜rrreee🎜Itu sahaja! Pembayaran yang gagal akan ditangkap dan diproses oleh pengawal, yang akan membatalkan langganan pengguna selepas Stripe menentukan bahawa langganan gagal (biasanya 3 percubaan pembayaran gagal atau lebih). 🎜🎜🎜🎜🎜🎜Webhook signature verification🎜🎜Untuk melindungi Webhook, anda perlu menggunakan Tandatangan webhook Stripe 🎜. Untuk kemudahan, Cashier menyertakan perisian tengah yang mengesahkan bahawa permintaan yang dihantar ke webhook Stripe adalah sah. 🎜🎜Jika anda ingin mendayakan pengesahan webhook, pastikan nilaistripe.webhook.secret
ditetapkan dalam fail konfigurasiservices
.rahsia
webhook boleh didapati daripada panel kawalan pengguna Stripe. 🎜🎜🎜🎜🎜Mengendalikan Braintree Webhooks
🎜Stripe dan Braintree boleh menggunakan webhooks Maklumkan permohonan pelbagai acara. Untuk mengendalikan webhooks Braintree, anda perlu menentukan laluan ke pengawal webhook Cashier. Pengawal ini mengendalikan semua permintaan webhook yang masuk dan menghantarnya ke kaedah penghala yang sesuai: 🎜rrreee🎜{Nota} Setelah laluan didaftarkan, pastikan URL webhook dikonfigurasikan dalam panel pengawal Braintree. 🎜
🎜Secara lalai, pengawal ini secara automatik akan membatalkan langganan yang mempunyai terlalu banyak pembayaran yang gagal (nombor ini boleh ditakrifkan dalam tetapan Braintree, kami tidak lama lagi akan mendapati bahawa anda boleh melanjutkan pengendali kawalan ini untuk mengendalikan sebarang acara webhook yang anda mahukan. 🎜🎜Webhooks & CSRF Protection
🎜Oleh kerana webhook Braintree perlu memintas perlindungan CSRF Laravel, sila pastikan anda menambahkannya padaanda VerifyCsrfToken< /code> Sertakan URI dalam senarai middleware, atau letakkan di luar kumpulan middleware web
: 🎜rrreee🎜🎜🎜🎜🎜🎜Tentukan pengendali acara Webhook
Juruwang secara automatik menyahlanggan untuk pembayaran yang gagal, tetapi jika anda mempunyai acara webhook Braintree lain yang anda mahu kendalikan, anda boleh melanjutkan pengawal Webhook. Nama kaedah anda hendaklah sepadan dengan konvensyen yang dijangkakan oleh Cashier, lebih khusus lagi, kaedah yang anda ingin mengendalikan webhook Braintree hendaklah diawali dengan
rrreeehandle
dan nama "camelCase". Contohnya, jika anda ingin mengendalikan webhookdispute_opened
, anda harus menambahkan kaedahhandleDisputeOpened
pada pengawal anda:handle
和「驼峰」名为前缀。举例来说,如果你希望处理dispute_opened
这个 webhook,你应该在控制器添加handleDisputeOpened
方法:订阅失败
如果用户的信用卡过期怎么办?不用担心 - Cashier 包含了一个 Webhook 控制器可以轻松为你取消用户的订阅。只需要将路由指向控制器中:
rrreee就是这样!失败的支付将会被控制器捕获和处理,该控制器会在 Braintree 判断订阅失败后(通常尝试支付失败 3 次及以上)取消用户的订阅。 不要忘记:在你的 Braintree 控制器面板中配置 webhook URI。
一次性支付
简单支付
{注意} 当使用 Stripe 时,
charge
方法接收你想支付于 应用程序使用的货币的最小单位 的金额。然而,当使用 Braintree 时,你应该将全部的美元金额传入charge
方法:如果你想对订阅客户的信用卡收取「一次性」费用,可以在可计费模型实例上使用
rrreeecharge
方法:
rrreeecharge
方法接受一个数组作为它的第二个参数,允许你创建支付时将任何你想要的选项传递给底层的 Stripe / Braintree 。 有关在创建支付时可用的选项,请参阅 Stripe 或 Braintree 文档:如果支付失败,
charge
rrreeeLangganan gagalBagaimana jika kad kredit pengguna tamat tempoh? Jangan risau – Juruwang menyertakan pengawal webhook yang boleh menyahlanggan pengguna untuk anda dengan mudah. Hanya halakan laluan ke dalam pengawal: 🎜rrreee🎜Itu sahaja! Pembayaran yang gagal akan ditangkap dan diproses oleh pengawal, yang akan membatalkan langganan pengguna selepas Braintree menentukan bahawa langganan gagal (biasanya 3 percubaan pembayaran gagal atau lebih). Jangan lupa: konfigurasikan URI webhook dalam panel pengawal Braintree anda. 🎜🎜🎜🎜🎜Bayaran sekali
🎜🎜🎜🎜🎜Bayaran mudah🎜🎜🎜🎜🎜{Nota} Apabila menggunakan Stripe, kaedah
🎜Jika anda ingin mengenakan bayaran "sekali" kepada kad kredit pelanggan, anda boleh berbuat demikian dalam Gunakan kaedahcaj
menerima pembayaran yang anda mahukan untuk membuat dalam < Unit terkecil mata wang yang digunakan oleh aplikasiAmaun. Walau bagaimanapun, apabila menggunakan Braintree, anda harus menyerahkan keseluruhan jumlah dolar ke dalam kaedahcaj
: 🎜caj
pada contoh model pengebilan: 🎜rrreee🎜 Kaedahcaj
menerima tatasusunan sebagai parameter kedua, membolehkan anda membuat pembayaran dengan apa sahaja anda mahu Pilihan dihantar ke Stripe/Braintree yang mendasari. Lihat dokumentasi Stripe atau Braintree untuk pilihan yang tersedia semasa membuat pembayaran: 🎜rrreee🎜Kaedahcaj
akan memberikan pengecualian jika pembayaran gagal. Jika pembayaran berjaya, kaedah ini akan mengembalikan jawapan penuh Stripe / Braintree: 🎜rrreee🎜🎜🎜🎜🎜🎜Yuran dan Invois
Kadangkala anda mungkin perlu membayar yuran sekali sahaja dan juga perlu menjana invois yuran supaya anda boleh memberikan resit dalam format fail PDF kepada pelanggan anda. Kaedah
rrreeeinvoiceFor
membolehkan anda melakukan ini. Contohnya, invois pelanggan untuk "yuran sekali" sebanyak $5.00:invoiceFor
方法可以让你做到这一点。 例如,向客户开具 5.00 美元的「一次性费用」发票:该发票会立即通过用户信用卡支付。
rrreeeinvoiceFor
方法接收一个数组作为第三个参数,允许你在创建支付时将任何你想要的选项传递给底层的 Stripe / Braintree :如果你使用 Braintree 作为你的账单提供者,你在调用
rrreeeinvoiceFor
方法时必须包含description
选项:{注意}
invoiceFor
方法将会创建 Stripe 发票,该发票将会在支付失败后重试。如果你不想失败后重试,你需要在第一次支付失败后调用 Stripe API 关闭它。关于退款
如果您需要处理退款,您可以使用
rrreeerefund
方法。此方法接受 Stripe charge ID 作为其唯一参数:发票
您可以使用
rrreeeinvoices
方法轻松获取账单模型的发票数组:当列出客户发票清单时,可以使用发票辅助函数来显示相关的发票信息。例如,您可能希望在表格中列出每张发票,从而方便客户下载它们:
rrreee生成 PDF 发票
在路由或控制器中,使用
Invois dibayar segera kepada kad kredit pengguna. KaedahdownloadInvoice
rrreeeinvoiceFor
menerima tatasusunan sebagai parameter ketiga, membolehkan anda menghantar sebarang pilihan yang anda mahukan kepada Stripe/Braintree asas semasa membuat pembayaran: {Nota} KaedahinvoiceFor
akan mencipta Invois Stripe , yang akan dicuba semula selepas pembayaran gagal. Jika anda tidak mahu mencuba semula selepas kegagalan, anda perlu menghubungi API Stripe untuk menutupnya selepas pembayaran pertama gagal.🎜🎜Perihal Bayaran Balik🎜🎜Jika anda perlu memproses bayaran balik, anda boleh menggunakan kaedahbayaran balik
. Kaedah ini menerima ID caj Stripe sebagai satu-satunya parameternya: 🎜rrreee🎜🎜🎜🎜Invois
🎜 Anda Tatasusunan invois model pengebilan boleh diperoleh dengan mudah menggunakan kaedahinvois: 🎜rrreee🎜Apabila menyenaraikan senarai invois pelanggan, anda boleh menggunakan fungsi pembantu invois untuk memaparkan maklumat invois yang berkaitan. Sebagai contoh, anda mungkin mahu menyenaraikan setiap invois dalam jadual untuk memudahkan pelanggan memuat turunnya: 🎜rrreee🎜🎜🎜 🎜🎜Jana invois PDF🎜🎜Dalam laluan atau pengawal, gunakan kaedahmuat turunInvois
untuk menjana muat turun PDF bagi invois. Kaedah ini secara automatik akan menjana respons muat turun HTTP yang sesuai kepada penyemak imbas: 🎜rrreee🎜Artikel ini pertama kali diterbitkan di tapak web 🎜LearnKu.com🎜. 🎜🎜Laman web PHP Cina
- billable Model