Xbase++
Xbase++
Payeezy HMAC Computation
See more HTTP Misc Examples
Demonstrates how to calculate the HMAC for a Payeezy REST request.Chilkat Xbase++ Downloads
LOCAL nSuccess
LOCAL oCrypt
LOCAL oPrng
LOCAL cApiKey
LOCAL cApiSecret
LOCAL cToken
LOCAL cNonce
LOCAL oDtNow
LOCAL oSbTimestamp
LOCAL cTimestamp
LOCAL oJson
LOCAL oSbHmacData
LOCAL cHexHash
LOCAL oSbBase64Hash
nSuccess := 0
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
oCrypt := CreateObject("Chilkat.Crypt2")
oPrng := CreateObject("Chilkat.Prng")
// An API key such as y6pWAJNyJyjGv66IsVuWnklkKUPFbb0a
cApiKey := "my_api_key"
// An API secret such as 86fbae7030253af3cd15faef2a1f4b67353e41fb6799f576b5093ae52901e6f7
cApiSecret := "my_api_secret"
// A token such as fdoa-a480ce8951daa73262734cf102641994c1e55e7cdf4c02b6
cToken := "my_merchant_token"
// The nonce is a random number (bytes), something like "6057786719490086000"
cNonce := oPrng:GenRandom(8, "decimal")
? "nonce = " + cNonce
oDtNow := CreateObject("Chilkat.CkDateTime")
oDtNow:SetFromCurrentSystemTime()
oSbTimestamp := CreateObject("Chilkat.StringBuilder")
// Get the epoch timestamp in seconds
oSbTimestamp:Append(oDtNow:GetAsUnixTimeStr(0))
// Change it to milliseconds
oSbTimestamp:Append("000")
// The timestamp is a number similar to this: 1546011905000 (which is a timestamp taken on 28-Dec-2018).
cTimestamp := oSbTimestamp:GetAsString()
? "timestamp = " + cTimestamp
// Generate the following JSON request body:
// {
// "merchant_ref": "Astonishing-Sale",
// "transaction_type": "authorize",
// "method": "token",
// "amount": "200",
// "currency_code": "USD",
// "token": {
// "token_type": "FDToken",
// "token_data": {
// "type": "visa",
// "value": "2537446225198291",
// "cardholder_name": "JohnSmith",
// "exp_date": "1030",
// "special_payment": "B"
// }
// }
// }
oJson := CreateObject("Chilkat.JsonObject")
oJson:UpdateString("merchant_ref", "Astonishing-Sale")
oJson:UpdateString("transaction_type", "authorize")
oJson:UpdateString("method", "token")
oJson:UpdateString("amount", "200")
oJson:UpdateString("currency_code", "USD")
oJson:UpdateString("token.token_type", "FDToken")
oJson:UpdateString("token.token_data.type", "visa")
oJson:UpdateString("token.token_data.value", "2537446225198291")
oJson:UpdateString("token.token_data.cardholder_name", "JohnSmith")
oJson:UpdateString("token.token_data.exp_date", "1030")
oJson:UpdateString("token.token_data.special_payment", "B")
// string hashData = apiKey + nonce + timestamp + token + jsonString;
oSbHmacData := CreateObject("Chilkat.StringBuilder")
oSbHmacData:Append(cApiKey)
oSbHmacData:Append(cNonce)
oSbHmacData:Append(cTimestamp)
oSbHmacData:Append(cToken)
oSbHmacData:Append(oJson:Emit())
// HMAC the data to produce a hex string.
oCrypt:EncodingMode := "hexlower"
oCrypt:MacAlgorithm := "hmac"
oCrypt:SetMacKeyString(cApiSecret)
oCrypt:HashAlgorithm := "sha256"
oCrypt:Charset := "utf-8"
cHexHash := oCrypt:MacStringENC(oSbHmacData:GetAsString())
// Now base64 encode the hex string:
oSbBase64Hash := CreateObject("Chilkat.StringBuilder")
oSbBase64Hash:Append(cHexHash)
oSbBase64Hash:Encode("base64", "utf-8")
? "This is the Authorization header to be sent with the payeezy request:"
? "Authorization: " + oSbBase64Hash:GetAsString()
oCrypt:destroy()
oPrng:destroy()
oDtNow:destroy()
oSbTimestamp:destroy()
oJson:destroy()
oSbHmacData:destroy()
oSbBase64Hash:destroy()