Sample code for 30+ languages & platforms
Tcl

Payeezy Place Temp Authorization Hold on Buyer’s Credit Card

See more HTTP Misc Examples

Demonstrates how to place a temporary authorization hold for the desired amount on the buyer’s credit card. You can Capture the authorized amount on completion of service or Void/Refund the transaction as required.

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": "credit_card",
#   "amount": "1299",
#   "currency_code": "USD",
#   "credit_card": {
#     "type": "visa",
#     "cardholder_name": "John Smith",
#     "card_number": "4788250000028291",
#     "exp_date": "1020",
#     "cvv": "123"
#   }
# }

set json [new_CkJsonObject]

CkJsonObject_UpdateString $json "merchant_ref" "Astonishing-Sale"
CkJsonObject_UpdateString $json "transaction_type" "authorize"
CkJsonObject_UpdateString $json "method" "credit_card"
CkJsonObject_UpdateString $json "amount" "1299"
CkJsonObject_UpdateString $json "currency_code" "USD"
CkJsonObject_UpdateString $json "credit_card.type" "visa"
CkJsonObject_UpdateString $json "credit_card.cardholder_name" "John Smith"
CkJsonObject_UpdateString $json "credit_card.card_number" "4788250000028291"
CkJsonObject_UpdateString $json "credit_card.exp_date" "1020"
CkJsonObject_UpdateString $json "credit_card.cvv" "123"
CkJsonObject_put_EmitCompact $json 0
puts [CkJsonObject_emit $json]

# 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]]
puts "hexHash = $hexHash"

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

# -----------------------------------------------------------
# Now that we have the value for the Authorization header, send the POST containing the JSON.

set http [new_CkHttp]

CkHttp_put_Accept $http "*/*"
CkHttp_put_UserAgent $http ""
CkHttp_SetRequestHeader $http "Authorization" [CkStringBuilder_getAsString $sbBase64Hash]
CkHttp_SetRequestHeader $http "apikey" $apiKey
CkHttp_SetRequestHeader $http "nonce" $nonce
CkHttp_SetRequestHeader $http "timestamp" $timestamp
CkHttp_SetRequestHeader $http "token" $token

CkHttp_put_SessionLogFilename $http "qa_output/payeezy.txt"

set url "https://api-cert.payeezy.com/v1/transactions"
set resp [new_CkHttpResponse]

set success [CkHttp_HttpJson $http "POST" $url $json "application/json" $resp]
if {$success == 0} then {
    puts [CkHttp_lastErrorText $http]
    delete_CkCrypt2 $crypt
    delete_CkPrng $prng
    delete_CkDateTime $dtNow
    delete_CkStringBuilder $sbTimestamp
    delete_CkJsonObject $json
    delete_CkStringBuilder $sbHmacData
    delete_CkStringBuilder $sbBase64Hash
    delete_CkHttp $http
    delete_CkHttpResponse $resp
    exit
}

puts "response status code = [CkHttpResponse_get_StatusCode $resp]"
CkJsonObject_Load $json [CkHttpResponse_bodyStr $resp]
puts [CkJsonObject_emit $json]

# Sample JSON response:

# {
#   "correlation_id": "228.4604632998994",
#   "transaction_status": "approved",
#   "validation_status": "success",
#   "transaction_type": "authorize",
#   "transaction_id": "ET175628",
#   "transaction_tag": "2313721985",
#   "method": "credit_card",
#   "amount": "1299",
#   "currency": "USD",
#   "cvv2": "M",
#   "token": {
#     "token_type": "FDToken",
#     "token_data": {
#       "value": "9732261336638291"
#     }
#   },
#   "card": {
#     "type": "visa",
#     "cardholder_name": "John Smith",
#     "card_number": "8291",
#     "exp_date": "1020"
#   },
#   "bank_resp_code": "100",
#   "bank_message": "Approved",
#   "gateway_resp_code": "00",
#   "gateway_message": "Transaction Normal"
# }
# 

puts [CkJsonObject_stringOf $json correlation_id]
puts [CkJsonObject_stringOf $json transaction_status]
puts [CkJsonObject_stringOf $json validation_status]
puts [CkJsonObject_stringOf $json transaction_type]
puts [CkJsonObject_stringOf $json transaction_id]
puts [CkJsonObject_stringOf $json transaction_tag]
puts [CkJsonObject_stringOf $json method]
puts [CkJsonObject_stringOf $json amount]
puts [CkJsonObject_stringOf $json currency]
puts [CkJsonObject_stringOf $json cvv2]
puts [CkJsonObject_stringOf $json token.token_type]
puts [CkJsonObject_stringOf $json token.token_data.value]
puts [CkJsonObject_stringOf $json card.type]
puts [CkJsonObject_stringOf $json card.cardholder_name]
puts [CkJsonObject_stringOf $json card.card_number]
puts [CkJsonObject_stringOf $json card.exp_date]
puts [CkJsonObject_stringOf $json bank_resp_code]
puts [CkJsonObject_stringOf $json bank_message]
puts [CkJsonObject_stringOf $json gateway_resp_code]
puts [CkJsonObject_stringOf $json gateway_message]

delete_CkCrypt2 $crypt
delete_CkPrng $prng
delete_CkDateTime $dtNow
delete_CkStringBuilder $sbTimestamp
delete_CkJsonObject $json
delete_CkStringBuilder $sbHmacData
delete_CkStringBuilder $sbBase64Hash
delete_CkHttp $http
delete_CkHttpResponse $resp