ec_talk_to_cybercash txn_attempted_type cc_argsWhat it does:
This procedure talks to CyberCash to do whatever transaction is specified, adds a row to the ec_cybercash_log table, and returns all of CyberCash's output in an ns_setDefined in: /web/philip/tcl/ecommerce-credit.tcl
Source code:
# Possible values of txn_attempted_type are listed below and
# in the data model (in the ec_cybercash_log table).
# cc_args should be an ns_set containing the key/value
# pairs to be sent to CyberCash, as follows:
#
# txn_attempted_type mandatory keys in cc_args
# ------------------ -------------------------
# mauthonly amount (containing currency & price),
# order-id, card-number, card-exp,
# [card-zip, card-country and
# card-name are optional]
# postauth amount (currency & price), order-id
# return amount (currency & price), order-id
# void txn-type (value should be marked or
# markret), order-id
# retry order-id, txn-type (value in auth,
# postauth, return, voidmark, voidreturn)
# query order-id, txn-type (value in auth, marked,
# settled, markret, setlret, voidmark,
# voidreturn)
#
# (September 5, 1999, eveander) When performing queries, the
# following sentence is no longer true as of sometime in 1999:
# "Note that this proc assumes we're querying by order-id and
# txn-type which means that only 0 or 1 relevant row will be
# returned." I'm still going to assume that we're querying by
# order-id and txn-type, but due to CyberCash's unannounced and
# undocumented changes in the results of the API call "query",
# any number of rows may be returned and they may or may not
# contain information about the specified transaction type. So
# I've had to fix ec_talk_to_cybercash to make it dig through all
# the irrelevant rows returned when querying. The output of
# ec_talk_to_cybercash will remain the same, so you don't need
# to change any code that uses this procedure.
#
# If you want to query by, say, order-id and txn-status, do not use
# this proc. You'll need to specially handle all the rows of data
# returned by CyberCash.
#
# This proc returns the info that CyberCash returns, except that
# variables are slightly renamed to stick with legal tcl variable
# names and our own naming conventions.
set currency [ad_parameter Currency ecommerce]
if { [ns_set get $cc_args "amount"] != "" } {
# This is to take care of cases where the tax table has output an
# amount that contains a fraction of a cent, which CyberCash
# dislikes
set smart_amount [ns_set get $cc_args "amount"]
regsub -all {[^0-9\.]} $smart_amount "" smart_amount
ns_set update $cc_args "amount" "$currency [format "%0.2f" $smart_amount]"
}
# This will hold what CyberCash outputs
set cc_output [ns_set new]
# This will hold what this proc (ec_talk_to_cybercash) outputs
set ttcc_output [ns_set new]
cc_send_to_server_21 "$txn_attempted_type" $cc_args $cc_output
# For non-queries, just grab the info in $cc_output and put
# it into $ttcc_output with the keys renamed (and also stick in
# txn_type, which isn't returned in non-queries; we want to
# insert the txn_type that *would* have been returned if it had
# been a query, for consistency). Note that some (many) of
# the values will be the empty string because no single
# transaction returns values for every key.
if { $txn_attempted_type != "query" } {
ns_set put $ttcc_output "txn_status" "[ns_set get $cc_output "MStatus"]"
ns_set put $ttcc_output "errloc" "[ns_set get $cc_output "MErrLoc"]"
ns_set put $ttcc_output "errmsg" "[ns_set get $cc_output "MErrMsg"]"
ns_set put $ttcc_output "merch_txn" "[ns_set get $cc_output "merch-txn"]"
ns_set put $ttcc_output "cust_txn" "[ns_set get $cc_output "cust-txn"]"
ns_set put $ttcc_output "aux_msg" "[ns_set get $cc_output "aux-msg"]"
ns_set put $ttcc_output "auth_code" "[ns_set get $cc_output "auth-code"]"
ns_set put $ttcc_output "action_code" "[ns_set get $cc_output "action-code"]"
ns_set put $ttcc_output "avs_code" "[ns_set get $cc_output "avs-code"]"
ns_set put $ttcc_output "ref_code" "[ns_set get $cc_output "ref-code"]"
# Figure out what to stick into txn_type
if { $txn_attempted_type == "mauthonly" } {
set txn_type "auth"
} elseif { $txn_attempted_type == "postauth" } {
set txn_type "postauth"
} elseif { $txn_attempted_type == "return" } {
set txn_type "markret"
} elseif { $txn_attempted_type == "void" && [ns_set get $cc_args "txn-type"] == "marked" } {
set txn_type "voidmark"
} elseif { $txn_attempted_type == "void" && [ns_set get $cc_args "txn-type"] == "markret" } {
set txn_type "voidreturn"
} elseif { $txn_attempted_type == "retry" && [ns_set get $cc_args "txn-type"] == "auth" } {
set txn_type "auth"
} elseif { $txn_attempted_type == "retry" && [ns_set get $cc_args "txn-type"] == "postauth" } {
set txn_type "marked"
} elseif { $txn_attempted_type == "retry" && [ns_set get $cc_args "txn-type"] == "return" } {
set txn_type "markret"
} elseif { $txn_attempted_type == "retry" && [ns_set get $cc_args "txn-type"] == "voidmark" } {
set txn_type "voidmark"
} elseif { $txn_attempted_type == "retry" && [ns_set get $cc_args "txn-type"] == "voidreturn" } {
set txn_type "voidreturn"
} else {
set txn_type "unknown"
}
ns_set put $ttcc_output "txn_type" $txn_type
} elseif { $txn_attempted_type == "query" } {
set cc_output_size [ns_set size $cc_output]
set relevant_cc_data ""
for {set i 0} {$i < $cc_output_size} {incr i} {
set one_row_of_cc_data [ns_set value $cc_output $i]
set cc_txn_type [ec_get_from_quasi_form $one_row_of_cc_data txn-type]
if { $cc_txn_type == [ns_set get $cc_args "txn-type"] } {
set relevant_cc_data $one_row_of_cc_data
}
}
if {![empty_string_p $relevant_cc_data]} {
# If it's a query, we have to do some regexping because
# ns_sets of non-ns_set key/value pairs are returned.
# It's the 2nd value of $cc_output that's of interest
# (no longer true as of September 5, 1999; see comment
# at top of this procedure; so we've set relevant_cc_data
# above).
# Note that the cc_time returned isn't a date as far
# as Oracle is concerned (it's a string, so you'll have
# to do a to_date('$cc_time','YYYYMMDDHH24MISS') when inserting).
ns_set put $ttcc_output "txn_type" [ec_get_from_quasi_form $relevant_cc_data txn-type]
ns_set put $ttcc_output "cust_txn" [ec_get_from_quasi_form $relevant_cc_data cust-txn]
ns_set put $ttcc_output "merch_txn" [ec_get_from_quasi_form $relevant_cc_data merch-txn]
ns_set put $ttcc_output "origin" [ec_get_from_quasi_form $relevant_cc_data origin]
ns_set put $ttcc_output "txn_status" [ec_get_from_quasi_form $relevant_cc_data txn-status]
# we have to handle date specially so as not to confuse Oracle with
# subsecond precision
regexp {time=([^.]*)\.} $relevant_cc_data garbage ugly_date
if { ![info exists ugly_date] } {
set ugly_date ""
}
ns_set put $ttcc_output "cc_time" $ugly_date
ns_set put $ttcc_output "auth_code" [ec_get_from_quasi_form $relevant_cc_data auth-code]
ns_set put $ttcc_output "action_code" [ec_get_from_quasi_form $relevant_cc_data action-code]
ns_set put $ttcc_output "avs_code" [ec_get_from_quasi_form $relevant_cc_data avs-code]
ns_set put $ttcc_output "ref_code" [ec_get_from_quasi_form $relevant_cc_data ref-code]
ns_set put $ttcc_output "batch_id" [ec_get_from_quasi_form $relevant_cc_data batch-id]
set long_amount [ec_get_from_quasi_form $relevant_cc_data amount]
regsub -all {[^0-9\.]} $long_amount "" numeric_amount
# regexp {^[ad_parameter Currency ecommerce] (.*)} $long_amount garbage numeric_amount
if { [info exists numeric_amount] } {
ns_set put $ttcc_output "amount" $numeric_amount
} else {
ns_set put $ttcc_output "amount" ""
}
}
}
# Add a row to cybercash_log
set db [ns_db gethandle subquery]
ns_db dml $db "insert into ec_cybercash_log
(transaction_id, txn_attempted_time, txn_attempted_type, txn_type, cc_time, merch_txn, cust_txn, origin, txn_status, errloc, errmsg, aux_msg, auth_code, action_code, avs_code, ref_code, batch_id, amount)
values
([ns_set get $cc_args "order-id"], sysdate, '[DoubleApos $txn_attempted_type]', '[DoubleApos [ns_set get $ttcc_output "txn_type"]]', to_date('[ns_set get $ttcc_output "cc_time"]','YYYYMMDDHH24MISS'), '[DoubleApos [ns_set get $ttcc_output "merch_txn"]]', '[DoubleApos [ns_set get $ttcc_output "cust_txn"]]', '[DoubleApos [ns_set get $ttcc_output "origin"]]', '[DoubleApos [ns_set get $ttcc_output "txn_status"]]', '[DoubleApos [ns_set get $ttcc_output "errloc"]]', '[DoubleApos [ns_set get $ttcc_output "errmsg"]]', '[DoubleApos [ns_set get $ttcc_output "aux_msg"]]', '[DoubleApos [ns_set get $ttcc_output "auth_code"]]', '[DoubleApos [ns_set get $ttcc_output "action_code"]]', '[DoubleApos [ns_set get $ttcc_output "avs_code"]]', '[DoubleApos [ns_set get $ttcc_output "ref_code"]]', '[DoubleApos [ns_set get $ttcc_output "batch_id"]]', '[DoubleApos [ns_set get $ttcc_output "amount"]]') "
ns_db releasehandle $db
# Finally, return the ns_set
return $ttcc_output