Sample code for 30+ languages & platforms
Tcl

Payeezy HMAC Computation

See more HTTP Misc Examples

Demonstrates how to calculate the HMAC for a Payeezy REST request.

Chilkat Tcl Downloads

Tcl

load ./chilkat.dll

set success 0

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

set crypt [new_CkCrypt2]

set prng [new_CkPrng]

# An API key such as y6pWAJNyJyjGv66IsVuWnklkKUPFbb0a
set apiKey "my_api_key"
# An API secret such as 86fbae7030253af3cd15faef2a1f4b67353e41fb6799f576b5093ae52901e6f7
set apiSecret "my_api_secret"
# A token such as fdoa-a480ce8951daa73262734cf102641994c1e55e7cdf4c02b6
set token "my_merchant_token"

# The nonce is a random number (bytes), something like "6057786719490086000"
set nonce [CkPrng_genRandom $prng 8 "decimal"]
puts "nonce = $nonce"

set dtNow [new_CkDateTime]

CkDateTime_SetFromCurrentSystemTime $dtNow
set sbTimestamp [new_CkStringBuilder]

# Get the epoch timestamp in seconds
CkStringBuilder_Append $sbTimestamp [CkDateTime_getAsUnixTimeStr $dtNow 0]
# Change it to milliseconds
CkStringBuilder_Append $sbTimestamp "000"
# The timestamp is a number similar to this: 1546011905000 (which is a timestamp taken on 28-Dec-2018).
set timestamp [CkStringBuilder_getAsString $sbTimestamp]
puts "timestamp = $timestamp"

# 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"
# 	    }
# 	  }
# 	}

set json [new_CkJsonObject]

CkJsonObject_UpdateString $json "merchant_ref" "Astonishing-Sale"
CkJsonObject_UpdateString $json "transaction_type" "authorize"
CkJsonObject_UpdateString $json "method" "token"
CkJsonObject_UpdateString $json "amount" "200"
CkJsonObject_UpdateString $json "currency_code" "USD"
CkJsonObject_UpdateString $json "token.token_type" "FDToken"
CkJsonObject_UpdateString $json "token.token_data.type" "visa"
CkJsonObject_UpdateString $json "token.token_data.value" "2537446225198291"
CkJsonObject_UpdateString $json "token.token_data.cardholder_name" "JohnSmith"
CkJsonObject_UpdateString $json "token.token_data.exp_date" "1030"
CkJsonObject_UpdateString $json "token.token_data.special_payment" "B"

# string hashData = apiKey + nonce + timestamp + token + jsonString;
set sbHmacData [new_CkStringBuilder]

CkStringBuilder_Append $sbHmacData $apiKey
CkStringBuilder_Append $sbHmacData $nonce
CkStringBuilder_Append $sbHmacData $timestamp
CkStringBuilder_Append $sbHmacData $token
CkStringBuilder_Append $sbHmacData [CkJsonObject_emit $json]

# HMAC the data to produce a hex string.
CkCrypt2_put_EncodingMode $crypt "hexlower"
CkCrypt2_put_MacAlgorithm $crypt "hmac"
CkCrypt2_SetMacKeyString $crypt $apiSecret
CkCrypt2_put_HashAlgorithm $crypt "sha256"
CkCrypt2_put_Charset $crypt "utf-8"
set hexHash [CkCrypt2_macStringENC $crypt [CkStringBuilder_getAsString $sbHmacData]]

# Now base64 encode the hex string:
set sbBase64Hash [new_CkStringBuilder]

CkStringBuilder_Append $sbBase64Hash $hexHash
CkStringBuilder_Encode $sbBase64Hash "base64" "utf-8"

puts "This is the Authorization header to be sent with the payeezy request:"
puts "Authorization: [CkStringBuilder_getAsString $sbBase64Hash]"

delete_CkCrypt2 $crypt
delete_CkPrng $prng
delete_CkDateTime $dtNow
delete_CkStringBuilder $sbTimestamp
delete_CkJsonObject $json
delete_CkStringBuilder $sbHmacData
delete_CkStringBuilder $sbBase64Hash