Sample code for 30+ languages & platforms
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

Unicode C
#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);

    }