You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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();
    // 可根据需求添加日志记录、告警等额外处理
}

关键优化点说明

  1. SDK原生响应解析:无需手动读取响应体并执行json_decode,$response->getData()已自动返回解析后的数组
  2. 规范参数设置:用setMax()和setOffset()替代set(),更符合SDK的设计规范
  3. 循环条件优化:用$offset < $totalOffersCount判断循环是否继续,避免因数据异常导致的循环错误
  4. 同步调用简化:后台同步任务无需异步调用逻辑,直接使用$api->getOffers()更简洁高效
  5. 目标字段展示:新增需求中的active和inactivity_reasons字段展示,验证数据获取结果

额外建议

  • 每日同步可添加增量逻辑:通过$request->setUpdatedSince(new \DateTime('-1 day'))只拉取当日更新的优惠,减少API调用量
  • 需遵守Mirakl平台的限流规则,避免因调用过于频繁触发封禁
  • 若inactivity_reasons返回数组,需用implode转为字符串后再存储或展示

内容的提问来源于stack exchange,提问作者MaxTab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 17:05:29