2

(我最终想要完成的是使用产品代码在 Walmart.com 上查找单个产品,所以如果有人有另一种方法,那也可以)

Walmart.io 的 Product Lookup API 需要一个名为“WM_SEC.AUTH_SIGNATURE”的标头,但我不知道如何使用 Ruby 生成它。这里给出了一些 Java 代码(我不确定在这里复制该代码的合法性)但我不了解 Java,所以我不明白他们在做什么。

这个 SO question试图解释这个过程,但我也不清楚到底在做什么。

要使用您自己的代码获取数字签名,请执行以下步骤:

  1. 获取您在卖家中心生成的消费者 ID 和 Base 64 编码的私钥。

  2. 获取您希望调用的完整 URL,包括任何路径和查询参数。

  3. 使用 GET 方法构造数字签名的输入。

  4. 使用下面列出的结构:发给您的消费者 ID_+“\n”+您正在进行的 API 调用的 URL +“\n”+您正在进行的 API 调用的请求方法(全部大写)+“\n " + Unix Epoch 时间戳(自 1970 年 1 月 1 日 UTC 以来的毫秒数)+ "\n" ** 注意:参数的顺序和行返回 \n 对于正确生成签名很重要

使用以下步骤生成步骤 3 中列出的结构化数据的字节数组:

一个。使用 Base-64 解码字节数组。

湾。使用 PKCS#8 对结果值进行编码以表示您的私钥。各种语言的库提供了识别私钥是 PKCS#8 格式而不是其他冲突格式(如 PKCS#1)的能力。

C。使用您的私钥的这个字节表示,使用带有 RSA 的 SHA-256 对数据进行签名。

d。使用 Base-64 对生成的数字签名进行编码。

使用生成的数字签名和时间戳进行 API 调用。

我已经做到了:

time = DateTime.now.strftime('%Q')
customerid = "customerid"
link = "https://developer.api.walmart.com/api-proxy/service/affil/product/v2/items/4837473"
method = "POST"
uncoded = customerid + "\n" + link + "\n" + method + "\n" + time + "\n"
encoded = Base64.encode64(uncoded)
privatekey = "longrsakey"

但我不知道如何继续。我是否必须将 my 编码privatekey为 PKCS#8,然后使用结果对 my 进行编码encoded?我什至在 Ruby 中找不到 PKCS#8 编码器。

任何人都可以帮忙吗?

4

1 回答 1

0

假设您正在尝试访问附属 API,以下是创建发出请求所需的签名的方法:

version = 'YOUR VERSION'
consumer_id = "YOUR CONSUMER ID"
time_stamp = (Time.now.to_i * 1000).to_s
p_key = "YOUR PRIVATE KEY"
digest = OpenSSL::Digest.new('sha256')

data = consumer_id + "\n" + time_stamp + "\n" + version + "\n"

k = OpenSSL::PKey::RSA.new(p_key.to_s)
digest = OpenSSL::Digest::SHA256.new
signature = k.sign(digest,data)
signature = Base64.strict_encode64(signature)

headers = {
  "WM_SEC.KEY_VERSION": version,
  "WM_CONSUMER.ID": consumer_id,
  "WM_CONSUMER.INTIMESTAMP": time_stamp,
  "WM_SEC.AUTH_SIGNATURE": signature
}

puts HTTParty.get("https://developer.api.walmart.com/api-proxy/service/affil/product/v2/taxonomy", headers: headers).parsed_response
于 2021-09-02T21:25:55.867 回答