Sample code for 30+ languages & platforms
Lua

Global Payments Card Authorization

See more Global Payments Examples

Demonstrates how to send a card payments authorization request.

Chilkat Lua Downloads

Lua
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