1

我正在使用Ruby on Rails集成我的應用程序沃爾瑪市場API。沃爾瑪市場API集成和身份驗證

1.如果我嘗試爲多個參數生成Auth簽名,它不生成Auth簽名並返回異常。我使用一個Jar文件來生成驗證簽名

    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調用e.g產生。分頁調用還有?

  1. 驗證是否需要爲每個呼叫執行?

回答

0
  1. ,以便產生多個參數傳遞的字符串作爲通過轉義刺痛。

  2. 驗證簽名&需要爲每個API調用生成時間戳,例如:分頁調用也

2

附加評論

我知道這是一個月後,你已經有你的程序想通了,但如果你需要一些幫助,這些部件或其他人呢,我想我將包括我在沃爾瑪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 

它並不完美,但紅寶石並沒有真正具備的功能內置,你必須改變周圍它才能正常工作。如果這仍然不起作用,請隨時與我聯繫,但我開始使用它們提供的jar,並且我保證,當您每天使用不同的參數進行數千次不同的調用時,必須能夠找到點的失敗,如果它不是紅寶石,它會變得更難以處理和修復。

2/3。您已經回答說,這些需要包含在對API的每次調用中,除了不嘗試找到解決此問題的方法之外,我沒有其他任何要添加的內容,例如爲一批調用提交相同的時間戳。即使它可能在某個時間窗口內進行呼叫,沃爾瑪也會使用時間戳來確定哪個呼叫來自哪個呼叫,這對於他們的價格API等事情尤其重要。再次隨時給我發電子郵件的任何問題,我會嘗試在這裏迴應,但我不經常這個網站。

1
  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; } }

  2. 確實驗證簽名&時間戳需要爲每個API調用e.g產生。分頁調用還有? 是的,對於包括分頁在內的每個呼叫,您都需要生成新的簽名和時間戳。

  3. 驗證是否需要爲每個呼叫完成? 是的,驗證需要爲每個電話做。