PayZephyr:一个 Payment facade 统一 8 家支付网关的 Laravel 包
PayZephyr 是 Nwaneri Chukwunyere Kenneth 写的 Laravel 支付包,把 Paystack、Stripe、PayPal、Flutterwave、Square、Monnify、OPay、Mollie 八家网关放到同一个 Payment facade 后面,调用方式保持一致的流式 API。
项目地址:github.com/KenDeNigerian/payzephyr,文档另有自定义驱动、队列集成和生产检查清单的内容,还提供了一个 playground。
特性
- 八个驱动,共用一套
Paymentfacade - 自动 failover:默认 provider 失败时回落到配置的备用 provider
- 防重复扣款
- 签名 webhook:校验签名,并做防重放
- 订阅
- 退款,支持全额与部分退款
发起支付
use KenDeNigerian\PayZephyr\Facades\Payment;
Route::get('/checkout', function (Order $order) {
return Payment::amount(500.00)
->email($order->user->email)
->reference('order_'.$order->id)
->callback(route('payment.callback'))
->redirect();
});
回调里 verify
Route::get('/payment/callback', function (Request $request) {
$verification = Payment::verify($request->query('reference'));
if ($verification->isSuccessful()) { /* Mark the order paid. */ }
})->name('payment.callback');
回调不要直接相信 query 里的状态,用 reference 走 verify() 拿一次结果,再据此把订单标为已支付。
自动 failover
在两个环境变量里指定默认和备用 provider:
PAYMENTS_DEFAULT_PROVIDER=paystack
PAYMENTS_FALLBACK_PROVIDER=stripe
订阅
用 planData 配合 SubscriptionPlanDTO 先建套餐,再订阅:
$plan = Payment::subscription()->planData(new SubscriptionPlanDTO(name: 'Pro Monthly', amount: 20.00, interval: 'monthly', currency: 'USD'))->with('stripe')->createPlan();
Payment::subscription()->customer($user->email)->plan($plan->planCode)->idempotency()->with('stripe')->subscribe();
订阅链路里带上 idempotency(),重试时不容易重复下单。
退款
定义了 amount() 就是部分退款:
$refund = Payment::refund('txn_ref_123')->amount(25.00)->reason('customer requested partial refund')->with('paystack')->refund();
文档特别提示要查 $refund->isPending():部分 provider 的退款不是同步结算,响应里只是受理,实际到账要等后续 webhook 通知。所以退款成功的判定不能只看接口返回,得把 pending 状态和 webhook 一起处理。
安装
composer require kendenigerian/payzephyr
php artisan payzephyr:install