附加评论
我知道这是一个月后,你已经弄清楚了你的程序,但如果你需要这些部分的帮助或其他人需要帮助,我想我会在沃尔玛 API 上包含以下信息。
1.您可能想考虑在 ruby 中构建一个方法,因为它会与您的 ruby 程序的其余部分更具交互性,这有点困难,但是当我这样做时,最困难的部分是将字符串包装在要签名的字符串的 SHA256 摘要。所以我把一些方法放在一起,它的工作原理:
pem = make_pem('PRIVATE KEY', encodedKeyBytes)
digest = OpenSSL::Digest::SHA256.new
pkey = OpenSSL::PKey::RSA.new(pem)
signature = pkey.sign(digest, stringToSign)
def make_pem(tag, der)
box tag, Base64.strict_encode64(der).scan(/.{1,64}/)
end
def box(tag, lines)
lines.unshift "-----BEGIN #{tag}-----"
lines.push "-----END #{tag}-----"
lines.join("\n")
end
它并不完美,但 ruby 并没有真正内置功能,因此您必须对其进行更改才能使其正常工作。如果这仍然不起作用,请随时与我联系,但我开始使用他们提供的 jar,我保证当您每天使用不同的参数和 url 进行数千次不同的调用时,有必要能够找到要点失败,如果它不在红宝石中,那么使用和修复将变得更加困难。
2/3。您已经回答说,这些都需要包含在对 API 的每次调用中,除了不尝试找到解决此问题的方法之外,我真的没有其他要添加的内容,例如为一批调用提交相同的时间戳。即使在特定时间窗口内拨打电话可能会起作用,但沃尔玛使用时间戳来确定最后一次拨打电话,这对于他们的价格 API 之类的事情尤其重要。如有任何问题,请随时给我发电子邮件,我也会尝试在这里回复,但我不经常在这个网站上回复。
变量名 我使用这些变量名只是为了引用 walmart 开发人员指南中提供的代码。我只是要将那里的 java 代码翻译成 ruby,以展示我如何获得 stringToSign 和 encodedKeyBytes 的值。
# This is provided to you by walmart
consumerId = "b68d2a72...."
# Also provided by walmart
privateEncodedStr = "MIICeAIBADANBgkqhkiG9w0BAQEFAA......"
# Full path
baseUrl = "https://marketplace.walmartapis.com/v2/feeds"
# HTTP Method Verb
httpMethod = "GET"
timestamp = (Time.now.to_f * 1000).to_i.to_s
stringToSign = consumerId + "\n" + baseUrl + "\n" + httpMethod + "\n" + timestamp + "\n"
encodedKeyBytes = Base64.decode64(privateEncodedStr)
从那里您只需通过原始代码运行它,然后对签名进行 base64 编码并删除空格,然后您就可以提出请求了。