1

我正在使用 Ruby on Rails 集成我的应用程序 Walmart Marketplace API。

  1. 如果我尝试为多个参数生成 Auth 签名,它不会生成它并返回异常。我正在使用 Jar 文件生成 Auth 签名

     For e.g. -: https://marketplace.walmartapis.com/v3/orders?createdStartDate=2016-09-13&createdEndDate=2016-09-23 
     Does anyone generate Auth Signature & timestamp for multiple parameter for Walmart Marketplace API

  2. 是否需要为每个 API 调用生成身份验证签名和时间戳,例如 . 分页调用也?

  1. 每次通话都需要进行身份验证吗?
4

3 回答 3

3

附加评论

我知道这是一个月后,你已经弄清楚了你的程序,但如果你需要这些部分的帮助或其他人需要帮助,我想我会在沃尔玛 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 编码并删除空格,然后您就可以提出请求了。

于 2016-10-20T20:40:31.257 回答
0
  1. 如果我尝试为多个参数生成 Auth 签名,它不会生成它并返回异常。我正在使用 Jar 文件来生成 Auth 签名。使用 SHA 类而不是 jar 文件 => 它也会为多个参数生成签名。

    import org.apache.commons.codec.binary.Base64; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec;

    public class SHA256WithRSAAlgo { private static String consumerId = "b68d2a72...."; // Trimmed for security reason private static String baseUrl = "https://marketplace.walmartapis.com/v2/feeds"; private static String privateEncodedStr = "MIICeAIBADANBgkqhkiG9w0BAQEFAA......"; //Trimmed for security reasons public static void main(String[] args) { String httpMethod = "GET"; String timestamp = String.valueOf(System.currentTimeMillis()); String stringToSign = consumerId + "\n" + baseUrl + "\n" + httpMethod + "\n" + timestamp + "\n"; String signedString = SHA256WithRSAAlgo.signData(stringToSign, privateEncodedStr); System.out.println("Signed String: " + signedString); } public static String signData(String stringToBeSigned, String encodedPrivateKey) { String signatureString = null; try { byte[] encodedKeyBytes = Base64.decodeBase64(encodedPrivateKey); PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(encodedKeyBytes); KeyFactory kf = KeyFactory.getInstance("RSA"); PrivateKey myPrivateKey = kf.generatePrivate(privSpec); Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(myPrivateKey); byte[] data = stringToBeSigned.getBytes("UTF-8"); signature.update(data); byte[] signedBytes = signature.sign(); signatureString = Base64.encodeBase64String(signedBytes); } catch (Exception e) { e.printStackTrace(); } return signatureString; } }

    1. 是否需要为每个 API 调用生成身份验证签名和时间戳,例如 . 分页调用也?是的,对于包括分页在内的每个调用,您都需要生成新的签名和时间戳。

    2. 每次通话都需要进行身份验证吗?是的,每次调用都需要进行身份验证。

于 2017-08-30T05:49:14.780 回答
0
  1. 为了通过转义字符串生成多个参数传递字符串。

  2. 需要为每个 API 调用生成身份验证签名和时间戳,例如。分页调用也

于 2016-09-29T13:32:24.070 回答