Unicode C
Unicode 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 Unicode C Downloads
#include <C_CkDateTimeW.h>
#include <C_CkStringBuilderW.h>
#include <C_CkPrivateKeyW.h>
#include <C_CkRsaW.h>
void ChilkatSample(void)
{
BOOL success;
const wchar_t *consumerId;
const wchar_t *baseUrl;
const wchar_t *privateEncodedStr;
const wchar_t *httpMethod;
HCkDateTimeW dt;
BOOL bLocal;
int timeStampVal;
HCkStringBuilderW sbStringToSign;
HCkPrivateKeyW privKey;
HCkRsaW rsa;
const wchar_t *signatureString;
success = FALSE;
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
consumerId = L"b68d2a72....";
baseUrl = L"https://marketplace.walmartapis.com/v2/feeds";
// This is your Base64 encoded private key
privateEncodedStr = L"MIICeAIBADANBgkqhkiG9w0BAQEFAA......";
httpMethod = L"GET";
// We need a timestamp in decimal string form representing the number of milliseconds since Jan 01 1970 UTC.
dt = CkDateTimeW_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 = CkDateTimeW_GetAsUnixTime(dt,bLocal);
// Build the string to sign.
sbStringToSign = CkStringBuilderW_Create();
CkStringBuilderW_Append(sbStringToSign,consumerId);
CkStringBuilderW_Append(sbStringToSign,L"\n");
CkStringBuilderW_Append(sbStringToSign,baseUrl);
CkStringBuilderW_Append(sbStringToSign,L"\n");
CkStringBuilderW_Append(sbStringToSign,httpMethod);
CkStringBuilderW_Append(sbStringToSign,L"\n");
CkStringBuilderW_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).
CkStringBuilderW_Append(sbStringToSign,L"000\n");
privKey = CkPrivateKeyW_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 = CkPrivateKeyW_LoadPem(privKey,privateEncodedStr);
if (success == FALSE) {
wprintf(L"%s\n",CkPrivateKeyW_lastErrorText(privKey));
CkDateTimeW_Dispose(dt);
CkStringBuilderW_Dispose(sbStringToSign);
CkPrivateKeyW_Dispose(privKey);
return;
}
rsa = CkRsaW_Create();
success = CkRsaW_UsePrivateKey(rsa,privKey);
if (success == FALSE) {
wprintf(L"%s\n",CkRsaW_lastErrorText(rsa));
CkDateTimeW_Dispose(dt);
CkStringBuilderW_Dispose(sbStringToSign);
CkPrivateKeyW_Dispose(privKey);
CkRsaW_Dispose(rsa);
return;
}
// We want a base64 signature string.
CkRsaW_putEncodingMode(rsa,L"base64");
signatureString = CkRsaW_signStringENC(rsa,CkStringBuilderW_getAsString(sbStringToSign),L"SHA256");
if (CkRsaW_getLastMethodSuccess(rsa) == FALSE) {
wprintf(L"%s\n",CkRsaW_lastErrorText(rsa));
CkDateTimeW_Dispose(dt);
CkStringBuilderW_Dispose(sbStringToSign);
CkPrivateKeyW_Dispose(privKey);
CkRsaW_Dispose(rsa);
return;
}
wprintf(L"Signature String: %s\n",signatureString);
CkDateTimeW_Dispose(dt);
CkStringBuilderW_Dispose(sbStringToSign);
CkPrivateKeyW_Dispose(privKey);
CkRsaW_Dispose(rsa);
}