Installation
composer require baks-dev/ozon-promotion
Ensure your php version is 8.4+ (check via php -v).
Publish Config
Publish the default configuration to config/ozon-promotion.php:
php artisan vendor:publish --provider="BaksDev\OzonPromotion\OzonPromotionServiceProvider" --tag="config"
Key config fields to verify:
api_key (Ozon API credentials)default_campaign_id (fallback campaign ID)debug (enable for API debugging)First Use Case: Fetching Promotions
Inject the OzonPromotion facade into a controller/service:
use BaksDev\OzonPromotion\Facades\OzonPromotion;
public function getPromotions() {
$promotions = OzonPromotion::getPromotions(['campaign_id' => 123]);
return response()->json($promotions);
}
GET /api/promotionscampaign_id (or use default_campaign_id from config).Campaign Management
OzonPromotion::createCampaign([
'name' => 'Summer Sale',
'budget' => 1000,
'start_date' => now()->addDays(3),
'end_date' => now()->addDays(10),
]);
$campaigns = OzonPromotion::getCampaigns(['status' => 'active']);
Product Promotion
OzonPromotion::addProductsToCampaign(123, [1001, 1002, 1003]);
OzonPromotion::bulkUpdatePromotions([
['product_id' => 1001, 'discount' => 15],
['product_id' => 1002, 'discount' => 20],
]);
Reporting
$report = OzonPromotion::getReport('daily', '2024-01-01', '2024-01-31');
$csv = OzonPromotion::exportReportToCsv($report);
OzonPromotion::bulkUpdatePromotions()):
OzonPromotion::dispatchBulkUpdate([...], now()->addMinutes(5));
promotion.approved) via Laravel’s HandleOzonWebhook event listener.
Example listener:
public function handle(OzonPromotionApproved $event) {
// Update local DB or trigger notifications
}
Cache::tags(['ozon_promotions'])->remember('promotions_123', now()->addHours(1), fn() =>
OzonPromotion::getPromotions(['campaign_id' => 123])
);
API Rate Limits
OzonPromotion::throttle() to manage bursts:
OzonPromotion::throttle(10, function() {
// Rate-limited batch processing
});
debug: true in config to log API responses/errors.Timezone Mismatches
Carbon instances:
$ozonDate = $carbonInstance->setTimezone('UTC')->toIso8601String();
Product ID Formats
"1001"), not integers. Validate inputs:
$productIds = array_map('strval', $request->input('product_ids'));
Webhook Verification
signature header. Validate using:
if (!OzonPromotion::verifyWebhookSignature($request->getContent(), $request->header('signature'))) {
abort(403);
}
debug: true in config to log raw API requests/responses to storage/logs/ozon-promotion.log.OzonPromotion::fake() method for testing:
OzonPromotion::fake([
'getPromotions' => ['promotions' => []],
]);
Custom API Clients
Extend BaksDev\OzonPromotion\Clients\OzonClient to add endpoints:
class CustomOzonClient extends OzonClient {
public function getCustomData($param) {
return $this->get("custom-endpoint", $param);
}
}
Register in config/ozon-promotion.php:
'client' => \App\Services\CustomOzonClient::class,
Local Overrides
Override default responses in app/Providers/OzonPromotionServiceProvider.php:
public function boot() {
OzonPromotion::macro('customMethod', function() {
return "Overridden!";
});
}
Database Sync
Use Laravel’s OzonPromotionSyncer to sync local DB with Ozon’s API:
OzonPromotion::syncCampaignsToLocal();
How can I help you explore Laravel packages today?