如何在Mirakl PHP SDK(卖家端)中处理getOffers请求分页?
解决Mirakl PHP SDK调用OF21接口分页获取全店优惠的问题
核心背景与需求
- 使用版本:Mirakl PHP Shop SDK 1.18.1
- 目标:每日同步店铺内约700条优惠信息到自有数据库,重点获取OF51 CSV文件未包含的Offers > Active和Offers > Inactivity_reasons字段
- 问题:不清楚
getOffers接口的分页参数规范用法,需优化分页逻辑以拉取全部数据
分页参数与SDK规范用法
Mirakl OF21接口原生支持max(单页最大返回数,上限100)和offset(查询偏移量)作为分页参数,对应SDK的GetOffersRequest类提供了专门的 setter 方法,比直接调用set()更贴合SDK设计:
setMax(int $max):设置单页返回的优惠数量setOffset(int $offset):设置查询的起始偏移位置
优化后的完整代码
以下是修正并优化后的实现,解决分页逻辑、响应解析等问题:
<?php use Mirakl\MMP\Shop\Client\ShopApiClient; use Mirakl\MMP\Shop\Request\Offer\GetOffersRequest; use GuzzleHttp\Exception\ClientException; $api = new ShopApiClient($apiUrl, $apiKey, $shopId); function fetchAllOffers(ShopApiClient $api, $shopId) { $allOffers = []; $offset = 0; $max = 100; // 接口允许的单页最大条数 do { $request = new GetOffersRequest($shopId); // 使用SDK规范的分页参数设置方法 $request->setMax($max); $request->setOffset($offset); // 后台同步任务用同步调用更简洁,无需异步 $response = $api->getOffers($request); // SDK已自动解析响应,无需手动json_decode $data = $response->getData(); $totalOffersCount = $data['total_count'] ?? 0; $offers = $data['offers'] ?? []; $allOffers = array_merge($allOffers, $offers); $offset += $max; } while ($offset < $totalOffersCount); // 用偏移量判断更精准,避免数组统计误差 return $allOffers; } function displayOffers($allOffers) { echo '<table border="1">'; echo '<tr><th>SKU</th><th>激活状态</th><th>失效原因</th></tr>'; foreach ($allOffers as $offer) { echo '<tr>'; echo '<td>' . htmlspecialchars($offer['product_sku']) . '</td>'; echo '<td>' . ($offer['active'] ? '已激活' : '未激活') . '</td>'; echo '<td>' . implode(', ', $offer['inactivity_reasons'] ?? []) . '</td>'; echo '</tr>'; } echo '</table>'; } try { $allOffers = fetchAllOffers($api, $shopId); displayOffers($allOffers); } catch (ClientException $e) { echo '错误: ' . $e->getMessage(); // 可根据需求添加日志记录、告警等额外处理 }
关键优化点说明
- SDK原生响应解析:无需手动读取响应体并执行
json_decode,$response->getData()已自动返回解析后的数组 - 规范参数设置:用
setMax()和setOffset()替代set(),更符合SDK的设计规范 - 循环条件优化:用
$offset < $totalOffersCount判断循环是否继续,避免因数据异常导致的循环错误 - 同步调用简化:后台同步任务无需异步调用逻辑,直接使用
$api->getOffers()更简洁高效 - 目标字段展示:新增需求中的
active和inactivity_reasons字段展示,验证数据获取结果
额外建议
- 每日同步可添加增量逻辑:通过
$request->setUpdatedSince(new \DateTime('-1 day'))只拉取当日更新的优惠,减少API调用量 - 需遵守Mirakl平台的限流规则,避免因调用过于频繁触发封禁
- 若
inactivity_reasons返回数组,需用implode转为字符串后再存储或展示
内容的提问来源于stack exchange,提问作者MaxTab
相关产品推荐
相关产品推荐

