Eight new features landed since 3.1.0, all fully backward-compatible. No removed methods, no signature changes, nothing to migrate.
The retry middleware now handles 429 Too Many Requests. When PayPal sends a Retry-After header the delay respects it exactly; without it, the existing exponential backoff kicks in (500ms, 1s, 2s, up to 8s). Nothing to configure.
Typed readonly wrapper around PayPal webhook payloads:
use Srmklive\PayPal\Events\WebhookEvent;
$event = WebhookEvent::fromRawBody($request->getContent());
if ($event->is('PAYMENT.CAPTURE.COMPLETED')) {
$captureId = $event->resource['id'];
}
Fields: id, eventType, resourceType, summary, createTime, resource, rawPayload.
Four wrappers on top of listTransactions() for the common cases:
// Single transaction by ID, looks back up to 31 days
$tx = $provider->getTransactionDetails('5TY05013RG002845M');
// Date range shorthand, no manual ISO 8601 formatting needed
$txns = $provider->listTransactionsForDateRange('2025-01-01', '2025-01-31');
// Filter by PayPal transaction type code
$txns = $provider->listTransactionsByType('T0006', '2025-01-01', '2025-01-31');
// Filter by status (S = success, P = pending, etc.)
$txns = $provider->listTransactionsByStatus('S', '2025-01-01', '2025-01-31');
// Alias for activateSubscription() with a sensible default reason
$provider->reactivateSubscription($subscriptionId);
// True only when status === 'ACTIVE'
if ($provider->isSubscriptionActive($subscriptionId)) { ... }
A public MockPayPalClient lives at Srmklive\PayPal\Testing\MockPayPalClient. Queue responses in tests without touching the sandbox:
use Srmklive\PayPal\Testing\MockPayPalClient;
$client = new MockPayPalClient($credentials);
$client->addResponse(201, ['id' => 'ORDER-123', 'status' => 'CREATED']);
$order = $client->createOrder([...]);
// $client->requests() to inspect what was sent
Fluent builder for billing plan payloads. Covers all cycle types, trial pricing, and payment preferences:
use Srmklive\PayPal\Services\BillingPlanBuilder;
$plan = BillingPlanBuilder::make('Pro Plan', 'PROD-ABC123')
->trialCycle(days: 14, price: 0)
->monthlyPrice(29.99)
->build();
$response = $provider->createBillingPlan($plan);
Set the PayPal-Partner-Attribution-Id BN code once after initialisation and it sticks for all subsequent requests from that instance:
$provider->setPartnerAttributionId('YourBNCode_Cart');
setPaymentSourcePayUponInvoice() joins the existing payment source setters. Available for merchants in Germany and Austria:
$provider->setPaymentSourcePayUponInvoice([
'name' => ['given_name' => 'John', 'surname' => 'Doe'],
'email' => 'john.doe@example.com',
'birth_date' => '1990-01-01',
'phone' => ['country_code' => '49', 'national_number' => '1234567890'],
'billing_address' => [
'address_line_1' => 'Hauptstraße 1',
'admin_area_2' => 'Berlin',
'postal_code' => '10115',
'country_code' => 'DE',
],
'experience_context' => [
'locale' => 'de-DE',
'return_url' => 'https://example.com/paypal-success',
'cancel_url' => 'https://example.com/paypal-cancel',
],
]);
$order = $provider->createOrderWithPaymentSource([
'intent' => 'CAPTURE',
'purchase_units' => [['amount' => ['currency_code' => 'EUR', 'value' => '99.00']]],
]);
composer update srmklive/paypal
No code changes required.
Starting with v3.1, Blendbyte is taking over active maintenance of srmklive/paypal. We're a cloud infrastructure and software development company that builds and operates Laravel applications for our own products and for clients. This package has been a dependency in our stack for years across dozens of projects, so when the opportunity came up to take over maintainership we didn't think twice. We're stoked to give it the attention it deserves.
A huge thank you to [@srmklive](https://github.com/srmklive) for building and maintaining this package across 110+ releases and nearly 4 million Packagist installs. His work gave the Laravel ecosystem a reliable PayPal integration for years, and we're grateful for the trust he's placed in us to carry it forward. He'll stay on as a contributor.
This release is fully backward-compatible with v3.0. No API changes, no removed methods, no migration needed. If your project runs on PHP 8.2+ and Laravel 12, composer update picks this up automatically.
setApiCredentials(), no service provider neededsetClient().timeout, connect_timeout, max_retries config keys with exponential backoff on 5xx and network errors.withExceptions() to get PayPalApiException with getHttpStatus() and getPayPalError() instead of error arrays. Fully opt-in, existing code keeps working.verifyWebHookLocally() does in-memory RSA-SHA256 with cert caching. No PayPal API roundtrip, SSRF-guarded cert URL validation.generateClientToken() for one-click guest checkout flows.deletePaymentSetupToken(), setCustomerId(), full setup and permanent token lifecycle.setPaymentSourceApplePay(), setPaymentSourceGooglePay(), setCardBillingAddress(), setCardVaulting(), setCardVerification().getCaptureIdFromOrder(). Extract the capture/transaction ID from order responses in one call.createOrderWithPaymentSource(). Create orders with an attached payment source directly.sendDisputeMessage(). Send messages in dispute conversations.withIdempotencyKey(). Set idempotency keys for safe request retries.setShippingAddressChangeCallback(). Server-side shipping callbacks for Orders v2.49.990000000000002generateInvoiceNumber() sends an empty JSON body to prevent 415 Unsupported Media Type from PayPalexperience_context from deprecated application_context to payment_source.paypal.experience_contextsetStoredPaymentSource() with PayPal's Feb 2025 API change (usage renamed to usage_pattern)validate_ssl=false was silently ignored because empty() treated false as emptylistTrackingDetails(), listUsers() SCIM filter, and query params now properly URL-encodedaddInvoiceFilterByDateRange() normalizes dates to Y-m-dverifyIPN() and json_decode results properly guarded against nullprevious_network_transaction_reference strips null values instead of sending them to PayPalprovideDisputeEvidence() endpoint; acceptDisputeClaim() no longer overwrites caller's accept_claim_typelistPaymentSourceTokens() throws RuntimeException when called without a customer IDmakeHttpRequest() no longer drops auth and form_params on the PSR-18 code pathcollect() and Illuminate\Support\Str calls with native PHP where possiblePaymentExperienceWebProfiles (PayPal deprecated /v1/payment-experience/web-profiles)ext-curl hard requirementcomposer require srmklive/paypal:^3.1
No code changes needed. All existing method signatures and return types are preserved. The three new config keys (timeout, connect_timeout, max_retries) have sensible defaults and are fully optional. Your existing config/paypal.php works as-is.
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/3.0.32...3.0.40
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/3.0.31...3.0.32
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/2.0.20...2.0.30
nesbot/carbon:~3.0 in v1.0 by @toyi in https://github.com/srmklive/laravel-paypal/pull/642Full Changelog: https://github.com/srmklive/laravel-paypal/compare/1.11.10...1.11.11
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/3.0.30...3.0.31
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/3.0.28...3.0.30
Add fixed amount of billing cycles when creating billing plans for subscriptions.
This releases contains the following implementation for the API endpoints for Partner Referrals:
Implemented addTaxes method to set taxes for billing amount when creating subscription.
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/3.0.20...3.0.21
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/3.0.19...3.0.20
Support Laravel 10.
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/3.0.17...3.0.18
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/3.0.16...3.0.17
access_token/app_id Issue by @ericdowell in https://github.com/srmklive/laravel-paypal/pull/517Full Changelog: https://github.com/srmklive/laravel-paypal/compare/3.0.15...3.0.16
Full Changelog: https://github.com/srmklive/laravel-paypal/compare/1.9.0...1.10.0
This release adds support for use on Laravel 9.
How can I help you explore Laravel packages today?