beebmx / laravel-pay
使用 Laravel 创建支付
Requires
- php: ^8.1
- guzzlehttp/guzzle: ^7.4
- illuminate/database: ^8.0|^9.0|^10.0
- illuminate/support: ^8.0|^9.0|^10.0
- illuminate/view: ^8.0|^9.0|^10.0
Requires (Dev)
- brianium/paratest: ^7.0
- conekta/conekta-php: ^4.3
- laravel/pint: ^1.11
- mockery/mockery: ^1.4
- nunomaduro/collision: ^5.10|^6.1|^7.0
- orchestra/testbench: ^6.20|^7.1|^8.0
- pestphp/pest: ^2.24
- pestphp/pest-plugin-drift: ^2.5
- phpunit/phpunit: ^10.0
- stripe/stripe-php: ^7.95
README
Laravel 的支付功能受到官方文档 Laravel Cashier 的启发。与 Cashier
相比,其方法略有不同,主要行为是支付交易。
安装
您可以通过 composer 安装此软件包
composer require beebmx/laravel-pay
您可以使用以下命令发布并运行迁移
php artisan vendor:publish --provider="Beebmx\LaravelPay\PayServiceProvider" --tag="pay-migrations" php artisan migrate
您可以使用以下命令发布配置文件
php artisan vendor:publish --provider="Beebmx\LaravelPay\PayServiceProvider" --tag="pay-config"
配置
在使用 Laravel 的支付
之前,您需要将 Payable
特性添加到您的用户模型中,默认位置在 App\Models\Users
use Beebmx\LaravelPay\Payable; class User extends Authenticatable { use Payable; }
自定义模型
您可以使用自己的模型来满足您的需求,只需在 App\Providers\AppServiceProvider
中设置,并在 boot
方法中通知 Laravel 的支付
use App\Models\Address; use App\Models\Pay\User; use App\Models\Transaction; use App\Models\TransactionItem; use Beebmx\LaravelPay\Pay; /** * Bootstrap any application services. * * @return void */ public function boot() { Pay::useCustomerModel(User::class); Pay::useAddressModel(Address::class); Pay::useTransactionModel(Transaction::class); Pay::useTransactionItemModel(TransactionItem::class); }
请记住,如果您为自定义模型更改此设置,请确保使用 Laravel 的支付
扩展这些模型
use Beebmx\LaravelPay\Address as PayAddress; class Address extends PayAddress { // }
驱动程序
沙盒
这是一个 playground,具有与测试或生产驱动程序相同的全部功能。
Stripe
要使用 stripe
驱动程序,您需要将其设置为默认驱动程序,并配置您的 testing
或 production
密钥
<?php return [ 'default' => 'stripe', 'drivers' => [ 'stripe' => [ 'driver' => Beebmx\LaravelPay\Drivers\StripeDriver::class, 'secret' => env('STRIPE_SECRET_KEY', null), 'public' => env('STRIPE_PUBLIC_KEY', null), 'webhooks' => [ 'handler' => Beebmx\LaravelPay\Http\Webhooks\StripeHandler::class, 'events' => [ 'customer.deleted', 'customer.updated', 'invoice.payment_action_required', 'payment_intent.canceled', 'payment_intent.payment_failed', 'payment_intent.requires_action', 'payment_intent.succeeded', ], ], ], ] ];
Conekta
要使用 conekta
驱动程序,您需要将其设置为默认驱动程序,并配置您的 testing
或 production
密钥
<?php return [ 'default' => 'conekta', 'drivers' => [ 'conekta' => [ 'driver' => Beebmx\LaravelPay\Drivers\ConektaDriver::class, 'secret' => env('CONEKTA_SECRET_KEY', null), 'public' => env('CONEKTA_PUBLIC_KEY', null), 'webhooks' => [ 'handler' => Beebmx\LaravelPay\Http\Webhooks\ConektaHandler::class, ], ], ] ];
客户
创建客户
一个 user
可以是客户(这不是强制要求)并将在相应的驱动程序中创建客户。要创建客户,只需使用 createCustomerWithDriver
方法即可。
$customer = $user->createCustomerWithDriver();
基本信息
当一个 user
成为 customer
时,用于创建它的列来自模型,但您可以使用以下方式自定义此信息:
public function driverName() { return "{$this->your_own_colunm_name} {$this->your_own_colunm_lastname}"; } public function driverEmail() { return $this->your_own_colunm_email; } public function driverPhone() { return $this->your_own_colunm_phone; }
创建一个用户对于定期支付或避免每次都请求支付方式可能很有用。
支付方式
要添加支付方式,首先您需要在驱动程序平台上有一个客户。拥有客户后,只需添加正确的 token
或 payment_method
$paymentMethod = $user->addPaymentMethod('pm_card_visa');
运输
如果您的支付包含运输,则在执行支付之前添加正确的地址
$address = $user->addresses->first(); $user->shipping($address);
请记住,此软件包有一个内置的
address
模型。
支付
执行支付就像
$user->charge([ 'name' => 'Product', 'price' => 500, ]);
如果您有多个产品或服务
$user->charge([[ 'name' => 'Product 01', 'price' => 100 ], [ 'name' => 'Product 02', 'price' => 200 ]]);
如果您有要应用的折扣,可以设置它
$user ->discount(200) ->charge([[ 'name' => 'Product 01', 'price' => 100, 'quantity' => 2 ], [ 'name' => 'Product 02', 'price' => 200, 'quantity' => 1, ]]);
或者,您可以使用更多信息设置它
$user ->discount([ 'amount' => 200, 'code' => 'coupon-code', ]) ->charge([[ 'name' => 'Product 01', 'price' => 100, 'quantity' => 2 ], [ 'name' => 'Product 02', 'price' => 200, 'quantity' => 1, ]]);
重要的是用户至少有一个
payment method
如果您有运输地址
$address = $user->addresses->first(); $user ->shipping($address) ->charge([ 'name' => 'Testing product', 'price' => 500, ]);
如果您不需要创建 payment method
,您可以使用一次性支付 token
创建 charge
$user ->token('tok_visa4242') ->charge([ 'name' => 'Testing product', 'price' => 500, ]);
如果您使用
token
选项,则createCustomerWithDriver
是可选的,不是必需的。
如果您需要支付 transaction
,您可以使用 getTransaction()
方法检索它
$payment = $user->charge([ 'name' => 'Product', 'price' => 500, ]); $payment->getTransaction()
Webhooks
默认情况下,Payments for Laravel
提供了方便的 Webhooks 管理。
首先,在您的 App\Http\Middleware\VerifyCsrfToken
文件中,您需要允许 WebhookController 的路径
protected $except = [ 'pay/webhooks', ];
默认路径是
pay/webhooks
,但您可以在配置文件中更改它,更新pay.path
和pay.webhooks
。
您可以在驱动程序提供商网站上手动创建您的端点或使用以下命令:
php artisan pay:webhook
驱动程序
sandbox
不允许创建 Webhooks。
处理器
《WebhookController》总是对来自驱动程序提供商发出的事件做出响应,并将其传递到正确的处理器。默认情况下,每个驱动程序都在 config/pay.php
文件中定义了自己的处理器。
'drivers' => [ 'stripe' => [ 'webhooks' => [ 'handler' => Beebmx\LaravelPay\Http\Webhooks\StripeHandler::class, 'events' => [ 'customer.deleted', 'customer.updated', 'invoice.payment_action_required', 'payment_intent.canceled', 'payment_intent.payment_failed', 'payment_intent.requires_action', 'payment_intent.succeeded', ], ], ], 'conekta' => [ 'webhooks' => [ 'handler' => Beebmx\LaravelPay\Http\Webhooks\ConektaHandler::class, ], ], ],
您可以通过自己的实现来更改处理器,只需扩展正确的处理器即可。
<?php use Beebmx\LaravelPay\Http\Webhooks\StripeHandler as PayStripeHandler; class StripeHandler extends PayStripeHandler { // ... }
方法名称应遵循约定,所有方法都应该以 handle
为前缀,后面紧跟您希望处理的自定义 webhook 的 "camel case" 名称。例如,如果您希望处理 payment_intent.succeeded
webhook,则应将 handlePaymentIntentSucceeded
方法添加到控制器中。
<?php use Beebmx\LaravelPay\Http\Webhooks\StripeHandler as PayStripeHandler; class StripeHandler extends PayStripeHandler { public function handlePaymentIntentSucceeded($payload) { // ... } }
在处理的每个方法中,始终都会收到一个与
$payload
对应的数组。
Webhook 事件
在每次 webhook 调用中,可能会触发以下事件
Beebmx\LaravelPay\Events\WebhookReceived
Beebmx\LaravelPay\Events\WebhookHandled
您可以根据需要创建自己的 payload
实现。
<?php namespace App\Listeners; use Beebmx\LaravelPay\Events\WebhookReceived; class StripeEventListener { public function handle(WebhookReceived $event) { // $event->payload['type'] } }
要监听此实现,需要在您的 App\Providers\EventServiceProvider
中注册。
<?php namespace App\Providers; use App\Listeners\StripeEventListener; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Beebmx\LaravelPay\Events\WebhookReceived; class EventServiceProvider extends ServiceProvider { protected $listen = [ WebhookReceived::class => [ StripeEventListener::class, ], ]; }
测试
composer test
变更日志
有关最近更改的更多信息,请参阅变更日志。
致谢
许可证
MIT 许可证(MIT)。有关更多信息,请参阅许可证文件。