Lua
Lua
Global Payments Card Authorization
See more Global Payments Examples
Demonstrates how to send a card payments authorization request.Chilkat Lua Downloads
local chilkat = require("chilkat")
-- This example requires the Chilkat API to have been previously unlocked.
-- See Global Unlock Sample for sample code.
local http = chilkat.Http.new()
-- if you don't have a Client ID yet you can still quickly test some basic request types using the following URL and credentials:
-- Test URL - https://test.realexpayments.com/epage-remote.cgi
-- Client ID: realexsandbox
-- Shared Secret: Po8lRRT67a
local testUrl = "https://test.realexpayments.com/epage-remote.cgi"
local clientID = "realexsandbox"
local sharedSecret = "Po8lRRT67a"
local amount = "1001"
local currency = "EUR"
local cardNumber = "4263970000005262"
-- We'll be sending the following XML in the body of the request:
-- <?xml version="1.0" encoding="UTF-8"?>
-- <request type="auth" timestamp="20180613141207">
-- <merchantid>MerchantId</merchantid>
-- <account>internet</account>
-- <channel>ECOM</channel>
-- <orderid>N6qsk4kYRZihmPrTXWYS6g</orderid>
-- <amount currency="EUR">1001</amount>
-- <card>
-- <number>4263970000005262</number>
-- <expdate>0425</expdate>
-- <chname>James Mason</chname>
-- <type>VISA</type>
-- <cvn>
-- <number>123</number>
-- <presind>1</presind>
-- </cvn>
-- </card>
-- <autosettle flag="1"/>
-- <sha1hash>87707637a34ba651b6185718c863abc64b673f20</sha1hash>
-- </request>
-- Use this online tool to generate code from sample XML:
-- Generate Code to Create XML
-- Get the current date/time in this format: 20180613141207
local dt = chilkat.DateTime.new()
dt:set_from_current_system_time()
local dtStr = dt:get_as_iso8601("YYYYMMDDhhmmss", true)
-- Generate a unique order ID
local prng = chilkat.Prng.new()
local orderId = prng:gen_random(32, "base64url")
-- Compute the sha1hash
local crypt = chilkat.Crypt2.new()
crypt.hash_algorithm = "sha1"
crypt.encoding_mode = "hexlower"
local sbA = chilkat.StringBuilder.new()
sbA:append("timestamp.merchantid.orderid.amount.currency.cardnumber")
local numReplaced = sbA:replace("timestamp", dtStr)
numReplaced = sbA:replace("merchantid", clientID)
numReplaced = sbA:replace("orderid", orderId)
numReplaced = sbA:replace("amount", amount)
numReplaced = sbA:replace("currency", currency)
numReplaced = sbA:replace("cardnumber", cardNumber)
local hashA = crypt:hash_string_enc(sbA:get_as_string())
local sbB = chilkat.StringBuilder.new()
sbB:append(hashA)
sbB:append(".")
sbB:append(sharedSecret)
local hashB = crypt:hash_string_enc(sbB:get_as_string())
local xml = chilkat.Xml.new()
xml.tag = "request"
xml:add_attribute("type", "auth")
xml:add_attribute("timestamp", dtStr)
xml:update_child_content("merchantid", clientID)
xml:update_child_content("account", "internet")
xml:update_child_content("channel", "ECOM")
xml:update_child_content("orderid", orderId)
xml:update_attr_at("amount", true, "currency", currency)
xml:update_child_content("amount", amount)
xml:update_child_content("card|number", cardNumber)
xml:update_child_content("card|expdate", "0425")
xml:update_child_content("card|chname", "James Mason")
xml:update_child_content("card|type", "VISA")
xml:update_child_content("card|cvn|number", "123")
xml:update_child_content("card|cvn|presind", "1")
xml:update_attr_at("autosettle", true, "flag", "1")
xml:update_child_content("sha1hash", hashB)
local resp = chilkat.HttpResponse.new()
local success = http:http_str("POST", testUrl, xml:get_xml(), "utf-8", "application/xml", resp)
if not success then
print(http.last_error_text)
return
end
print("Response Status Code: " .. resp.status_code)
print("Response Body:")
print(resp.body_str)
if resp.status_code ~= 200 then
print("Failed.")
return
end
-- A status code of 200 indicates we received an XML response, but it could be an error message.
-- Here's an example of an error response:
-- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-- <response timestamp="20200418142356">
-- <orderid>N6qsk4kYRZihmPrTXWYS6g</orderid>
-- <result>508</result>
-- <message>Invalid timestamp: '{' Value exceeds allowable limit: '}'</message>
-- </response>
-- We need to check the "result" within the XML.
xml:load_xml(resp.body_str)
local result = xml:get_child_int_value("result")
print("result = " .. result)
-- A successful result looks like this:
-- <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-- <response timestamp="20200418145519">
-- <merchantid>realexsandbox</merchantid>
-- <account>internet</account>
-- <orderid>Cw93I1nFWVZuaATh46qMUCBlCcfrOvLo65C2cq5X-AY</orderid>
-- <result>00</result>
-- <authcode>L3pHww</authcode>
-- <message>AUTH CODE: L3pHww</message>
-- <pasref>96838535689610806</pasref>
-- <cvnresult>M</cvnresult>
-- <timetaken>87</timetaken>
-- <authtimetaken>67</authtimetaken>
-- <batchid>6322506</batchid>
-- <sha1hash>2fd2f15f97f1775779fe9bda536dc8317a4b39f6</sha1hash>
-- </response>
if result == 0 then
print("authcode = " .. xml:get_child_content("authcode"))
print("Success.")
else
print("Failed.")
end