案例 PayZephyr:一个 Payment facade 统一 8 家支付网关的 Laravel 包

2026-10-10 21:04:32

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。

特性

  • 八个驱动,共用一套 Payment facade
  • 自动 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

源码:github.com/KenDeNigerian/payzephyr

复制全文 生成海报 支付 Laravel PHP

推荐文章

程序员茄子在线接单