批量喂食新商品时,我从 Walmart Canada Maketplace API 收到 404

问题描述

我可以使用 Nodejs 从 Walmart Canada Marketplace API 获取数据,但我无法使用他们的批量提要端点发布新项目。我收到 404 '错误请求'。我不确定错误是在 POST 请求中还是在 JSON 中。我也不确定 Walmart Canada 是否真的接受 JSON 文件或只是声称接受。

这是我的代码

import { createSign,randomBytes } from 'crypto'
import fetch from 'node-fetch';
import { resolve } from 'url';
import fs from 'fs';


const method = 'post';

const BASE_URL = 'https://marketplace.walmartapis.com/'

const PK_HEADER = '\n-----BEGIN PRIVATE KEY-----\n'
const PK_FOOTER = '\n-----END PRIVATE KEY-----\n'

const WALMART_CONSUMER =  "consumer";
const WALMART_CHANNEL = 'channel';
const WALMART_SECRET = 'secret';


function generateCorrelationId () {
  return randomBytes(16).toString('hex')
}

function generateSignature (url,method,timestamp) {

  const privateKey = `${PK_HEADER}${WALMART_SECRET}${PK_FOOTER}`



  const stringToSign = WALMART_CONSUMER + '\n' +
                     url + '\n' +
                     method.toupperCase() + '\n' +
                     timestamp + '\n'

  const sign = createSign('RSA-SHA256')

  sign.update(stringToSign)
  return sign.sign(privateKey,'base64')
}
  const url = resolve(BASE_URL,"/v3/ca/Feeds?FeedType=item")

  const timestamp = Date.Now()
  const signature = generateSignature(url,timestamp)

  const headers = {
    'WM_SVC.NAME': 'Walmart Marketplace','WM_CONSUMER.ID': WALMART_CONSUMER,'WM_SEC.TIMESTAMP': timestamp,'WM_SEC.AUTH_SIGNATURE': signature,'WM_QOS.CORRELATION_ID': generateCorrelationId(),'WM_CONSUMER.CHANNEL.TYPE': WALMART_CHANNEL,'WM_TENANT_ID' : 'WALMART.CA','WM_LOCALE_ID' : 'en_CA','Accept': 'application/xml','Content-Type': 'multipart/form-data'

  }

  fetch(url,{
    method: method,headers: headers,formData: {
        'file': {
          'value': fs.createReadStream('wm_new_item.json'),'options': {
            'filename': 'wm_new_item.json'
          }
        }
      }
  })
  .then(response => console.log(response))
  .catch(function (error) {
    console.log(error)
  });

这是我的 json 文件

{
"MPItemFeedHeader":{
   "subset":"INTERNAL","mart":"WALMART_CA","sellingChannel":"marketplace","subCategory":"toys_other","locale":"en","version":"3.2","requestId": "1606485958","requestBatchId": "1606485958","processMode":"REPLACE"
},"MPItem":[
   {
      "Orderable":{
         "sku":"2663d9467e64a0a94ab0eeeccd9f37dd","productIdentifiers":{
            "productIdType":"UPC","productId":"078257310609"
         },"productName":"abc","brand":"abc","price":1.00,"fulfillmentLagTime":6,"floorPrice":1.00,"startDate":"2021-04-20T08:37:30Z","endDate":"2021-04-20T08:37:30Z","ProductIdUpdate":"No","SkuUpdate":"No","ShippingWeight":1
      },"Visible":{
         "Toys":{
            "shortDescription":"abc","mainImageUrl":"https://images-na.ssl-images-amazon.com/images/I/71X4z76HUTS._AC_SL1500_.jpg","productSecondaryImageURL":[
               "https://images-na.ssl-images-amazon.com/images/I/71X4z76HUTS._AC_SL1500_.jpg","https://images-na.ssl-images-amazon.com/images/I/71X4z76HUTS._AC_SL1500_.jpg"
            ],"msrp":1.00,"variantGroupId":"abc","variantAttributeNames":[
               "color"
            ],"isPrimaryVariant":"Yes"

         }
      }
   }
]

}

谢谢!

解决方法

我在另一个问题的 this answer 的帮助下想通了。

您最好参考 this 而非 Walmarts 官方文档

您需要向 "https://marketplace.walmartapis.com/v3/feeds 端点提交一个发布请求,并将您的类型附加到 url ?feedType=[something]

如果您向他们发送 JSON,您需要确保您的 "Content-Type""application/json"

您不需要像文档建议的那样多部分发送它,只需将整个 JSON 文件作为正文发送即可。