⚠️ This is a read-only repository! For pull requests or issues, see stellarwp/licensing-api-client-monorepo.
WordPress transport and factory integration for the StellarWP Licensing API client.
Install with composer:
composer require stellarwp/licensing-api-client-wordpressFor end-to-end API cookbook examples, see:
For a DI52 Provider:
<?php declare(strict_types=1);
namespace MyPlugin\Providers;
use Nyholm\Psr7\Factory\Psr17Factory;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\StreamFactoryInterface;
use LiquidWeb\LicensingApiClient\Api;
use LiquidWeb\LicensingApiClient\Config;
use LiquidWeb\LicensingApiClient\Contracts\LicensingClientInterface;
use LiquidWeb\LicensingApiClient\Http\ApiVersion;
use LiquidWeb\LicensingApiClient\Http\AuthContext;
use LiquidWeb\LicensingApiClient\Http\AuthState;
use LiquidWeb\LicensingApiClient\Http\RequestExecutor;
use LiquidWeb\LicensingApiClientWordPress\Http\WordPressHttpClient;
use lucatume\DI52\ServiceProvider;
final class LicensingApiProvider extends ServiceProvider
{
public function register(): void
{
$this->container->singleton(WordPressHttpClient::class);
$this->container->singleton(Psr17Factory::class);
$this->container->when(RequestExecutor::class)
->needs(ClientInterface::class)
->give(static fn( $c ): ClientInterface => $c->get(WordPressHttpClient::class));
$this->container->bind(
RequestFactoryInterface::class,
static fn( $c ): RequestFactoryInterface => $c->get(Psr17Factory::class)
);
$this->container->bind(
StreamFactoryInterface::class,
static fn( $c ): StreamFactoryInterface => $c->get(Psr17Factory::class)
);
$this->container->singleton(
Config::class,
static function (): Config {
return new Config(
'https://licensing.example.com',
null, // Pass a token if you plan to make authenticated requests.
'my-plugin/1.0.0' // Your client user agent.
);
}
);
$this->container->singleton(
AuthState::class,
static fn( $c ): AuthState => new AuthState(
new AuthContext(),
$c->get(Config::class)->configuredToken
)
);
$this->container->singleton(
ApiVersion::class,
static fn(): ApiVersion => ApiVersion::default()
);
$this->container->singleton(LicensingClientInterface::class, Api::class);
}
}That lets you resolve the fully-wired core client from the container. The important detail is that AuthState is built from Config::configuredToken, so your configured token only lives in one place:
$api = $container->get(LicensingClientInterface::class);API errors are thrown as exceptions, so catch the specific cases you care about and fall back to ApiErrorExceptionInterface for the rest:
use LiquidWeb\LicensingApiClient\Exceptions\Contracts\ApiErrorExceptionInterface;
use LiquidWeb\LicensingApiClient\Exceptions\NotFoundException;
use LiquidWeb\LicensingApiClient\Exceptions\ValidationException;
try {
$catalog = $api->products()->catalog('LWSW-8H9F-5UKA-VR3B-D7SQ-BP9N');
$validation = $api->licenses()->validate(
'LWSW-8H9F-5UKA-VR3B-D7SQ-BP9N',
['kadence', 'learndash'],
'customer-site.com'
);
$balances = $api->withConfiguredToken()->credits()->balance(
'LWSW-8H9F-5UKA-VR3B-D7SQ-BP9N',
'customer-site.com'
);
if ($catalog->products->isCapabilityValid('kadence', 'blocks')) {
// ...
}
if ($validation->products->isCapabilityValid('learndash', 'blocks')) {
// ...
}
} catch (NotFoundException $e) {
// Return the API message when the requested record does not exist.
return [
'success' => false,
'message' => $e->getMessage(),
];
} catch (ValidationException $e) {
// Return the validation message and log the details for debugging.
$this->logger->warning('Licensing validation failed.', [
'message' => $e->getMessage(),
'code' => $e->errorCode(),
]);
return [
'success' => false,
'message' => $e->getMessage(),
];
} catch (ApiErrorExceptionInterface $e) {
// Log unexpected API-declared errors and return a generic failure message.
$this->logger->error('Licensing API request failed.', [
'status' => $e->getResponse()->getStatusCode(),
'code' => $e->errorCode(),
'message' => $e->getMessage(),
]);
return [
'success' => false,
'message' => 'We could not complete the licensing request right now. Please try again later.',
];
}For a public or unauthenticated client without a Container:
<?php declare(strict_types=1);
use Nyholm\Psr7\Factory\Psr17Factory;
use LiquidWeb\LicensingApiClient\Config;
use LiquidWeb\LicensingApiClientWordPress\Http\WordPressHttpClient;
use LiquidWeb\LicensingApiClientWordPress\WordPressApiFactory;
$psr17 = new Psr17Factory();
$api = (new WordPressApiFactory(
new WordPressHttpClient(),
$psr17,
$psr17
))->make(new Config(
'https://licensing.example.com',
null,
'my-plugin/1.0.0' // Your client user agent.
));For a trusted source with a configured token:
<?php declare(strict_types=1);
use Nyholm\Psr7\Factory\Psr17Factory;
use LiquidWeb\LicensingApiClient\Config;
use LiquidWeb\LicensingApiClientWordPress\Http\WordPressHttpClient;
use LiquidWeb\LicensingApiClientWordPress\WordPressApiFactory;
$psr17 = new Psr17Factory();
$api = (new WordPressApiFactory(
new WordPressHttpClient(),
$psr17,
$psr17
))->make(new Config(
'https://licensing.example.com',
'pk_test_your_token_here',
'portal/1.0.0' // Your client user agent.
));
$trustedApi = $api->withConfiguredToken();This package is being developed in the monorepo and published as a read-only split repository.