PHPackages                             bnpl-partners/factoring004 - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. bnpl-partners/factoring004

ActiveLibrary[API Development](/categories/api)

bnpl-partners/factoring004
==========================

Buy now pay later API SDK

3.3.0(1y ago)02.0k↑200%1MITPHPPHP &gt;=7.4CI passing

Since Feb 8Pushed 1y ago3 watchersCompare

[ Source](https://github.com/bnpl-kz/factoring004)[ Packagist](https://packagist.org/packages/bnpl-partners/factoring004)[ RSS](/packages/bnpl-partners-factoring004/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (10)Dependencies (9)Versions (24)Used By (1)

Factoring004 SDK
================

[](#factoring004-sdk)

- [Requirements](#requirements)
- [Version compatibility](#version-compatibility)
- [Installation](#installation)
- [Authentication](#authentication)
- [Usage](#usage)
    - [PreApp endpoint](#preapp-endpoint)
    - [Delivery endpoints](#delivery-endpoints)
    - [Full return endpoints](#full-return-endpoints)
    - [Partial return endpoints](#partial-return-endpoints)
    - [Error handling](#error-handling)
- [Advanced usage](#advanced-usage)
    - [Create api instance](#create-api-instance)
    - [PreApp endpoint](#preapp-endpoint-1)
    - [Delivery endpoints](#delivery-endpoints-1)
    - [Return endpoints](#refund-endpoints)
    - [Error handling](#error-handling)
    - [Exception Hierarchy](#exception-hierarchy)
- [Customization](#customization)
    - [PSR HTTP clients](#psr-http-clients)
    - [Transport layer](#transport-layer)
    - [Resources](#resources)

Requirements
------------

[](#requirements)

- PHP &gt;=5.6
- JSON extension
- PSR-17, PSR-18 implementations (optional and PHP &gt;=7.x only)

Version compatibility
---------------------

[](#version-compatibility)

Package versionPHP versionNote3.x&gt;= 7.4Latest version. Supported.2.x&gt;= 5.6 &lt; 7.4Legacy version. Supported.1.x&gt;= 5.6 &lt; 7.4Legacy version. Unsupported.
Please upgrade to 2.x.0.x&gt;= 7.4Unstable and unsupported version.
Please upgrade to 3.x.Installation
------------

[](#installation)

```
composer require bnpl-partners/factoring004
```

Authentication
--------------

[](#authentication)

Create an instance of `BnplPartners\Factoring004\OAuth\OAuthTokenManager`.

```
use BnplPartners\Factoring004\OAuth\OAuthTokenManager;

$tokenManager = new OAuthTokenManager('https://dev.bnpl.kz/api/users/api/v1', 'username', 'password');
```

### Generate access token

[](#generate-access-token)

```
$token = $tokenManager->getAccessToken();
$accessToken = $token->getAccess();
```

### Refresh access token

[](#refresh-access-token)

```
$newToken = $tokenManager->refreshToken($oldToken->getRefresh());
```

### Cache access token

[](#cache-access-token)

```
use BnplPartners\Factoring004\OAuth\CacheOAuthTokenManager;
use BnplPartners\Factoring004\OAuth\OAuthTokenManager;

$cache = ... // PSR-16 Cache
$tokenManager = new OAuthTokenManager('https://dev.bnpl.kz/api/users/v1', 'username', 'password');
$cacheTokenManager = new CacheOAuthTokenManager($tokenManager, $cache, 'cache key');

$token = $cacheTokenManager->getAccessToken();
$accessToken = $token->getAccess();
```

### Cached Token Refresh Policy

[](#cached-token-refresh-policy)

There are two policies to refresh a cached token.

#### Always Retrieve

[](#always-retrieve)

This is default behaviour. In this case any expired tokens always will refresh. If you need to refresh token instead of retrieve, you will have to call `CacheOAuthTokenManager::refreshToken()` method.

```
use BnplPartners\Factoring004\OAuth\CacheOAuthTokenManager;
use BnplPartners\Factoring004\OAuth\OAuthTokenRefreshPolicy;

$cacheTokenManager = new CacheOAuthTokenManager($tokenManager, $cache, 'cache key', OAuthTokenRefreshPolicy::ALWAYS_RETRIEVE());

$token = $cacheTokenManager->getAccessToken();
$accessToken = $token->getAccess();
```

#### Always Refresh

[](#always-refresh)

Expired tokens always will refresh. You won't need to refresh it manually by `CacheOAuthTokenManager::refreshToken()` method.

```
use BnplPartners\Factoring004\OAuth\CacheOAuthTokenManager;
use BnplPartners\Factoring004\OAuth\OAuthTokenRefreshPolicy;

$cacheTokenManager = new CacheOAuthTokenManager($tokenManager, $cache, 'cache key', OAuthTokenRefreshPolicy::ALWAYS_REFRESH());

$token = $cacheTokenManager->getAccessToken();
$accessToken = $token->getAccess();
```

### Clear cached tokens

[](#clear-cached-tokens)

If you need to clear cache, you will clear cache manually.

```
$cacheTokenManager->clearCache();
```

If you get an authentication error, you will clear cache manually.

```
use BnplPartners\Factoring004\Exception\AuthenticationException;
use BnplPartners\Factoring004\OAuth\CacheOAuthTokenManager;
use BnplPartners\Factoring004\Order\OrderManager;

$cacheTokenManager = new CacheOAuthTokenManager($tokenManager, $cache, 'cache key');
$orderManager = OrderManager::create('https://dev.bnpl.kz/api', new BearerTokenAuth($cacheTokenManager->getAccessToken()->getAccess()));

try {
    $orderManager->preApp(...);
} catch (AuthenticationException $e) {
    $cacheTokenManager->clearCache();
}
```

Usage
-----

[](#usage)

We recommend to use the class `BnplPartners\Factoring004\Order\OrderManager` to call our endpoints.

### Create an instance

[](#create-an-instance)

```
use BnplPartners\Factoring004\Order\OrderManager;
use BnplPartners\Factoring004\Auth\BearerTokenAuth;

require_once __DIR__ . '/vendor/autoload.php';

$manager = OrderManager::create('https://dev.bnpl.kz/api', new BearerTokenAuth('Access Token'));
```

### PreApp endpoint

[](#preapp-endpoint)

```
$response = $manager->preApp([
    'partnerData' => [
        'partnerName' => 'test',
        'partnerCode' => 'test',
        'pointCode' => 'test',
    ],
    'billNumber' => '1',
    'billAmount' => 6000,
    'itemsQuantity' => 1,
    'successRedirect' => 'http://your-store.com/success',
    'postLink' => 'http://your-store.com/internal',
    'items' => [
        [
            'itemId' => '1',
            'itemName' => 'test',
            'itemQuantity' => 1,
            'itemPrice' => 6000,
            'itemSum' => 6000,
        ],
    ],
]);

var_dump($response->getRedirectLink());
```

### Delivery endpoints

[](#delivery-endpoints)

#### Send OTP

[](#send-otp)

```
$response = $manager->delivery($merchantId, $orderId, $amount)->sendOtp();
var_dump($response->getMessage());
```

#### Check OTP

[](#check-otp)

```
$response = $manager->delivery($merchantId, $orderId, $amount)->checkOtp($otp);
var_dump($response->getMessage());
```

#### Without OTP

[](#without-otp)

```
$response = $manager->delivery($merchantId, $orderId, $amount)->confirmWithoutOtp();
var_dump($response->getMessage());
```

### Full return endpoints

[](#full-return-endpoints)

#### Send OTP

[](#send-otp-1)

```
$response = $manager->fullRefund($merchantId, $orderId)->sendOtp();
var_dump($response->getMessage());
```

#### Check OTP

[](#check-otp-1)

```
$response = $manager->fullRefund($merchantId, $orderId)->checkOtp($otp);
var_dump($response->getMessage());
```

#### Without OTP

[](#without-otp-1)

```
$response = $manager->fullRefund($merchantId, $orderId)->confirmWithoutOtp();
var_dump($response->getMessage());
```

### Partial return endpoints

[](#partial-return-endpoints)

#### Send OTP

[](#send-otp-2)

```
$response = $manager->partialRefund($merchantId, $orderId, $amount)->sendOtp();
var_dump($response->getMessage());
```

#### Check OTP

[](#check-otp-2)

```
$response = $manager->partialRefund($merchantId, $orderId, $amount)->checkOtp($otp);
var_dump($response->getMessage());
```

#### Without OTP

[](#without-otp-2)

```
$response = $manager->partialRefund($merchantId, $orderId, $amount)->confirmWithoutOtp();
var_dump($response->getMessage());
```

### Cancel endpoint

[](#cancel-endpoint)

```
$response = $manager->cancel($merchantId, $orderId);
var_dump($response->getMessage());
```

### Error handling

[](#error-handling)

All methods can throw an instance of `BnplPartners\Factoring004\Exception\PackageException`.

```
use BnplPartners\Factoring004\Exception\PackageException;

try {
    $response = $manager->delivery($merchantId, $orderId, $amount)->sendOtp();
} catch (PackageException $e) {
    var_dump($e);
}
```

Advanced Usage
--------------

[](#advanced-usage)

These classes are low level API, described in the section.

### Create api instance

[](#create-api-instance)

```
use BnplPartners\Factoring004\Api;
use BnplPartners\Factoring004\Auth\BearerTokenAuth;

require_once __DIR__ . '/vendor/autoload.php';

$api = Api::create('https://dev.bnpl.kz/api', new BearerTokenAuth('Access Token'));
```

### PreApp endpoint

[](#preapp-endpoint-1)

Create preApp

```
use BnplPartners\Factoring004\PreApp\Item;
use BnplPartners\Factoring004\PreApp\PreAppMessage;
use BnplPartners\Factoring004\PreApp\PartnerData;

$message = new PreAppMessage(
    new PartnerData('test', 'test', 'test'),
    '1',
    6000,
    1,
    'http://your-store.com/success',
    'http://your-store.com/internal',
    [new Item('1', 'test', 1, 6000, 6000)],
);

// Or
$message = PreAppMessage::createFromArray([
    'partnerData' => [
        'partnerName' => 'test',
        'partnerCode' => 'test',
        'pointCode' => 'test',
    ],
    'billNumber' => '1',
    'billAmount' => 6000,
    'itemsQuantity' => 1,
    'successRedirect' => 'http://your-store.com/success',
    'postLink' => 'http://your-store.com/internal',
    'items' => [
        [
            'itemId' => '1',
            'itemName' => 'test',
            'itemQuantity' => 1,
            'itemPrice' => 6000,
            'itemSum' => 6000,
        ],
    ],
]);

//Send request and receive response
$response = $api->preApps->preApp($message);

var_dump($response->getStatus(), $response->getPreAppId(), $response->getRedirectLink());
var_dump($response->toArray(), json_encode($response));
```

### Get preapp status

[](#get-preapp-status)

#### Get status by preapp id

[](#get-status-by-preapp-id)

```
$status = $api->preApps->getStatus($preappID)->getStatus();
```

#### Get status by order id

[](#get-status-by-order-id)

```
$status = $api->bill->getStatus($orderID)->getStatus();
```

### Delivery endpoints

[](#delivery-endpoints-1)

#### Send OTP

[](#send-otp-3)

```
use BnplPartners\Factoring004\Otp\SendOtp;

$sendOtp = new SendOtp('1', '1', 6000);

// or
$sendOtp = SendOtp::createFromArray(['merchantId' => '1', 'merchantOrderId' => '1', 'amount' => 6000]);

// send request and receive response
$response = $api->otp->sendOtp($sendOtp);

var_dump($response->getMsg());
var_dump($response->toArray(), json_encode($response));
```

#### Check OTP

[](#check-otp-3)

```
use BnplPartners\Factoring004\Otp\CheckOtp;

$checkOtp = new CheckOtp('1', '1', '1111', 6000);

// or
$checkOtp = CheckOtp::createFromArray(['merchantId' => '1', 'merchantOrderId' => '1', 'otp' => '1111', 'amount' => 6000]);

// send request and receive response
$response = $api->otp->checkOtp($checkOtp);

var_dump($response->getMsg());
var_dump($response->toArray(), json_encode($response));
```

#### Without OTP

[](#without-otp-3)

```
use BnplPartners\Factoring004\ChangeStatus\DeliveryOrder;
use BnplPartners\Factoring004\ChangeStatus\DeliveryStatus;
use BnplPartners\Factoring004\ChangeStatus\ErrorResponse;
use BnplPartners\Factoring004\ChangeStatus\MerchantsOrders;
use BnplPartners\Factoring004\ChangeStatus\SuccessResponse;

$orders = new MerchantsOrders('1', [new DeliveryOrder('1', DeliveryStatus::DELIVERY(), 6000)]);

// or
$orders = MerchantsOrders::createFromArray([
    'merchantId' => '1',
    'orders' => [
        ['orderId' => '1', 'status' => 'delivered', 'amount' => 6000],
    ],
]);

// send request and receive response
$response = $api->changeStatus->changeStatusJson($orders);

var_dump(array_map(fn(SuccessResponse $response) => $response->getMsg(), $response->getSuccessfulResponses()));
var_dump(array_map(fn(ErrorResponse $response) => $response->getMessage(), $response->getErrorResponses()));
var_dump($response->toArray(), json_encode($response));
```

### Refund endpoints

[](#refund-endpoints)

#### Send OTP Return

[](#send-otp-return)

```
use BnplPartners\Factoring004\Otp\SendOtpReturn;

$sendOtpReturn = new SendOtpReturn(6000, '1', '1');

// or
$sendOtpReturn = SendOtpReturn::createFromArray(['amountAr' => 6000, 'merchantId' => '1', 'merchantOrderId' => '1']);

// send request and receive response
$response = $api->otp->sendOtpReturn($sendOtpReturn);

var_dump($response->getMsg());
var_dump($response->toArray(), json_encode($response));
```

#### Check OTP Return

[](#check-otp-return)

```
use BnplPartners\Factoring004\Otp\CheckOtpReturn;

$checkOtpReturn = new CheckOtpReturn(6000, '1', '1', '1111');

// or
$checkOtpReturn = CheckOtp::createFromArray(['amountAr' => 6000, 'merchantId' => '1', 'merchantOrderId' => '1', 'otp' => '1111']);

// send request and receive response
$response = $api->otp->checkOtpReturn($checkOtpReturn);

var_dump($response->getMsg());
var_dump($response->toArray(), json_encode($response));
```

#### Without OTP

[](#without-otp-4)

```
use BnplPartners\Factoring004\ChangeStatus\ErrorResponse;
use BnplPartners\Factoring004\ChangeStatus\MerchantsOrders;
use BnplPartners\Factoring004\ChangeStatus\ReturnOrder;
use BnplPartners\Factoring004\ChangeStatus\ReturnStatus;
use BnplPartners\Factoring004\ChangeStatus\SuccessResponse;

$orders = new MerchantsOrders('1', [new ReturnOrder('1', ReturnStatus::RETURN(), 6000)]);

// or
$orders = MerchantsOrders::createFromArray([
    'merchantId' => '1',
    'orders' => [
        ['orderId' => '1', 'status' => 'return', 'amount' => 6000],
    ],
]);

// send request and receive response
$response = $api->changeStatus->changeStatusJson($orders);

var_dump(array_map(fn(SuccessResponse $response) => $response->getMsg(), $response->getSuccessfulResponses()));
var_dump(array_map(fn(ErrorResponse $response) => $response->getMessage(), $response->getErrorResponses()));
var_dump($response->toArray(), json_encode($response));
```

### Cancel

[](#cancel)

```
use BnplPartners\Factoring004\ChangeStatus\ErrorResponse;
use BnplPartners\Factoring004\ChangeStatus\MerchantsOrders;
use BnplPartners\Factoring004\ChangeStatus\CancelOrder;
use BnplPartners\Factoring004\ChangeStatus\CancelStatus;
use BnplPartners\Factoring004\ChangeStatus\SuccessResponse;

$orders = new MerchantsOrders('1', [new CancelOrder('1', CancelStatus::CANCEL())]);

// or
$orders = MerchantsOrders::createFromArray([
    'merchantId' => '1',
    'orders' => [
        ['orderId' => '1', 'status' => 'canceled'],
    ],
]);

// send request and receive response
$response = $api->changeStatus->changeStatusJson($orders);

var_dump(array_map(fn(SuccessResponse $response) => $response->getMsg(), $response->getSuccessfulResponses()));
var_dump(array_map(fn(ErrorResponse $response) => $response->getMessage(), $response->getErrorResponses()));
var_dump($response->toArray(), json_encode($response));
```

### Error handling

[](#error-handling-1)

Whenever api returns an error client will throw an instance of `BnplPartners\Factoring004\Exception\ApiException`.

```
use BnplPartners\Factoring004\Exception\ApiException;
use BnplPartners\Factoring004\Exception\AuthenticationException;
use BnplPartners\Factoring004\Exception\EndpointUnavailableException;
use BnplPartners\Factoring004\Exception\ErrorResponseException;
use BnplPartners\Factoring004\Exception\NetworkException;
use BnplPartners\Factoring004\Exception\PackageException;
use BnplPartners\Factoring004\Exception\TransportException;
use BnplPartners\Factoring004\Exception\UnexpectedResponseException;
use BnplPartners\Factoring004\Exception\ValidationException;

try {
    $api->preApps->preApp($message);
} catch (AuthenticationException $e) {
    // authentication errors, token invalid, token expired, etc
    var_dump($e->getCode(), $e->getMessage(), $e->getDescription());
} catch (EndpointUnavailableException $e) {
    // to catch all internal server errors 500, 503, etc
    var_dump($e->getResponse());
} catch (ErrorResponseException $e) {
    // to catch all client errors 400, 405, etc
    var_dump($e->getErrorResponse());
} catch (UnexpectedResponseException $e) {
    // to catch all responses with unexpected schema
    var_dump($e->getResponse());
} catch (ValidationException $e) {
    // endpoint validation error
    $details = $e->getResponse()->getDetails();
    var_dump($details[0]->getError(), $details[0]->getField());
} catch (ApiException $e) {
    // to catch all api layer exceptions
} catch (NetworkException $e) {
    // network issues, connection refused, etc
} catch (TransportException $e) {
    // to catch all transport layer exceptions
} catch (PackageException $e) {
    // to catch all the package exceptions
}
```

Exception Hierarchy
-------------------

[](#exception-hierarchy)

- `PackageException`
    - `ApiException`
        - `AuthenticationException`
        - `ValidationException`
        - `ErrorResponseException`
        - `UnexpectedResponseException`
            - `EndpointUnavailableException`
    - `TransportException`
        - `NetworkException`
        - `DataSerializationException`

Customization
-------------

[](#customization)

### PSR HTTP clients

[](#psr-http-clients)

First install any PSR-17 and PSR-18 packages. See [PSR-17 packages](https://packagist.org/providers/psr/http-factory-implementation) and [PSR-18 packages](https://packagist.org/providers/psr/http-client-implementation).

For instance, we install popular Guzzle HTTP client. Since version 7 it has already implemented PSR-17 and PSR-18.

```
composer require guzzlehttp/guzzle
```

For Guzzle 6 you may use `GuzzleTransport` or `PsrTransport` with additional PSR-17 and PSR-18 adapters. See bellow.

Install PSR-17 and PSR-18 adapters for Guzzle 6.

```
composer require http-interop/http-factory-guzzle mjelamanov/psr18-guzzle
```

### Transport layer

[](#transport-layer)

Transport is an abstraction layer over HTTP clients.

For Guzzle 6 and 7

```
use BnplPartners\Factoring004\Transport\GuzzleTransport;

require_once __DIR__ . '/vendor/autoload.php';

$transport = new GuzzleTransport(new GuzzleHttp\Client());
```

For PSR-17 and PSR-18 client.

```
use BnplPartners\Factoring004\Transport\PsrTransport;

require_once __DIR__ . '/vendor/autoload.php';

$transport = new PsrTransport(
    new GuzzleHttp\Psr7\HttpFactory(),
    new GuzzleHttp\Psr7\HttpFactory(),
    new GuzzleHttp\Psr7\HttpFactory(),
    new GuzzleHttp\Client(),
);
```

For Guzzle 6 client with PSR-17 and PSR-18 adapters.

```
use BnplPartners\Factoring004\Transport\PsrTransport;

require_once __DIR__ . '/vendor/autoload.php';

$transport = new PsrTransport(
    new Http\Factory\Guzzle\RequestFactory(),
    new Http\Factory\Guzzle\StreamFactory(),
    new Http\Factory\Guzzle\UriFactory(),
    new Mjelamanov\GuzzlePsr18\Client(new GuzzleHttp\Client()),
);
```

For other PSR-17 and PSR-18 clients.

```
use BnplPartners\Factoring004\Transport\PsrTransport;

require_once __DIR__ . '/vendor/autoload.php';

$transport = new PsrTransport(
    new RequestFactory(), // PSR-17 instance
    new StreamFactory(), // PSR-17 instance
    new UriFactory(), // PSR-17 instance
    new Client() // PSR-18 instance
);
```

You can create your own transport. Just implement `BnplPartners\Factoring004\Transport\TransportInterface`.

#### Send requests

[](#send-requests)

```
$response = $transport->post('/bnpl/v3/preapp', ['partnerData' => [...]], ['Content-Type' => 'application/json']);

var_dump($response->getStatusCode()); // HTTP response status code
var_dump($response->getHeaders()); // HTTP response headers
var_dump($response->getBody()); // parsed HTTP response body
```

### Resources

[](#resources)

Each resource is a set of grouped endpoints.

```
use BnplPartners\Factoring004\Auth\BearerTokenAuth;
use BnplPartners\Factoring004\Otp\OtpResource;
use BnplPartners\Factoring004\PreApp\PreAppResource;

require_once __DIR__ . '/vendor/autoload.php';

...

$preApp = new PreAppResource($transport, 'https://dev.bnpl.kz/api', new BearerTokenAuth('Access Token'));
$response = $preApp->preApp(...);

$otp = new OtpResource($transport, 'https://dev.bnpl.kz/api', new BearerTokenAuth('Access Token'));
$response = $otp->sendOtp(...);
```

Test
----

[](#test)

```
./vendor/bin/phpunit
```

###  Health Score

37

—

LowBetter than 83% of packages

Maintenance43

Moderate activity, may be stable

Popularity21

Limited adoption so far

Community16

Small or concentrated contributor base

Maturity59

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 76.2% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~61 days

Recently: every ~151 days

Total

20

Last Release

390d ago

Major Versions

0.8.0 → 1.0.02022-11-14

0.9.0 → 1.1.02022-12-12

1.x-dev → 2.0.02023-04-04

2.0.0 → 3.0.02023-04-04

2.1.0 → 3.2.02024-02-01

PHP version history (2 changes)0.1.0PHP &gt;=7.4

1.0.0PHP &gt;=5.6 || &lt;7.4

### Community

Maintainers

![](https://www.gravatar.com/avatar/f3aded47063b9b39049a2570a5f7670691b373836ab9f051c052740e72d7c7ae?d=identicon)[bnpl-kz](/maintainers/bnpl-kz)

---

Top Contributors

[![mjelamanov](https://avatars.githubusercontent.com/u/15931507?v=4)](https://github.com/mjelamanov "mjelamanov (77 commits)")[![genov8](https://avatars.githubusercontent.com/u/60063310?v=4)](https://github.com/genov8 "genov8 (12 commits)")[![IvanRybintsev](https://avatars.githubusercontent.com/u/11771421?v=4)](https://github.com/IvanRybintsev "IvanRybintsev (5 commits)")[![samat-ibrayev](https://avatars.githubusercontent.com/u/188975690?v=4)](https://github.com/samat-ibrayev "samat-ibrayev (5 commits)")[![bnpl-kz](https://avatars.githubusercontent.com/u/98588156?v=4)](https://github.com/bnpl-kz "bnpl-kz (2 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPsalm, Rector

Type Coverage Yes

### Embed Badge

![Health badge](/badges/bnpl-partners-factoring004/health.svg)

```
[![Health](https://phpackages.com/badges/bnpl-partners-factoring004/health.svg)](https://phpackages.com/packages/bnpl-partners-factoring004)
```

###  Alternatives

[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M651](/packages/sylius-sylius)[theodo-group/llphant

LLPhant is a library to help you build Generative AI applications.

1.5k311.5k5](/packages/theodo-group-llphant)[tempest/framework

The PHP framework that gets out of your way.

2.1k23.1k9](/packages/tempest-framework)[commercetools/commercetools-sdk

The official PHP SDK for the commercetools Composable Commerce APIs

19281.5k](/packages/commercetools-commercetools-sdk)[wordpress/php-ai-client

A provider agnostic PHP AI client SDK to communicate with any generative AI models of various capabilities using a uniform API.

26236.6k14](/packages/wordpress-php-ai-client)[aedart/athenaeum

Athenaeum is a mono repository; a collection of various PHP packages

245.2k](/packages/aedart-athenaeum)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
