Tcl
Tcl
Payeezy HMAC Computation
See more HTTP Misc Examples
Demonstrates how to calculate the HMAC for a Payeezy REST request.Chilkat Tcl Downloads
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