我正在使用Ruby on Rails集成我的应用程序Walmart Marketplace API。
1.如果我尝试为多个参数生成Auth签名,它不会生成它并返回异常。我正在使用Jar文件生成Auth签名
2
2. Auth Signature&例如,需要为每个API调用生成时间戳。分页呼叫也是?
答案 0 :(得分:3)
其他评论
我知道这是一个月之后你已经找到了你的程序但是如果你需要这些部分或其他任何人的帮助,我想我会在Walmart 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并且我保证当你每天使用不同的参数和网址制作成千上万的不同电话时,有必要找到关键点失败,如果它不是红宝石,它将更难以使用和修复。
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编码签名并删除空格,然后你就可以提出请求了。
答案 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;
}
}
Auth Signature&例如,需要为每个API调用生成时间戳。分页呼叫还? 是的,对于包括分页在内的每个电话,您需要生成新的签名和时间戳。
每次通话都需要验证吗? 是的,每次通话需要进行身份验证。
答案 2 :(得分:0)
为了通过逃避刺痛来生成多个参数传递字符串。
Auth Signature&例如,需要为每个API调用生成时间戳。分页呼叫