C
C
Walmart Partner API Authentication (Generate a Signature for a Request)
See more RSA Examples
Demonstrates how to generate a signature for a Walmart Partner REST API call.Chilkat C Downloads
#include <C_CkDateTime.h>
#include <C_CkStringBuilder.h>
#include <C_CkPrivateKey.h>
#include <C_CkRsa.h>
void ChilkatSample(void)
{
BOOL success;
const char *consumerId;
const char *baseUrl;
const char *privateEncodedStr;
const char *httpMethod;
HCkDateTime dt;
BOOL bLocal;
int timeStampVal;
HCkStringBuilder sbStringToSign;
HCkPrivateKey privKey;
HCkRsa rsa;
const char *signatureString;
success = FALSE;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
consumerId = "b68d2a72....";
baseUrl = "https://marketplace.walmartapis.com/v2/feeds";
// This is your Base64 encoded private key
privateEncodedStr = "MIICeAIBADANBgkqhkiG9w0BAQEFAA......";
httpMethod = "GET";
// We need a timestamp in decimal string form representing the number of milliseconds since Jan 01 1970 UTC.
dt = CkDateTime_Create();
// Set bLocal = TRUE for a timestamp in the local timezone. Set bLocal = FALSE for a UTC timestamp.
bLocal = FALSE;
// This gets the timestamp in seconds, not milliseconds.
timeStampVal = CkDateTime_GetAsUnixTime(dt,bLocal);
// Build the string to sign.
sbStringToSign = CkStringBuilder_Create();
CkStringBuilder_Append(sbStringToSign,consumerId);
CkStringBuilder_Append(sbStringToSign,"\n");
CkStringBuilder_Append(sbStringToSign,baseUrl);
CkStringBuilder_Append(sbStringToSign,"\n");
CkStringBuilder_Append(sbStringToSign,httpMethod);
CkStringBuilder_Append(sbStringToSign,"\n");
CkStringBuilder_AppendInt(sbStringToSign,timeStampVal);
// We add three zero's so that the timestamp value is in milliseconds.
// We don't care about accuracy down to less than a second.
// All the server cares about is that the request was signed at the current date/time
// within some reasonable margin of error (to account for systems having clocks
// that may be slightly different).
CkStringBuilder_Append(sbStringToSign,"000\n");
privKey = CkPrivateKey_Create();
// Load the private key into a private key object.
// Note: Technically the private key is not PEM because it lacks the header/footer strings
// used for PEM. However, the LoadPem method will still accept it and load it correctly.
success = CkPrivateKey_LoadPem(privKey,privateEncodedStr);
if (success == FALSE) {
printf("%s\n",CkPrivateKey_lastErrorText(privKey));
CkDateTime_Dispose(dt);
CkStringBuilder_Dispose(sbStringToSign);
CkPrivateKey_Dispose(privKey);
return;
}
rsa = CkRsa_Create();
success = CkRsa_UsePrivateKey(rsa,privKey);
if (success == FALSE) {
printf("%s\n",CkRsa_lastErrorText(rsa));
CkDateTime_Dispose(dt);
CkStringBuilder_Dispose(sbStringToSign);
CkPrivateKey_Dispose(privKey);
CkRsa_Dispose(rsa);
return;
}
// We want a base64 signature string.
CkRsa_putEncodingMode(rsa,"base64");
signatureString = CkRsa_signStringENC(rsa,CkStringBuilder_getAsString(sbStringToSign),"SHA256");
if (CkRsa_getLastMethodSuccess(rsa) == FALSE) {
printf("%s\n",CkRsa_lastErrorText(rsa));
CkDateTime_Dispose(dt);
CkStringBuilder_Dispose(sbStringToSign);
CkPrivateKey_Dispose(privKey);
CkRsa_Dispose(rsa);
return;
}
printf("Signature String: %s\n",signatureString);
CkDateTime_Dispose(dt);
CkStringBuilder_Dispose(sbStringToSign);
CkPrivateKey_Dispose(privKey);
CkRsa_Dispose(rsa);
}