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