Sample code for 30+ languages & platforms
PureBasic

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 PureBasic Downloads

PureBasic
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkPrivateKey.pb"
IncludeFile "CkRsa.pb"
IncludeFile "CkDateTime.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    consumerId.s = "b68d2a72...."
    baseUrl.s = "https://marketplace.walmartapis.com/v2/feeds"
    ; This is your Base64 encoded private key
    privateEncodedStr.s = "MIICeAIBADANBgkqhkiG9w0BAQEFAA......"
    httpMethod.s = "GET"

    ; We need a timestamp in decimal string form representing the number of milliseconds since Jan 01 1970 UTC.
    dt.i = CkDateTime::ckCreate()
    If dt.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Set bLocal = 1 for a timestamp in the local timezone.  Set bLocal = 0 for a UTC timestamp.
    bLocal.i = 0
    ; This gets the timestamp in seconds, not milliseconds.
    timeStampVal.i = CkDateTime::ckGetAsUnixTime(dt,bLocal)

    ; Build the string to sign.
    sbStringToSign.i = CkStringBuilder::ckCreate()
    If sbStringToSign.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkStringBuilder::ckAppend(sbStringToSign,consumerId)
    CkStringBuilder::ckAppend(sbStringToSign,Chr(10))
    CkStringBuilder::ckAppend(sbStringToSign,baseUrl)
    CkStringBuilder::ckAppend(sbStringToSign,Chr(10))
    CkStringBuilder::ckAppend(sbStringToSign,httpMethod)
    CkStringBuilder::ckAppend(sbStringToSign,Chr(10))
    CkStringBuilder::ckAppendInt(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::ckAppend(sbStringToSign,"000" + Chr(10))

    privKey.i = CkPrivateKey::ckCreate()
    If privKey.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; 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::ckLoadPem(privKey,privateEncodedStr)
    If success = 0
        Debug CkPrivateKey::ckLastErrorText(privKey)
        CkDateTime::ckDispose(dt)
        CkStringBuilder::ckDispose(sbStringToSign)
        CkPrivateKey::ckDispose(privKey)
        ProcedureReturn
    EndIf

    rsa.i = CkRsa::ckCreate()
    If rsa.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkRsa::ckUsePrivateKey(rsa,privKey)
    If success = 0
        Debug CkRsa::ckLastErrorText(rsa)
        CkDateTime::ckDispose(dt)
        CkStringBuilder::ckDispose(sbStringToSign)
        CkPrivateKey::ckDispose(privKey)
        CkRsa::ckDispose(rsa)
        ProcedureReturn
    EndIf

    ; We want a base64 signature string.
    CkRsa::setCkEncodingMode(rsa, "base64")

    signatureString.s = CkRsa::ckSignStringENC(rsa,CkStringBuilder::ckGetAsString(sbStringToSign),"SHA256")
    If CkRsa::ckLastMethodSuccess(rsa) = 0
        Debug CkRsa::ckLastErrorText(rsa)
        CkDateTime::ckDispose(dt)
        CkStringBuilder::ckDispose(sbStringToSign)
        CkPrivateKey::ckDispose(privKey)
        CkRsa::ckDispose(rsa)
        ProcedureReturn
    EndIf

    Debug "Signature String: " + signatureString


    CkDateTime::ckDispose(dt)
    CkStringBuilder::ckDispose(sbStringToSign)
    CkPrivateKey::ckDispose(privKey)
    CkRsa::ckDispose(rsa)


    ProcedureReturn
EndProcedure