XML, представленный просто отлично для Amazon MWS, но цена не обновляется

Я создал собственный реплик, но цена не обновляется на стороне Амазонки.

Мой код, кажется, работает просто отлично, исходя из ответа Amazon после его отправки. Я надеюсь, что кто-то здесь знает больше о том, почему он фактически не обновляет цену.

Здесь представлен XML:

<?xml version="1.0" encoding="utf-8" ?>
<AmazonEnvelope
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
    <Header>
        <DocumentVersion>1.01</DocumentVersion>
        <MerchantIdentifier>MERCHANTID</MerchantIdentifier>
    </Header>
    <MessageType>Price</MessageType>
    <Message>
        <MessageID>1</MessageID>
        <Price>
            <SKU>mysku</SKU>
            <StandardPrice currency="USD">350.50</StandardPrice>
        </Price>
    </Message>
</AmazonEnvelope>

Получает ответ:

GetFeedSubmissionResultResponse{}(ResponseMetadata: <Element_?/ResponseMetadata_0x7fee61f74248>, GetFeedSubmissionResultResult: <Element_?/GetFeedSubmissionResultResult_0x7fee61f74248>, AmazonEnvelope: 
{'xmlns:xsi': 'http://www.w3.org/2001/XMLSchema-instance', 'xsi:noNamespaceSchemaLocation': 'amzn-envelope.xsd'}, DocumentVersion: '1.02', MerchantIdentifier: 'M_EXAMPLE_1234', Header: '\n\t', MessageType: 'ProcessingReport', MessageID: '1', DocumentTransactionID: '4200000000', StatusCode: 'Complete', MessagesProcessed: '1', MessagesSuccessful: '1', MessagesWithError: '0', MessagesWithWarning: '0', ProcessingSummary: '\n\t\t\t', ProcessingReport: '\n\t\t', Message: '\n\t')

Я не знаю, поможет ли показывать мой код в этом случае, так как я получаю успешный ответ от Amazon. Здесь это независимо:

...

# Provide credentials.
conn = MWSConnection(
    aws_access_key_id=AWS_ACCESS_KEY_ID,
    aws_secret_access_key=AWS_SECRET_ACCESS_KEY,
    Merchant=AMZ_SELLER_ID
)

# Get the service resource
sqs = boto3.resource('sqs')

# Get the queue
queue = sqs.get_queue_by_name(QueueName=SQS_QUEUE_NAME)

for index, message in enumerate(queue.receive_messages(MaxNumberOfMessages=10)):

    ...

    import time
    from jinja2 import Environment, PackageLoader

    env = Environment(loader=PackageLoader('repricer', 'xml_templates'), trim_blocks=True, lstrip_blocks=True)
    template = env.get_template('_POST_PRODUCT_PRICING_DATA_.xml')

    class Message(object):
        def __init__(self, s, price):
            self.SKU = s
            self.PRICE = round(price, 2)
            self.CURRENCY = USD_CURRENCY

    feed_messages = [
        Message(sku.sku, new_price),
    ]

    namespace = dict(MerchantId=AMZ_SELLER_ID, FeedMessages=feed_messages)
    feed_content = template.render(namespace).encode('utf-8')

    print(feed_content)

    feed = conn.submit_feed(
        FeedType='_POST_PRODUCT_PRICING_DATA_',
        PurgeAndReplace=False,
        MarketplaceIdList=[MARKETPLACE_ID],
        content_type='text/xml',
        FeedContent=feed_content
    )

    feed_info = feed.SubmitFeedResult.FeedSubmissionInfo
    print('Submitted product feed: ' + str(feed_info))

    while True:
        submission_list = conn.get_feed_submission_list(
            FeedSubmissionIdList=[feed_info.FeedSubmissionId]
        )
        info = submission_list.GetFeedSubmissionListResult.FeedSubmissionInfo[0]
        submission_id = info.FeedSubmissionId
        status = info.FeedProcessingStatus
        print('Submission Id: {}. Current status: {}'.format(submission_id, status))

        if status in ('_SUBMITTED_', '_IN_PROGRESS_', '_UNCONFIRMED_'):
            print('Sleeping and check again....')
            time.sleep(60)
        elif status == '_DONE_':
            feedResult = conn.get_feed_submission_result(FeedSubmissionId=submission_id)
            print(feedResult)
            break
        else:
            print("Submission processing error. Quit.")
            break

Ответ 1

В итоге я связался с поддержкой Amazon api, и они выяснили, что для изменения цены требуется 15 минут. Кроме того, у меня был еще один script, который загружал новые продукты и обновлял инвентарь и цену для существующих продуктов... этот script конкурировал с моей переоценкой script.

Я решил проблему, изменив, как вторая script обновляет цену для существующих продуктов.

Ответ 2

Существует несколько возможных причин, которые перечислены примерно в порядке вероятности:

1. Amazon медленнее обновляет значения, чем они говорят. Возможно, хотя фид был успешным, все еще есть период времени до того, как это изменение отразится на Amazon (даже изменение значений от SalesCentral приходит с сообщениями, что это не мгновенно).
Подождите несколько минут и посмотрите, не изменилось ли это изменение.


2. Возможно, у вас есть альтернативная служба переоценки. Если вы используете другой ответчик для этого SKU, он может конкурировать с вашими попытками и возвращать цену на основе собственного набора правил.
Можно использовать вызов GetFeedSubmissionList, чтобы узнать, был ли отправлен еще один _POST_PRODUCT_PRICING_DATA_ фид после вашего (хотя и без возможности просмотра представленного содержимого).


3. Возможно, существует конфликт с минимальными и максимальными ценами на SKU (независимо от того, установлены они вами или нет), а цена, которую вы пытались установить, находится за пределами допустимого диапазона. Это результат одной из политик Amazon, требующих наличия нового и обновленного SKU, чтобы иметь эти настройки или использует критерии по умолчанию.

В наших постоянных усилиях по снижению рисков ценовой ошибки для продавцов и во избежание потенциально негативного опыта клиентов, начиная с 14 января 2015 года, вы не сможете использовать настройки вашего продавца в качестве центрального варианта выбора "отказа" от все возможные правила ошибок с низкой и высокой ценой. Вместо этого вам нужно будет установить минимальную и максимальную разрешенную цену продажи для каждого продукта в вашем инвентаре, если вы не хотите, чтобы правила ошибки по умолчанию для Amazons по умолчанию применялись к этому продукту.

Я не могу найти страницу объявления на этом, так что это могло быть электронное письмо, но оно цитируется как таковое на forums

В этих условиях фид будет отчитываться успешно (потому что его ссылки/формат верны), но изменение цены будет терпеть неудачу из-за установленных пределов ценового диапазона.
Вы можете проверить, является ли это вашей проблемой, просмотрев SKU на странице SalesCentral Manage Inventory. Возможно, вам придется включить столбцы min/max для просмотра текущих значений в зависимости от ваших настроек, установленных для этой страницы.

К сожалению, нет способа вытащить минимальные/максимальные цены на предметы инвентаря, чтобы узнать, будет ли это досрочно:

Уважаемый продавец,

Я - Шарон из Amazon Seller Support, и я буду помогать вам с вашей заботой сегодня. Из содержания вашего электронного письма я понимаю, что вас беспокоит, есть ли отчет, в котором вы можете скачать отчет по "Минимальной цене" и "Максимальная цена".
Я с сожалением сообщаю вам, что на данный момент доступные отчеты будут предоставлять информацию только для "standard_price" и "list_price".
Я понимаю, что это разочарование для вас, но, пожалуйста, поймите, что из-за этой особенности включения "Минимальная цена" и "Максимальная цена" в отчетах о запасах не было включено, и я искренне извиняюсь за все неудобства, вызванные вами в этом что касается.

через билет поддержки в команду Amazon MWS, 03 июля 2016 г.


4. Возможно, Amazon не позволит фиду обновлять цену во время активной рекламы. Вы должны быть в состоянии проверить, продается ли товар, просмотрев страницу SalesCentral Manage Inventory, где столбец "цена" будет ограничен зеленым цветом.
Кажется маловероятным, поскольку для элемента "StandardPrice" требуется элемент "Продажа", но Amazon владеет инструментом "Автоматизация ценообразования", который перечисляет его как возможная причина для отказа инструмента.


5. Вы применяете обновление цены на неправильном рынке.
Если идентификатор, предоставленный для вызова в MarketplaceIdList=[MARKETPLACE_ID],, предназначен для другого рынка, чем тот, который вы проверяете, вы не увидите изменения цены.
Amazon не выполняет запрос подачи подачи, если вы отправляете на рынок, к которому у вас нет доступа, поэтому это может и не быть проблемой, если у вас только один рынок.


6.Вы ищете новую цену в неправильном месте.
Если вы просматриваете страницу SalesCentral Manage Inventory, убедитесь, что вы смотрите столбец "Цена", а не столбец "Самая низкая цена".
Если вы смотрите на страницу продукта или страницу предложения (на витрине Amazon), убедитесь, что вы смотрите на свое предложение. Вы не можете быть основным предложением, указанным на странице подробностей или верхним предложением, показанным на странице со списком предложений.
И, конечно же, убедитесь, что у вас есть правильный SKU/ASIN.


7. Это для другого канала, но пользователь сообщил, что Amazon просто не обновляет информацию, иногда, требуя кормить, чтобы быть возмущенным.


Существует альтернативный канал, который вы можете попробовать использовать для обновления информации о ценах _POST_FLAT_FILE_INVLOADER_DATA_, но это плоский тип файла (с разделителем табуляции), чтобы ваша XML-схема не переносилась. Вероятно, стоит только попробовать, если вы считаете, что проблема связана с конкретным каналом, который вы используете.

Ответ 3

Я не знаю Python, но ваш XML выглядит нормально, вот мой PHP-код, который я использую для изменения цены за последние 5 лет, и он отлично работает. Я не знаю, поможет ли это вам, как PHP.

$feed = <<< EOD
<?xml version="1.0" encoding="utf-8"?>
<AmazonEnvelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="amzn-envelope.xsd">
<Header>
<DocumentVersion>1.01</DocumentVersion>
<MerchantIdentifier>$merchant_token</MerchantIdentifier>
</Header>
<MessageType>Price</MessageType>
<Message>
  <MessageID>1</MessageID>
  <Price>
    <SKU>$sku</SKU>
    <StandardPrice currency="$currency">$new_price</StandardPrice>
  </Price>
</Message>
</AmazonEnvelope>
EOD;
    $feed = trim($feed);

    $feedHandle = @fopen('php://temp', 'rw+');
    fwrite($feedHandle, $feed);
    rewind($feedHandle);
    $parameters = array(
        'Merchant' => $MERCHANT_ID,
        'MarketplaceIdList' => $marketplaceIdArray,
        'FeedType' => '_POST_PRODUCT_PRICING_DATA_',
        'FeedContent' => $feedHandle,
        'PurgeAndReplace' => false, //Leave this PurgeAndReplace to false so that it want replace whole product in amazon inventory
        'ContentMd5' => base64_encode(md5(stream_get_contents($feedHandle), true))
    );
    rewind($feedHandle);

    $request = new MarketplaceWebService_Model_SubmitFeedRequest($parameters);
    $return_feed = invokeSubmitFeed($service, $request, $price_change_info_log);

    fclose($feedHandle);